xref: /aosp_15_r20/external/skia/gm/texelsubset.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2014 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker // This test only works with the GPU backend.
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkCanvasPriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCanvas.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SkGr.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceDrawContext.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/effects/GrTextureEffect.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "tools/DecodeUtils.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/TestOps.h"
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
34*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker using MipmapMode = GrSamplerState::MipmapMode;
39*c8dee2aaSAndroid Build Coastguard Worker using Filter     = GrSamplerState::Filter;
40*c8dee2aaSAndroid Build Coastguard Worker using Wrap       = GrSamplerState::WrapMode;
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm {
43*c8dee2aaSAndroid Build Coastguard Worker /**
44*c8dee2aaSAndroid Build Coastguard Worker  * This GM directly exercises GrTextureEffect::MakeTexelSubset.
45*c8dee2aaSAndroid Build Coastguard Worker  */
46*c8dee2aaSAndroid Build Coastguard Worker class TexelSubset : public GpuGM {
47*c8dee2aaSAndroid Build Coastguard Worker public:
TexelSubset(Filter filter,MipmapMode mm,bool upscale)48*c8dee2aaSAndroid Build Coastguard Worker     TexelSubset(Filter filter, MipmapMode mm, bool upscale)
49*c8dee2aaSAndroid Build Coastguard Worker             : fFilter(filter), fMipmapMode(mm), fUpscale(upscale) {
50*c8dee2aaSAndroid Build Coastguard Worker         this->setBGColor(0xFFFFFFFF);
51*c8dee2aaSAndroid Build Coastguard Worker     }
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const54*c8dee2aaSAndroid Build Coastguard Worker     SkString getName() const override {
55*c8dee2aaSAndroid Build Coastguard Worker         SkString name("texel_subset");
56*c8dee2aaSAndroid Build Coastguard Worker         switch (fFilter) {
57*c8dee2aaSAndroid Build Coastguard Worker             case Filter::kNearest:
58*c8dee2aaSAndroid Build Coastguard Worker                 name.append("_nearest");
59*c8dee2aaSAndroid Build Coastguard Worker                 break;
60*c8dee2aaSAndroid Build Coastguard Worker             case Filter::kLinear:
61*c8dee2aaSAndroid Build Coastguard Worker                 name.append("_linear");
62*c8dee2aaSAndroid Build Coastguard Worker                 break;
63*c8dee2aaSAndroid Build Coastguard Worker         }
64*c8dee2aaSAndroid Build Coastguard Worker         switch (fMipmapMode) {
65*c8dee2aaSAndroid Build Coastguard Worker             case MipmapMode::kNone:
66*c8dee2aaSAndroid Build Coastguard Worker                 break;
67*c8dee2aaSAndroid Build Coastguard Worker             case MipmapMode::kNearest:
68*c8dee2aaSAndroid Build Coastguard Worker                 name.append("_mipmap_nearest");
69*c8dee2aaSAndroid Build Coastguard Worker                 break;
70*c8dee2aaSAndroid Build Coastguard Worker             case MipmapMode::kLinear:
71*c8dee2aaSAndroid Build Coastguard Worker                 name.append("_mipmap_linear");
72*c8dee2aaSAndroid Build Coastguard Worker                 break;
73*c8dee2aaSAndroid Build Coastguard Worker         }
74*c8dee2aaSAndroid Build Coastguard Worker         name.append(fUpscale ? "_up" : "_down");
75*c8dee2aaSAndroid Build Coastguard Worker         return name;
76*c8dee2aaSAndroid Build Coastguard Worker     }
77*c8dee2aaSAndroid Build Coastguard Worker 
getISize()78*c8dee2aaSAndroid Build Coastguard Worker     SkISize getISize() override {
79*c8dee2aaSAndroid Build Coastguard Worker         static constexpr int kN = GrSamplerState::kWrapModeCount;
80*c8dee2aaSAndroid Build Coastguard Worker         int w = kTestPad + 2*kN*(kImageSize.width()  + 2*kDrawPad + kTestPad);
81*c8dee2aaSAndroid Build Coastguard Worker         int h = kTestPad + 2*kN*(kImageSize.height() + 2*kDrawPad + kTestPad);
82*c8dee2aaSAndroid Build Coastguard Worker         return {w, h};
83*c8dee2aaSAndroid Build Coastguard Worker     }
84*c8dee2aaSAndroid Build Coastguard Worker 
onOnceBeforeDraw()85*c8dee2aaSAndroid Build Coastguard Worker     void onOnceBeforeDraw() override {
86*c8dee2aaSAndroid Build Coastguard Worker         SkAssertResult(ToolUtils::GetResourceAsBitmap("images/mandrill_128.png", &fBitmap));
87*c8dee2aaSAndroid Build Coastguard Worker         // Make the bitmap non-square to detect any width/height confusion.
88*c8dee2aaSAndroid Build Coastguard Worker         fBitmap.extractSubset(&fBitmap, SkIRect::MakeSize(fBitmap.dimensions()).makeInset(0, 20));
89*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fBitmap.dimensions() == kImageSize);
90*c8dee2aaSAndroid Build Coastguard Worker     }
91*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(GrRecordingContext * rContext,SkCanvas * canvas,SkString * errorMsg)92*c8dee2aaSAndroid Build Coastguard Worker     DrawResult onDraw(GrRecordingContext* rContext, SkCanvas* canvas, SkString* errorMsg) override {
93*c8dee2aaSAndroid Build Coastguard Worker         auto sdc = skgpu::ganesh::TopDeviceSurfaceDrawContext(canvas);
94*c8dee2aaSAndroid Build Coastguard Worker         if (!sdc) {
95*c8dee2aaSAndroid Build Coastguard Worker             *errorMsg = kErrorMsg_DrawSkippedGpuOnly;
96*c8dee2aaSAndroid Build Coastguard Worker             return DrawResult::kSkip;
97*c8dee2aaSAndroid Build Coastguard Worker         }
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Mipmapped mipmapped =
100*c8dee2aaSAndroid Build Coastguard Worker                 (fMipmapMode != MipmapMode::kNone) ? skgpu::Mipmapped::kYes : skgpu::Mipmapped::kNo;
101*c8dee2aaSAndroid Build Coastguard Worker         if (mipmapped == skgpu::Mipmapped::kYes && !rContext->priv().caps()->mipmapSupport()) {
102*c8dee2aaSAndroid Build Coastguard Worker             return DrawResult::kSkip;
103*c8dee2aaSAndroid Build Coastguard Worker         }
104*c8dee2aaSAndroid Build Coastguard Worker         auto view = std::get<0>(GrMakeCachedBitmapProxyView(
105*c8dee2aaSAndroid Build Coastguard Worker                 rContext, fBitmap, /*label=*/"DrawResult_Draw_BitMap", mipmapped));
106*c8dee2aaSAndroid Build Coastguard Worker         if (!view) {
107*c8dee2aaSAndroid Build Coastguard Worker             *errorMsg = "Failed to create proxy.";
108*c8dee2aaSAndroid Build Coastguard Worker             return DrawResult::kFail;
109*c8dee2aaSAndroid Build Coastguard Worker         }
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker         SkIRect texelSubset;
112*c8dee2aaSAndroid Build Coastguard Worker         // Use a smaller subset when upscaling so that wrap is hit on all sides of the rect we
113*c8dee2aaSAndroid Build Coastguard Worker         // will draw.
114*c8dee2aaSAndroid Build Coastguard Worker         if (fUpscale) {
115*c8dee2aaSAndroid Build Coastguard Worker             texelSubset = SkIRect::MakeXYWH(fBitmap.width()/3 - 1, 2*fBitmap.height()/5 - 1,
116*c8dee2aaSAndroid Build Coastguard Worker                                             fBitmap.width()/4 + 2,   fBitmap.height()/5 + 2);
117*c8dee2aaSAndroid Build Coastguard Worker         } else {
118*c8dee2aaSAndroid Build Coastguard Worker             texelSubset = SkIRect::MakeXYWH(  fBitmap.width()/8 - 1,   fBitmap.height()/7 - 1,
119*c8dee2aaSAndroid Build Coastguard Worker                                             3*fBitmap.width()/5 + 2, 4*fBitmap.height()/5 + 2);
120*c8dee2aaSAndroid Build Coastguard Worker         }
121*c8dee2aaSAndroid Build Coastguard Worker 
122*c8dee2aaSAndroid Build Coastguard Worker         TArray<SkMatrix> textureMatrices;
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker         SkRect a = SkRect::Make(texelSubset);
125*c8dee2aaSAndroid Build Coastguard Worker         SkRect b = fUpscale ? a.makeInset (.31f * a.width(), .31f * a.height())
126*c8dee2aaSAndroid Build Coastguard Worker                             : a.makeOutset(.25f * a.width(), .25f * a.height());
127*c8dee2aaSAndroid Build Coastguard Worker         textureMatrices.push_back() = SkMatrix::RectToRect(a, b);
128*c8dee2aaSAndroid Build Coastguard Worker 
129*c8dee2aaSAndroid Build Coastguard Worker         b = fUpscale ? a.makeInset (.25f * a.width(), .35f * a.height())
130*c8dee2aaSAndroid Build Coastguard Worker                      : a.makeOutset(.20f * a.width(), .35f * a.height());
131*c8dee2aaSAndroid Build Coastguard Worker         textureMatrices.push_back() = SkMatrix::RectToRect(a, b);
132*c8dee2aaSAndroid Build Coastguard Worker         textureMatrices.back().preRotate(45.f, a.centerX(), a.centerY());
133*c8dee2aaSAndroid Build Coastguard Worker         textureMatrices.back().postSkew(.05f, -.05f);
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker         SkBitmap subsetBmp;
136*c8dee2aaSAndroid Build Coastguard Worker         fBitmap.extractSubset(&subsetBmp, texelSubset);
137*c8dee2aaSAndroid Build Coastguard Worker         subsetBmp.setImmutable();
138*c8dee2aaSAndroid Build Coastguard Worker         auto subsetView = std::get<0>(GrMakeCachedBitmapProxyView(
139*c8dee2aaSAndroid Build Coastguard Worker                 rContext, subsetBmp, /*label=*/"DrawResult_Draw_SubsetBitMap", mipmapped));
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker         SkRect localRect = SkRect::Make(fBitmap.bounds()).makeOutset(kDrawPad, kDrawPad);
142*c8dee2aaSAndroid Build Coastguard Worker 
143*c8dee2aaSAndroid Build Coastguard Worker         auto size = this->getISize();
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker         SkScalar y = kDrawPad + kTestPad;
146*c8dee2aaSAndroid Build Coastguard Worker         SkRect drawRect;
147*c8dee2aaSAndroid Build Coastguard Worker         for (int tm = 0; tm < textureMatrices.size(); ++tm) {
148*c8dee2aaSAndroid Build Coastguard Worker             for (int my = 0; my < GrSamplerState::kWrapModeCount; ++my) {
149*c8dee2aaSAndroid Build Coastguard Worker                 SkScalar x = kDrawPad + kTestPad;
150*c8dee2aaSAndroid Build Coastguard Worker                 auto wmy = static_cast<Wrap>(my);
151*c8dee2aaSAndroid Build Coastguard Worker                 for (int mx = 0; mx < GrSamplerState::kWrapModeCount; ++mx) {
152*c8dee2aaSAndroid Build Coastguard Worker                     auto wmx = static_cast<Wrap>(mx);
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker                     const auto& caps = *rContext->priv().caps();
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker                     GrSamplerState sampler(wmx, wmy, fFilter, fMipmapMode);
157*c8dee2aaSAndroid Build Coastguard Worker 
158*c8dee2aaSAndroid Build Coastguard Worker                     drawRect = localRect.makeOffset(x, y);
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker                     std::unique_ptr<GrFragmentProcessor> fp1;
161*c8dee2aaSAndroid Build Coastguard Worker                     fp1 = GrTextureEffect::MakeSubset(view,
162*c8dee2aaSAndroid Build Coastguard Worker                                                       fBitmap.alphaType(),
163*c8dee2aaSAndroid Build Coastguard Worker                                                       textureMatrices[tm],
164*c8dee2aaSAndroid Build Coastguard Worker                                                       sampler,
165*c8dee2aaSAndroid Build Coastguard Worker                                                       SkRect::Make(texelSubset),
166*c8dee2aaSAndroid Build Coastguard Worker                                                       caps);
167*c8dee2aaSAndroid Build Coastguard Worker                     if (!fp1) {
168*c8dee2aaSAndroid Build Coastguard Worker                         continue;
169*c8dee2aaSAndroid Build Coastguard Worker                     }
170*c8dee2aaSAndroid Build Coastguard Worker 
171*c8dee2aaSAndroid Build Coastguard Worker                     // Throw a translate in the local matrix just to test having something other
172*c8dee2aaSAndroid Build Coastguard Worker                     // than identity. Compensate with an offset local rect.
173*c8dee2aaSAndroid Build Coastguard Worker                     static constexpr SkVector kT = {-100, 300};
174*c8dee2aaSAndroid Build Coastguard Worker                     if (auto op = sk_gpu_test::test_ops::MakeRect(rContext,
175*c8dee2aaSAndroid Build Coastguard Worker                                                                   std::move(fp1),
176*c8dee2aaSAndroid Build Coastguard Worker                                                                   drawRect,
177*c8dee2aaSAndroid Build Coastguard Worker                                                                   localRect.makeOffset(kT),
178*c8dee2aaSAndroid Build Coastguard Worker                                                                   SkMatrix::Translate(-kT))) {
179*c8dee2aaSAndroid Build Coastguard Worker                         sdc->addDrawOp(std::move(op));
180*c8dee2aaSAndroid Build Coastguard Worker                     }
181*c8dee2aaSAndroid Build Coastguard Worker 
182*c8dee2aaSAndroid Build Coastguard Worker                     x += localRect.width() + kTestPad;
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker                     // Now draw with a subsetted proxy using fixed function texture sampling
185*c8dee2aaSAndroid Build Coastguard Worker                     // rather than a texture subset as a comparison.
186*c8dee2aaSAndroid Build Coastguard Worker                     drawRect = localRect.makeOffset(x, y);
187*c8dee2aaSAndroid Build Coastguard Worker                     SkMatrix subsetTextureMatrix = SkMatrix::Concat(
188*c8dee2aaSAndroid Build Coastguard Worker                             SkMatrix::Translate(-texelSubset.topLeft()), textureMatrices[tm]);
189*c8dee2aaSAndroid Build Coastguard Worker 
190*c8dee2aaSAndroid Build Coastguard Worker                     auto fp2 = GrTextureEffect::Make(subsetView,
191*c8dee2aaSAndroid Build Coastguard Worker                                                      fBitmap.alphaType(),
192*c8dee2aaSAndroid Build Coastguard Worker                                                      subsetTextureMatrix,
193*c8dee2aaSAndroid Build Coastguard Worker                                                      sampler,
194*c8dee2aaSAndroid Build Coastguard Worker                                                      caps);
195*c8dee2aaSAndroid Build Coastguard Worker                     if (auto op = sk_gpu_test::test_ops::MakeRect(rContext, std::move(fp2),
196*c8dee2aaSAndroid Build Coastguard Worker                                                                   drawRect, localRect)) {
197*c8dee2aaSAndroid Build Coastguard Worker                         sdc->addDrawOp(std::move(op));
198*c8dee2aaSAndroid Build Coastguard Worker                     }
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker                     if (mx < GrSamplerState::kWrapModeCount - 1) {
201*c8dee2aaSAndroid Build Coastguard Worker                         SkScalar midX =
202*c8dee2aaSAndroid Build Coastguard Worker                                 SkScalarFloorToScalar(drawRect.right() + kTestPad/2.f) + 0.5f;
203*c8dee2aaSAndroid Build Coastguard Worker                         canvas->drawLine({midX, -1}, {midX, (float)size.fHeight+1}, {});
204*c8dee2aaSAndroid Build Coastguard Worker                     }
205*c8dee2aaSAndroid Build Coastguard Worker                     x += localRect.width() + kTestPad;
206*c8dee2aaSAndroid Build Coastguard Worker                 }
207*c8dee2aaSAndroid Build Coastguard Worker                 if (my < GrSamplerState::kWrapModeCount - 1) {
208*c8dee2aaSAndroid Build Coastguard Worker                     SkScalar midY = SkScalarFloorToScalar(drawRect.bottom() + kTestPad/2.f) + 0.5f;
209*c8dee2aaSAndroid Build Coastguard Worker                     canvas->drawLine({-1, midY}, {(float)size.fWidth+1, midY}, {});
210*c8dee2aaSAndroid Build Coastguard Worker                 }
211*c8dee2aaSAndroid Build Coastguard Worker                 y += localRect.height() + kTestPad;
212*c8dee2aaSAndroid Build Coastguard Worker             }
213*c8dee2aaSAndroid Build Coastguard Worker             if (tm < textureMatrices.size() - 1) {
214*c8dee2aaSAndroid Build Coastguard Worker                 SkPaint paint;
215*c8dee2aaSAndroid Build Coastguard Worker                 paint.setColor(SK_ColorRED);
216*c8dee2aaSAndroid Build Coastguard Worker                 SkScalar midY = SkScalarFloorToScalar(drawRect.bottom() + kTestPad/2.f) + 0.5f;
217*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawLine({-1, midY}, {(float)size.fWidth + 1, midY}, paint);
218*c8dee2aaSAndroid Build Coastguard Worker             }
219*c8dee2aaSAndroid Build Coastguard Worker         }
220*c8dee2aaSAndroid Build Coastguard Worker         return DrawResult::kOk;
221*c8dee2aaSAndroid Build Coastguard Worker     }
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker private:
224*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr SkISize kImageSize = {128, 88};
225*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr SkScalar kDrawPad = 10.f;
226*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr SkScalar kTestPad = 10.f;
227*c8dee2aaSAndroid Build Coastguard Worker     SkBitmap fBitmap;
228*c8dee2aaSAndroid Build Coastguard Worker     Filter fFilter;
229*c8dee2aaSAndroid Build Coastguard Worker     MipmapMode fMipmapMode;
230*c8dee2aaSAndroid Build Coastguard Worker     bool fUpscale;
231*c8dee2aaSAndroid Build Coastguard Worker 
232*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GM;
233*c8dee2aaSAndroid Build Coastguard Worker };
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kNearest, MipmapMode::kNone   , false);)
236*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kNearest, MipmapMode::kNone   , true );)
237*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kLinear , MipmapMode::kNone   , false);)
238*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kLinear , MipmapMode::kNone   , true );)
239*c8dee2aaSAndroid Build Coastguard Worker // It doesn't make sense to have upscaling MIP map.
240*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kNearest, MipmapMode::kNearest, false);)
241*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kLinear , MipmapMode::kNearest, false);)
242*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kNearest, MipmapMode::kLinear , false);)
243*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new TexelSubset(Filter::kLinear , MipmapMode::kLinear , false);)
244*c8dee2aaSAndroid Build Coastguard Worker 
245*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skiagm
246