1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h" 10cb93a386Sopenharmony_ci#include "include/gpu/GrRecordingContext.h" 11cb93a386Sopenharmony_ci#include "src/core/SkAutoPixmapStorage.h" 12cb93a386Sopenharmony_ci#include "src/core/SkCompressedDataUtils.h" 13cb93a386Sopenharmony_ci#include "src/core/SkMipmap.h" 14cb93a386Sopenharmony_ci#include "src/core/SkPaintPriv.h" 15cb93a386Sopenharmony_ci#include "src/gpu/GrBackendUtils.h" 16cb93a386Sopenharmony_ci#include "src/gpu/GrDirectContextPriv.h" 17cb93a386Sopenharmony_ci#include "src/image/SkImage_Base.h" 18cb93a386Sopenharmony_ci#include "tests/Test.h" 19cb93a386Sopenharmony_ci#include "tests/TestUtils.h" 20cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci// Just verify that 'actual' is entirely 'expected' 23cb93a386Sopenharmony_cistatic void check_solid_pixmap(skiatest::Reporter* reporter, 24cb93a386Sopenharmony_ci const SkColor4f& expected, const SkPixmap& actual, 25cb93a386Sopenharmony_ci const char* label0, const char* label1, const char* label2) { 26cb93a386Sopenharmony_ci const float tols[4] = { 0.01f, 0.01f, 0.01f, 0.01f }; 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci auto error = std::function<ComparePixmapsErrorReporter>( 29cb93a386Sopenharmony_ci [reporter, label0, label1, label2](int x, int y, const float diffs[4]) { 30cb93a386Sopenharmony_ci SkASSERT(x >= 0 && y >= 0); 31cb93a386Sopenharmony_ci ERRORF(reporter, "%s %s %s - mismatch at %d, %d (%f, %f, %f %f)", 32cb93a386Sopenharmony_ci label0, label1, label2, x, y, 33cb93a386Sopenharmony_ci diffs[0], diffs[1], diffs[2], diffs[3]); 34cb93a386Sopenharmony_ci }); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci CheckSolidPixels(expected, actual, tols, error); 37cb93a386Sopenharmony_ci} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci// Create an SkImage to wrap 'backendTex' 40cb93a386Sopenharmony_cisk_sp<SkImage> create_image(GrDirectContext* dContext, const GrBackendTexture& backendTex) { 41cb93a386Sopenharmony_ci SkImage::CompressionType compression = 42cb93a386Sopenharmony_ci GrBackendFormatToCompressionType(backendTex.getBackendFormat()); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci SkAlphaType at = SkCompressionTypeIsOpaque(compression) ? kOpaque_SkAlphaType 45cb93a386Sopenharmony_ci : kPremul_SkAlphaType; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci return SkImage::MakeFromCompressedTexture(dContext, 48cb93a386Sopenharmony_ci backendTex, 49cb93a386Sopenharmony_ci kTopLeft_GrSurfaceOrigin, 50cb93a386Sopenharmony_ci at, 51cb93a386Sopenharmony_ci nullptr); 52cb93a386Sopenharmony_ci} 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci// Draw the compressed backend texture (wrapped in an SkImage) into an RGBA surface, attempting 55cb93a386Sopenharmony_ci// to access all the mipMap levels. 56cb93a386Sopenharmony_cistatic void check_compressed_mipmaps(GrRecordingContext* rContext, sk_sp<SkImage> img, 57cb93a386Sopenharmony_ci SkImage::CompressionType compressionType, 58cb93a386Sopenharmony_ci const SkColor4f expectedColors[6], 59cb93a386Sopenharmony_ci GrMipmapped mipMapped, 60cb93a386Sopenharmony_ci skiatest::Reporter* reporter, const char* label) { 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci SkImageInfo readbackSurfaceII = SkImageInfo::Make(32, 32, kRGBA_8888_SkColorType, 63cb93a386Sopenharmony_ci kPremul_SkAlphaType); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci sk_sp<SkSurface> surf = SkSurface::MakeRenderTarget(rContext, 66cb93a386Sopenharmony_ci SkBudgeted::kNo, 67cb93a386Sopenharmony_ci readbackSurfaceII, 1, 68cb93a386Sopenharmony_ci kTopLeft_GrSurfaceOrigin, 69cb93a386Sopenharmony_ci nullptr); 70cb93a386Sopenharmony_ci if (!surf) { 71cb93a386Sopenharmony_ci return; 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci SkCanvas* canvas = surf->getCanvas(); 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci const SkSamplingOptions sampling(SkFilterMode::kLinear, 77cb93a386Sopenharmony_ci SkMipmapMode::kLinear); 78cb93a386Sopenharmony_ci SkPaint p; 79cb93a386Sopenharmony_ci p.setBlendMode(SkBlendMode::kSrc); 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci int numMipLevels = 1; 82cb93a386Sopenharmony_ci if (mipMapped == GrMipmapped::kYes) { 83cb93a386Sopenharmony_ci numMipLevels = SkMipmap::ComputeLevelCount(32, 32)+1; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci for (int i = 0, rectSize = 32; i < numMipLevels; ++i, rectSize /= 2) { 87cb93a386Sopenharmony_ci SkASSERT(rectSize >= 1); 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci canvas->clear(SK_ColorTRANSPARENT); 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci SkRect r = SkRect::MakeWH(rectSize, rectSize); 92cb93a386Sopenharmony_ci canvas->drawImageRect(img, r, sampling, &p); 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci SkImageInfo readbackII = SkImageInfo::Make(rectSize, rectSize, 95cb93a386Sopenharmony_ci kRGBA_8888_SkColorType, 96cb93a386Sopenharmony_ci kUnpremul_SkAlphaType); 97cb93a386Sopenharmony_ci SkAutoPixmapStorage actual2; 98cb93a386Sopenharmony_ci SkAssertResult(actual2.tryAlloc(readbackII)); 99cb93a386Sopenharmony_ci actual2.erase(SkColors::kTransparent); 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci bool result = surf->readPixels(actual2, 0, 0); 102cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, result); 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci SkString str; 105cb93a386Sopenharmony_ci str.appendf("mip-level %d", i); 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci check_solid_pixmap(reporter, expectedColors[i], actual2, 108cb93a386Sopenharmony_ci GrCompressionTypeToStr(compressionType), label, str.c_str()); 109cb93a386Sopenharmony_ci } 110cb93a386Sopenharmony_ci} 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci// Verify that we can readback from a compressed texture 113cb93a386Sopenharmony_cistatic void check_readback(GrDirectContext* dContext, sk_sp<SkImage> img, 114cb93a386Sopenharmony_ci SkImage::CompressionType compressionType, 115cb93a386Sopenharmony_ci const SkColor4f& expectedColor, 116cb93a386Sopenharmony_ci skiatest::Reporter* reporter, const char* label) { 117cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS 118cb93a386Sopenharmony_ci // reading back ETC2 is broken on Metal/iOS (skbug.com/9839) 119cb93a386Sopenharmony_ci if (dContext->backend() == GrBackendApi::kMetal) { 120cb93a386Sopenharmony_ci return; 121cb93a386Sopenharmony_ci } 122cb93a386Sopenharmony_ci#endif 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_ci SkAutoPixmapStorage actual; 125cb93a386Sopenharmony_ci 126cb93a386Sopenharmony_ci SkImageInfo readBackII = SkImageInfo::Make(img->width(), img->height(), 127cb93a386Sopenharmony_ci kRGBA_8888_SkColorType, 128cb93a386Sopenharmony_ci kUnpremul_SkAlphaType); 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci SkAssertResult(actual.tryAlloc(readBackII)); 131cb93a386Sopenharmony_ci actual.erase(SkColors::kTransparent); 132cb93a386Sopenharmony_ci 133cb93a386Sopenharmony_ci bool result = img->readPixels(dContext, actual, 0, 0); 134cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, result); 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ci check_solid_pixmap(reporter, expectedColor, actual, 137cb93a386Sopenharmony_ci GrCompressionTypeToStr(compressionType), label, ""); 138cb93a386Sopenharmony_ci} 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci// Test initialization of compressed GrBackendTextures to a specific color 141cb93a386Sopenharmony_cistatic void test_compressed_color_init(GrDirectContext* dContext, 142cb93a386Sopenharmony_ci skiatest::Reporter* reporter, 143cb93a386Sopenharmony_ci std::function<GrBackendTexture (GrDirectContext*, 144cb93a386Sopenharmony_ci const SkColor4f&, 145cb93a386Sopenharmony_ci GrMipmapped)> create, 146cb93a386Sopenharmony_ci const SkColor4f& color, 147cb93a386Sopenharmony_ci SkImage::CompressionType compression, 148cb93a386Sopenharmony_ci GrMipmapped mipMapped) { 149cb93a386Sopenharmony_ci GrBackendTexture backendTex = create(dContext, color, mipMapped); 150cb93a386Sopenharmony_ci if (!backendTex.isValid()) { 151cb93a386Sopenharmony_ci return; 152cb93a386Sopenharmony_ci } 153cb93a386Sopenharmony_ci 154cb93a386Sopenharmony_ci sk_sp<SkImage> img = create_image(dContext, backendTex); 155cb93a386Sopenharmony_ci if (!img) { 156cb93a386Sopenharmony_ci return; 157cb93a386Sopenharmony_ci } 158cb93a386Sopenharmony_ci 159cb93a386Sopenharmony_ci SkColor4f expectedColors[6] = { color, color, color, color, color, color }; 160cb93a386Sopenharmony_ci 161cb93a386Sopenharmony_ci check_compressed_mipmaps(dContext, img, compression, expectedColors, mipMapped, 162cb93a386Sopenharmony_ci reporter, "colorinit"); 163cb93a386Sopenharmony_ci check_readback(dContext, img, compression, color, reporter, "solid readback"); 164cb93a386Sopenharmony_ci 165cb93a386Sopenharmony_ci SkColor4f newColor; 166cb93a386Sopenharmony_ci newColor.fR = color.fB; 167cb93a386Sopenharmony_ci newColor.fG = color.fR; 168cb93a386Sopenharmony_ci newColor.fB = color.fG; 169cb93a386Sopenharmony_ci newColor.fA = color.fA; 170cb93a386Sopenharmony_ci 171cb93a386Sopenharmony_ci bool result = dContext->updateCompressedBackendTexture(backendTex, newColor, nullptr, nullptr); 172cb93a386Sopenharmony_ci // Since we were able to create the compressed texture we should be able to update it. 173cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, result); 174cb93a386Sopenharmony_ci 175cb93a386Sopenharmony_ci SkColor4f expectedNewColors[6] = {newColor, newColor, newColor, newColor, newColor, newColor}; 176cb93a386Sopenharmony_ci 177cb93a386Sopenharmony_ci check_compressed_mipmaps(dContext, img, compression, expectedNewColors, mipMapped, reporter, 178cb93a386Sopenharmony_ci "colorinit"); 179cb93a386Sopenharmony_ci check_readback(dContext, std::move(img), compression, newColor, reporter, "solid readback"); 180cb93a386Sopenharmony_ci 181cb93a386Sopenharmony_ci dContext->deleteBackendTexture(backendTex); 182cb93a386Sopenharmony_ci} 183cb93a386Sopenharmony_ci 184cb93a386Sopenharmony_ci// Create compressed data pulling the color for each mipmap level from 'levelColors'. 185cb93a386Sopenharmony_cistatic std::unique_ptr<const char[]> make_compressed_data(SkImage::CompressionType compression, 186cb93a386Sopenharmony_ci SkColor4f levelColors[6], 187cb93a386Sopenharmony_ci GrMipmapped mipMapped) { 188cb93a386Sopenharmony_ci SkISize dimensions { 32, 32 }; 189cb93a386Sopenharmony_ci 190cb93a386Sopenharmony_ci int numMipLevels = 1; 191cb93a386Sopenharmony_ci if (mipMapped == GrMipmapped::kYes) { 192cb93a386Sopenharmony_ci numMipLevels = SkMipmap::ComputeLevelCount(dimensions.width(), dimensions.height()) + 1; 193cb93a386Sopenharmony_ci } 194cb93a386Sopenharmony_ci 195cb93a386Sopenharmony_ci SkTArray<size_t> mipMapOffsets(numMipLevels); 196cb93a386Sopenharmony_ci 197cb93a386Sopenharmony_ci size_t dataSize = SkCompressedDataSize(compression, dimensions, &mipMapOffsets, 198cb93a386Sopenharmony_ci mipMapped == GrMipmapped::kYes); 199cb93a386Sopenharmony_ci char* data = new char[dataSize]; 200cb93a386Sopenharmony_ci 201cb93a386Sopenharmony_ci for (int level = 0; level < numMipLevels; ++level) { 202cb93a386Sopenharmony_ci // We have to do this a level at a time bc we might have a different color for 203cb93a386Sopenharmony_ci // each level 204cb93a386Sopenharmony_ci GrFillInCompressedData(compression, dimensions, 205cb93a386Sopenharmony_ci GrMipmapped::kNo, &data[mipMapOffsets[level]], levelColors[level]); 206cb93a386Sopenharmony_ci 207cb93a386Sopenharmony_ci dimensions = {std::max(1, dimensions.width() /2), std::max(1, dimensions.height()/2)}; 208cb93a386Sopenharmony_ci } 209cb93a386Sopenharmony_ci 210cb93a386Sopenharmony_ci return std::unique_ptr<const char[]>(data); 211cb93a386Sopenharmony_ci} 212cb93a386Sopenharmony_ci 213cb93a386Sopenharmony_ci// Verify that we can initialize a compressed backend texture with data (esp. 214cb93a386Sopenharmony_ci// the mipmap levels). 215cb93a386Sopenharmony_cistatic void test_compressed_data_init(GrDirectContext* dContext, 216cb93a386Sopenharmony_ci skiatest::Reporter* reporter, 217cb93a386Sopenharmony_ci std::function<GrBackendTexture (GrDirectContext*, 218cb93a386Sopenharmony_ci const char* data, 219cb93a386Sopenharmony_ci size_t dataSize, 220cb93a386Sopenharmony_ci GrMipmapped)> create, 221cb93a386Sopenharmony_ci SkImage::CompressionType compression, 222cb93a386Sopenharmony_ci GrMipmapped mipMapped) { 223cb93a386Sopenharmony_ci 224cb93a386Sopenharmony_ci SkColor4f expectedColors[6] = { 225cb93a386Sopenharmony_ci { 1.0f, 0.0f, 0.0f, 1.0f }, // R 226cb93a386Sopenharmony_ci { 0.0f, 1.0f, 0.0f, 1.0f }, // G 227cb93a386Sopenharmony_ci { 0.0f, 0.0f, 1.0f, 1.0f }, // B 228cb93a386Sopenharmony_ci { 0.0f, 1.0f, 1.0f, 1.0f }, // C 229cb93a386Sopenharmony_ci { 1.0f, 0.0f, 1.0f, 1.0f }, // M 230cb93a386Sopenharmony_ci { 1.0f, 1.0f, 0.0f, 1.0f }, // Y 231cb93a386Sopenharmony_ci }; 232cb93a386Sopenharmony_ci 233cb93a386Sopenharmony_ci std::unique_ptr<const char[]> data(make_compressed_data(compression, expectedColors, 234cb93a386Sopenharmony_ci mipMapped)); 235cb93a386Sopenharmony_ci size_t dataSize = SkCompressedDataSize(compression, { 32, 32 }, nullptr, 236cb93a386Sopenharmony_ci mipMapped == GrMipmapped::kYes); 237cb93a386Sopenharmony_ci 238cb93a386Sopenharmony_ci GrBackendTexture backendTex = create(dContext, data.get(), dataSize, mipMapped); 239cb93a386Sopenharmony_ci if (!backendTex.isValid()) { 240cb93a386Sopenharmony_ci return; 241cb93a386Sopenharmony_ci } 242cb93a386Sopenharmony_ci 243cb93a386Sopenharmony_ci sk_sp<SkImage> img = create_image(dContext, backendTex); 244cb93a386Sopenharmony_ci if (!img) { 245cb93a386Sopenharmony_ci return; 246cb93a386Sopenharmony_ci } 247cb93a386Sopenharmony_ci 248cb93a386Sopenharmony_ci check_compressed_mipmaps(dContext, img, compression, expectedColors, 249cb93a386Sopenharmony_ci mipMapped, reporter, "pixmap"); 250cb93a386Sopenharmony_ci check_readback(dContext, img, compression, expectedColors[0], reporter, "data readback"); 251cb93a386Sopenharmony_ci 252cb93a386Sopenharmony_ci SkColor4f expectedColorsNew[6] = { 253cb93a386Sopenharmony_ci {1.0f, 1.0f, 0.0f, 1.0f}, // Y 254cb93a386Sopenharmony_ci {1.0f, 0.0f, 0.0f, 1.0f}, // R 255cb93a386Sopenharmony_ci {0.0f, 1.0f, 0.0f, 1.0f}, // G 256cb93a386Sopenharmony_ci {0.0f, 0.0f, 1.0f, 1.0f}, // B 257cb93a386Sopenharmony_ci {0.0f, 1.0f, 1.0f, 1.0f}, // C 258cb93a386Sopenharmony_ci {1.0f, 0.0f, 1.0f, 1.0f}, // M 259cb93a386Sopenharmony_ci }; 260cb93a386Sopenharmony_ci 261cb93a386Sopenharmony_ci std::unique_ptr<const char[]> dataNew( 262cb93a386Sopenharmony_ci make_compressed_data(compression, expectedColorsNew, mipMapped)); 263cb93a386Sopenharmony_ci size_t dataNewSize = 264cb93a386Sopenharmony_ci SkCompressedDataSize(compression, {32, 32}, nullptr, mipMapped == GrMipMapped::kYes); 265cb93a386Sopenharmony_ci 266cb93a386Sopenharmony_ci bool result = dContext->updateCompressedBackendTexture(backendTex, dataNew.get(), dataNewSize, 267cb93a386Sopenharmony_ci nullptr, nullptr); 268cb93a386Sopenharmony_ci // Since we were able to create the compressed texture we should be able to update it. 269cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, result); 270cb93a386Sopenharmony_ci 271cb93a386Sopenharmony_ci check_compressed_mipmaps(dContext, img, compression, expectedColorsNew, mipMapped, reporter, 272cb93a386Sopenharmony_ci "pixmap"); 273cb93a386Sopenharmony_ci check_readback(dContext, std::move(img), compression, expectedColorsNew[0], reporter, 274cb93a386Sopenharmony_ci "data readback"); 275cb93a386Sopenharmony_ci 276cb93a386Sopenharmony_ci dContext->deleteBackendTexture(backendTex); 277cb93a386Sopenharmony_ci} 278cb93a386Sopenharmony_ci 279cb93a386Sopenharmony_ciDEF_GPUTEST_FOR_RENDERING_CONTEXTS(CompressedBackendAllocationTest, reporter, ctxInfo) { 280cb93a386Sopenharmony_ci auto dContext = ctxInfo.directContext(); 281cb93a386Sopenharmony_ci const GrCaps* caps = dContext->priv().caps(); 282cb93a386Sopenharmony_ci 283cb93a386Sopenharmony_ci struct { 284cb93a386Sopenharmony_ci SkImage::CompressionType fCompression; 285cb93a386Sopenharmony_ci SkColor4f fColor; 286cb93a386Sopenharmony_ci } combinations[] = { 287cb93a386Sopenharmony_ci { SkImage::CompressionType::kETC2_RGB8_UNORM, SkColors::kRed }, 288cb93a386Sopenharmony_ci { SkImage::CompressionType::kBC1_RGB8_UNORM, SkColors::kBlue }, 289cb93a386Sopenharmony_ci { SkImage::CompressionType::kBC1_RGBA8_UNORM, SkColors::kTransparent }, 290cb93a386Sopenharmony_ci }; 291cb93a386Sopenharmony_ci 292cb93a386Sopenharmony_ci for (auto combo : combinations) { 293cb93a386Sopenharmony_ci GrBackendFormat format = dContext->compressedBackendFormat(combo.fCompression); 294cb93a386Sopenharmony_ci if (!format.isValid()) { 295cb93a386Sopenharmony_ci continue; 296cb93a386Sopenharmony_ci } 297cb93a386Sopenharmony_ci 298cb93a386Sopenharmony_ci if (!caps->isFormatTexturable(format, GrTextureType::k2D)) { 299cb93a386Sopenharmony_ci continue; 300cb93a386Sopenharmony_ci } 301cb93a386Sopenharmony_ci 302cb93a386Sopenharmony_ci for (auto mipMapped : { GrMipmapped::kNo, GrMipmapped::kYes }) { 303cb93a386Sopenharmony_ci if (GrMipmapped::kYes == mipMapped && !caps->mipmapSupport()) { 304cb93a386Sopenharmony_ci continue; 305cb93a386Sopenharmony_ci } 306cb93a386Sopenharmony_ci 307cb93a386Sopenharmony_ci // color initialized 308cb93a386Sopenharmony_ci { 309cb93a386Sopenharmony_ci auto createWithColorMtd = [format](GrDirectContext* dContext, 310cb93a386Sopenharmony_ci const SkColor4f& color, 311cb93a386Sopenharmony_ci GrMipmapped mipMapped) { 312cb93a386Sopenharmony_ci return dContext->createCompressedBackendTexture(32, 32, format, color, 313cb93a386Sopenharmony_ci mipMapped, GrProtected::kNo); 314cb93a386Sopenharmony_ci }; 315cb93a386Sopenharmony_ci 316cb93a386Sopenharmony_ci test_compressed_color_init(dContext, reporter, createWithColorMtd, 317cb93a386Sopenharmony_ci combo.fColor, combo.fCompression, mipMapped); 318cb93a386Sopenharmony_ci } 319cb93a386Sopenharmony_ci 320cb93a386Sopenharmony_ci // data initialized 321cb93a386Sopenharmony_ci { 322cb93a386Sopenharmony_ci auto createWithDataMtd = [format](GrDirectContext* dContext, 323cb93a386Sopenharmony_ci const char* data, size_t dataSize, 324cb93a386Sopenharmony_ci GrMipmapped mipMapped) { 325cb93a386Sopenharmony_ci return dContext->createCompressedBackendTexture(32, 32, format, data, dataSize, 326cb93a386Sopenharmony_ci mipMapped, GrProtected::kNo); 327cb93a386Sopenharmony_ci }; 328cb93a386Sopenharmony_ci 329cb93a386Sopenharmony_ci test_compressed_data_init(dContext, reporter, createWithDataMtd, 330cb93a386Sopenharmony_ci combo.fCompression, mipMapped); 331cb93a386Sopenharmony_ci } 332cb93a386Sopenharmony_ci 333cb93a386Sopenharmony_ci } 334cb93a386Sopenharmony_ci } 335cb93a386Sopenharmony_ci} 336