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