xref: /aosp_15_r20/external/skia/tests/GrSurfaceTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2013 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 #include "include/core/SkAlphaType.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorType.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextureCompressionType.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkAutoPixmapStorage.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkCompressedDataUtils.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/DataUtils.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBackendUtils.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDataUtils.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
40*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
41*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageInfo.h"
42*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
43*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
44*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceCache.h"
45*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceProvider.h"
46*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
47*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
48*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
49*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
50*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
51*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxy.h"
52*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrUtil.h"
53*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SkGr.h"
54*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceContext.h"
55*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/TestFormatColorTypeCombination.h"
56*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
57*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
58*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ContextType.h"
59*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ManagedBackendTexture.h"
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
62*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
63*c8dee2aaSAndroid Build Coastguard Worker #include <initializer_list>
64*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
65*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
66*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
67*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker // Tests that GrSurface::asTexture(), GrSurface::asRenderTarget(), and static upcasting of texture
70*c8dee2aaSAndroid Build Coastguard Worker // and render targets to GrSurface all work as expected.
DEF_GANESH_TEST_FOR_MOCK_CONTEXT(GrSurface,reporter,ctxInfo)71*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_MOCK_CONTEXT(GrSurface, reporter, ctxInfo) {
72*c8dee2aaSAndroid Build Coastguard Worker     auto context = ctxInfo.directContext();
73*c8dee2aaSAndroid Build Coastguard Worker     auto resourceProvider = context->priv().resourceProvider();
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker     static constexpr SkISize kDesc = {256, 256};
76*c8dee2aaSAndroid Build Coastguard Worker     auto format = context->priv().caps()->getDefaultBackendFormat(GrColorType::kRGBA_8888,
77*c8dee2aaSAndroid Build Coastguard Worker                                                                   GrRenderable::kYes);
78*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrSurface> texRT1 = resourceProvider->createTexture(kDesc,
79*c8dee2aaSAndroid Build Coastguard Worker                                                               format,
80*c8dee2aaSAndroid Build Coastguard Worker                                                               GrTextureType::k2D,
81*c8dee2aaSAndroid Build Coastguard Worker                                                               GrRenderable::kYes,
82*c8dee2aaSAndroid Build Coastguard Worker                                                               1,
83*c8dee2aaSAndroid Build Coastguard Worker                                                               skgpu::Mipmapped::kNo,
84*c8dee2aaSAndroid Build Coastguard Worker                                                               skgpu::Budgeted::kNo,
85*c8dee2aaSAndroid Build Coastguard Worker                                                               GrProtected::kNo,
86*c8dee2aaSAndroid Build Coastguard Worker                                                               /*label=*/{});
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asRenderTarget());
89*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asTexture());
90*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
91*c8dee2aaSAndroid Build Coastguard Worker                     texRT1->asTexture());
92*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texRT1->asRenderTarget() ==
93*c8dee2aaSAndroid Build Coastguard Worker                     static_cast<GrSurface*>(texRT1->asTexture()));
94*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
95*c8dee2aaSAndroid Build Coastguard Worker                     static_cast<GrSurface*>(texRT1->asTexture()));
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> tex1 = resourceProvider->createTexture(kDesc,
98*c8dee2aaSAndroid Build Coastguard Worker                                                             format,
99*c8dee2aaSAndroid Build Coastguard Worker                                                             GrTextureType::k2D,
100*c8dee2aaSAndroid Build Coastguard Worker                                                             GrRenderable::kNo,
101*c8dee2aaSAndroid Build Coastguard Worker                                                             1,
102*c8dee2aaSAndroid Build Coastguard Worker                                                             skgpu::Mipmapped::kNo,
103*c8dee2aaSAndroid Build Coastguard Worker                                                             skgpu::Budgeted::kNo,
104*c8dee2aaSAndroid Build Coastguard Worker                                                             GrProtected::kNo,
105*c8dee2aaSAndroid Build Coastguard Worker                                                             /*label=*/{});
106*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, nullptr == tex1->asRenderTarget());
107*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, tex1.get() == tex1->asTexture());
108*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, static_cast<GrSurface*>(tex1.get()) == tex1->asTexture());
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture backendTex = context->createBackendTexture(256,
111*c8dee2aaSAndroid Build Coastguard Worker                                                                 256,
112*c8dee2aaSAndroid Build Coastguard Worker                                                                 kRGBA_8888_SkColorType,
113*c8dee2aaSAndroid Build Coastguard Worker                                                                 SkColors::kTransparent,
114*c8dee2aaSAndroid Build Coastguard Worker                                                                 skgpu::Mipmapped::kNo,
115*c8dee2aaSAndroid Build Coastguard Worker                                                                 GrRenderable::kNo,
116*c8dee2aaSAndroid Build Coastguard Worker                                                                 GrProtected::kNo);
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrSurface> texRT2 = resourceProvider->wrapRenderableBackendTexture(
119*c8dee2aaSAndroid Build Coastguard Worker             backendTex, 1, kBorrow_GrWrapOwnership, GrWrapCacheable::kNo);
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asRenderTarget());
122*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asTexture());
123*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
124*c8dee2aaSAndroid Build Coastguard Worker                     texRT2->asTexture());
125*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texRT2->asRenderTarget() ==
126*c8dee2aaSAndroid Build Coastguard Worker                     static_cast<GrSurface*>(texRT2->asTexture()));
127*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
128*c8dee2aaSAndroid Build Coastguard Worker                     static_cast<GrSurface*>(texRT2->asTexture()));
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker     context->deleteBackendTexture(backendTex);
131*c8dee2aaSAndroid Build Coastguard Worker }
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker // This test checks that the isFormatTexturable and isFormatRenderable are
134*c8dee2aaSAndroid Build Coastguard Worker // consistent with createTexture's result.
DEF_GANESH_TEST_FOR_ALL_CONTEXTS(GrSurfaceRenderability,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)135*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_ALL_CONTEXTS(GrSurfaceRenderability,
136*c8dee2aaSAndroid Build Coastguard Worker                                  reporter,
137*c8dee2aaSAndroid Build Coastguard Worker                                  ctxInfo,
138*c8dee2aaSAndroid Build Coastguard Worker                                  CtsEnforcement::kApiLevel_T) {
139*c8dee2aaSAndroid Build Coastguard Worker     auto context = ctxInfo.directContext();
140*c8dee2aaSAndroid Build Coastguard Worker     GrProxyProvider* proxyProvider = context->priv().proxyProvider();
141*c8dee2aaSAndroid Build Coastguard Worker     GrResourceProvider* resourceProvider = context->priv().resourceProvider();
142*c8dee2aaSAndroid Build Coastguard Worker     const GrCaps* caps = context->priv().caps();
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Should only need format here but need to determine compression type from format
145*c8dee2aaSAndroid Build Coastguard Worker     // without config.
146*c8dee2aaSAndroid Build Coastguard Worker     auto createTexture = [](SkISize dimensions, GrColorType colorType,
147*c8dee2aaSAndroid Build Coastguard Worker                             const GrBackendFormat& format, GrRenderable renderable,
148*c8dee2aaSAndroid Build Coastguard Worker                             GrResourceProvider* rp) -> sk_sp<GrTexture> {
149*c8dee2aaSAndroid Build Coastguard Worker         SkTextureCompressionType compression = GrBackendFormatToCompressionType(format);
150*c8dee2aaSAndroid Build Coastguard Worker         if (compression != SkTextureCompressionType::kNone) {
151*c8dee2aaSAndroid Build Coastguard Worker             if (renderable == GrRenderable::kYes) {
152*c8dee2aaSAndroid Build Coastguard Worker                 return nullptr;
153*c8dee2aaSAndroid Build Coastguard Worker             }
154*c8dee2aaSAndroid Build Coastguard Worker             auto size = SkCompressedDataSize(compression, dimensions, nullptr, false);
155*c8dee2aaSAndroid Build Coastguard Worker             auto data = SkData::MakeUninitialized(size);
156*c8dee2aaSAndroid Build Coastguard Worker             SkColor4f color = {0, 0, 0, 0};
157*c8dee2aaSAndroid Build Coastguard Worker             skgpu::FillInCompressedData(compression,
158*c8dee2aaSAndroid Build Coastguard Worker                                         dimensions,
159*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::Mipmapped::kNo,
160*c8dee2aaSAndroid Build Coastguard Worker                                         (char*)data->writable_data(),
161*c8dee2aaSAndroid Build Coastguard Worker                                         color);
162*c8dee2aaSAndroid Build Coastguard Worker             return rp->createCompressedTexture(dimensions,
163*c8dee2aaSAndroid Build Coastguard Worker                                                format,
164*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Budgeted::kNo,
165*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Mipmapped::kNo,
166*c8dee2aaSAndroid Build Coastguard Worker                                                GrProtected::kNo,
167*c8dee2aaSAndroid Build Coastguard Worker                                                data.get(),
168*c8dee2aaSAndroid Build Coastguard Worker                                                /*label=*/{});
169*c8dee2aaSAndroid Build Coastguard Worker         } else {
170*c8dee2aaSAndroid Build Coastguard Worker             return rp->createTexture(dimensions,
171*c8dee2aaSAndroid Build Coastguard Worker                                      format,
172*c8dee2aaSAndroid Build Coastguard Worker                                      GrTextureType::k2D,
173*c8dee2aaSAndroid Build Coastguard Worker                                      renderable,
174*c8dee2aaSAndroid Build Coastguard Worker                                      1,
175*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Mipmapped::kNo,
176*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Budgeted::kNo,
177*c8dee2aaSAndroid Build Coastguard Worker                                      GrProtected::kNo,
178*c8dee2aaSAndroid Build Coastguard Worker                                      /*label=*/{});
179*c8dee2aaSAndroid Build Coastguard Worker         }
180*c8dee2aaSAndroid Build Coastguard Worker     };
181*c8dee2aaSAndroid Build Coastguard Worker 
182*c8dee2aaSAndroid Build Coastguard Worker     static constexpr SkISize kDims = {64, 64};
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker     const std::vector<GrTest::TestFormatColorTypeCombination>& combos =
185*c8dee2aaSAndroid Build Coastguard Worker             caps->getTestingCombinations();
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker     for (const GrTest::TestFormatColorTypeCombination& combo : combos) {
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(combo.fColorType != GrColorType::kUnknown);
190*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(combo.fFormat.isValid());
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker         // Right now Vulkan has two backend formats that support ABGR_4444 (R4G4B4A4 and B4G4R4A4).
193*c8dee2aaSAndroid Build Coastguard Worker         // Until we can create textures directly from the backend format this yields some
194*c8dee2aaSAndroid Build Coastguard Worker         // ambiguity in what is actually supported and which textures can be created.
195*c8dee2aaSAndroid Build Coastguard Worker         if (ctxInfo.backend() == kVulkan_GrBackend && combo.fColorType == GrColorType::kABGR_4444) {
196*c8dee2aaSAndroid Build Coastguard Worker             continue;
197*c8dee2aaSAndroid Build Coastguard Worker         }
198*c8dee2aaSAndroid Build Coastguard Worker 
199*c8dee2aaSAndroid Build Coastguard Worker         // Check if 'isFormatTexturable' agrees with 'createTexture' and that the mipmap
200*c8dee2aaSAndroid Build Coastguard Worker         // support check is working
201*c8dee2aaSAndroid Build Coastguard Worker         {
202*c8dee2aaSAndroid Build Coastguard Worker             bool isCompressed = caps->isFormatCompressed(combo.fFormat);
203*c8dee2aaSAndroid Build Coastguard Worker             bool isTexturable = caps->isFormatTexturable(combo.fFormat, GrTextureType::k2D);
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<GrSurface> tex = createTexture(kDims, combo.fColorType, combo.fFormat,
206*c8dee2aaSAndroid Build Coastguard Worker                                                  GrRenderable::kNo, resourceProvider);
207*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, SkToBool(tex) == isTexturable,
208*c8dee2aaSAndroid Build Coastguard Worker                             "ct:%s format:%s, tex:%d, isTexturable:%d",
209*c8dee2aaSAndroid Build Coastguard Worker                             GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
210*c8dee2aaSAndroid Build Coastguard Worker                             SkToBool(tex), isTexturable);
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker             // Check that the lack of mipmap support blocks the creation of mipmapped
213*c8dee2aaSAndroid Build Coastguard Worker             // proxies
214*c8dee2aaSAndroid Build Coastguard Worker             bool expectedMipMapability = isTexturable && caps->mipmapSupport() && !isCompressed;
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(combo.fFormat,
217*c8dee2aaSAndroid Build Coastguard Worker                                                                      kDims,
218*c8dee2aaSAndroid Build Coastguard Worker                                                                      GrRenderable::kNo,
219*c8dee2aaSAndroid Build Coastguard Worker                                                                      1,
220*c8dee2aaSAndroid Build Coastguard Worker                                                                      skgpu::Mipmapped::kYes,
221*c8dee2aaSAndroid Build Coastguard Worker                                                                      SkBackingFit::kExact,
222*c8dee2aaSAndroid Build Coastguard Worker                                                                      skgpu::Budgeted::kNo,
223*c8dee2aaSAndroid Build Coastguard Worker                                                                      GrProtected::kNo,
224*c8dee2aaSAndroid Build Coastguard Worker                                                                      /*label=*/{});
225*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, SkToBool(proxy.get()) == expectedMipMapability,
226*c8dee2aaSAndroid Build Coastguard Worker                             "ct:%s format:%s, tex:%d, expectedMipMapability:%d",
227*c8dee2aaSAndroid Build Coastguard Worker                             GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
228*c8dee2aaSAndroid Build Coastguard Worker                             SkToBool(proxy.get()), expectedMipMapability);
229*c8dee2aaSAndroid Build Coastguard Worker         }
230*c8dee2aaSAndroid Build Coastguard Worker 
231*c8dee2aaSAndroid Build Coastguard Worker         // Check if 'isFormatAsColorTypeRenderable' agrees with 'createTexture' (w/o MSAA)
232*c8dee2aaSAndroid Build Coastguard Worker         {
233*c8dee2aaSAndroid Build Coastguard Worker             bool isRenderable = caps->isFormatRenderable(combo.fFormat, 1);
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<GrSurface> tex = resourceProvider->createTexture(kDims,
236*c8dee2aaSAndroid Build Coastguard Worker                                                                    combo.fFormat,
237*c8dee2aaSAndroid Build Coastguard Worker                                                                    GrTextureType::k2D,
238*c8dee2aaSAndroid Build Coastguard Worker                                                                    GrRenderable::kYes,
239*c8dee2aaSAndroid Build Coastguard Worker                                                                    1,
240*c8dee2aaSAndroid Build Coastguard Worker                                                                    skgpu::Mipmapped::kNo,
241*c8dee2aaSAndroid Build Coastguard Worker                                                                    skgpu::Budgeted::kNo,
242*c8dee2aaSAndroid Build Coastguard Worker                                                                    GrProtected::kNo,
243*c8dee2aaSAndroid Build Coastguard Worker                                                                    /*label=*/{});
244*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
245*c8dee2aaSAndroid Build Coastguard Worker                             "ct:%s format:%s, tex:%d, isRenderable:%d",
246*c8dee2aaSAndroid Build Coastguard Worker                             GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
247*c8dee2aaSAndroid Build Coastguard Worker                             SkToBool(tex), isRenderable);
248*c8dee2aaSAndroid Build Coastguard Worker         }
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker         // Check if 'isFormatAsColorTypeRenderable' agrees with 'createTexture' w/ MSAA
251*c8dee2aaSAndroid Build Coastguard Worker         {
252*c8dee2aaSAndroid Build Coastguard Worker             bool isRenderable = caps->isFormatRenderable(combo.fFormat, 2);
253*c8dee2aaSAndroid Build Coastguard Worker 
254*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<GrSurface> tex = resourceProvider->createTexture(kDims,
255*c8dee2aaSAndroid Build Coastguard Worker                                                                    combo.fFormat,
256*c8dee2aaSAndroid Build Coastguard Worker                                                                    GrTextureType::k2D,
257*c8dee2aaSAndroid Build Coastguard Worker                                                                    GrRenderable::kYes,
258*c8dee2aaSAndroid Build Coastguard Worker                                                                    2,
259*c8dee2aaSAndroid Build Coastguard Worker                                                                    skgpu::Mipmapped::kNo,
260*c8dee2aaSAndroid Build Coastguard Worker                                                                    skgpu::Budgeted::kNo,
261*c8dee2aaSAndroid Build Coastguard Worker                                                                    GrProtected::kNo,
262*c8dee2aaSAndroid Build Coastguard Worker                                                                    /*label=*/{});
263*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
264*c8dee2aaSAndroid Build Coastguard Worker                             "ct:%s format:%s, tex:%d, isRenderable:%d",
265*c8dee2aaSAndroid Build Coastguard Worker                             GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
266*c8dee2aaSAndroid Build Coastguard Worker                             SkToBool(tex), isRenderable);
267*c8dee2aaSAndroid Build Coastguard Worker         }
268*c8dee2aaSAndroid Build Coastguard Worker     }
269*c8dee2aaSAndroid Build Coastguard Worker }
270*c8dee2aaSAndroid Build Coastguard Worker 
271*c8dee2aaSAndroid Build Coastguard Worker // For each context, set it to always clear the textures and then run through all the
272*c8dee2aaSAndroid Build Coastguard Worker // supported formats checking that the textures are actually cleared
DEF_GANESH_TEST(InitialTextureClear,reporter,baseOptions,CtsEnforcement::kApiLevel_T)273*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(InitialTextureClear, reporter, baseOptions, CtsEnforcement::kApiLevel_T) {
274*c8dee2aaSAndroid Build Coastguard Worker     GrContextOptions options = baseOptions;
275*c8dee2aaSAndroid Build Coastguard Worker     options.fClearAllTextures = true;
276*c8dee2aaSAndroid Build Coastguard Worker 
277*c8dee2aaSAndroid Build Coastguard Worker     static constexpr int kSize = 100;
278*c8dee2aaSAndroid Build Coastguard Worker     static constexpr SkColor kClearColor = 0xABABABAB;
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker     const SkImageInfo imageInfo = SkImageInfo::Make(kSize, kSize, kRGBA_8888_SkColorType,
281*c8dee2aaSAndroid Build Coastguard Worker                                                     kPremul_SkAlphaType);
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker     SkAutoPixmapStorage readback;
284*c8dee2aaSAndroid Build Coastguard Worker     readback.alloc(imageInfo);
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker     SkISize desc;
287*c8dee2aaSAndroid Build Coastguard Worker     desc.fWidth = desc.fHeight = kSize;
288*c8dee2aaSAndroid Build Coastguard Worker 
289*c8dee2aaSAndroid Build Coastguard Worker     for (int ct = 0; ct < skgpu::kContextTypeCount; ++ct) {
290*c8dee2aaSAndroid Build Coastguard Worker         sk_gpu_test::GrContextFactory factory(options);
291*c8dee2aaSAndroid Build Coastguard Worker         auto contextType = static_cast<skgpu::ContextType>(ct);
292*c8dee2aaSAndroid Build Coastguard Worker         if (!skgpu::IsRenderingContext(contextType)) {
293*c8dee2aaSAndroid Build Coastguard Worker             continue;
294*c8dee2aaSAndroid Build Coastguard Worker         }
295*c8dee2aaSAndroid Build Coastguard Worker         auto dContext = factory.get(contextType);
296*c8dee2aaSAndroid Build Coastguard Worker         if (!dContext) {
297*c8dee2aaSAndroid Build Coastguard Worker             continue;
298*c8dee2aaSAndroid Build Coastguard Worker         }
299*c8dee2aaSAndroid Build Coastguard Worker 
300*c8dee2aaSAndroid Build Coastguard Worker         GrProxyProvider* proxyProvider = dContext->priv().proxyProvider();
301*c8dee2aaSAndroid Build Coastguard Worker         const GrCaps* caps = dContext->priv().caps();
302*c8dee2aaSAndroid Build Coastguard Worker 
303*c8dee2aaSAndroid Build Coastguard Worker         const std::vector<GrTest::TestFormatColorTypeCombination>& combos =
304*c8dee2aaSAndroid Build Coastguard Worker                 caps->getTestingCombinations();
305*c8dee2aaSAndroid Build Coastguard Worker 
306*c8dee2aaSAndroid Build Coastguard Worker         for (const GrTest::TestFormatColorTypeCombination& combo : combos) {
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(combo.fColorType != GrColorType::kUnknown);
309*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(combo.fFormat.isValid());
310*c8dee2aaSAndroid Build Coastguard Worker 
311*c8dee2aaSAndroid Build Coastguard Worker             if (!caps->isFormatTexturable(combo.fFormat, GrTextureType::k2D)) {
312*c8dee2aaSAndroid Build Coastguard Worker                 continue;
313*c8dee2aaSAndroid Build Coastguard Worker             }
314*c8dee2aaSAndroid Build Coastguard Worker 
315*c8dee2aaSAndroid Build Coastguard Worker             auto checkColor = [reporter](const GrTest::TestFormatColorTypeCombination& combo,
316*c8dee2aaSAndroid Build Coastguard Worker                                          uint32_t readColor) {
317*c8dee2aaSAndroid Build Coastguard Worker                 // We expect that if there is no alpha in the src color type and we read it to a
318*c8dee2aaSAndroid Build Coastguard Worker                 // color type with alpha that we will get one for alpha rather than zero. We used to
319*c8dee2aaSAndroid Build Coastguard Worker                 // require this but the Intel Iris 6100 on Win 10 test bot doesn't put one in the
320*c8dee2aaSAndroid Build Coastguard Worker                 // alpha channel when reading back from GL_RG16 or GL_RG16F. So now we allow either.
321*c8dee2aaSAndroid Build Coastguard Worker                 uint32_t channels = GrColorTypeChannelFlags(combo.fColorType);
322*c8dee2aaSAndroid Build Coastguard Worker                 bool allowAlphaOne = !(channels & kAlpha_SkColorChannelFlag);
323*c8dee2aaSAndroid Build Coastguard Worker                 if (allowAlphaOne) {
324*c8dee2aaSAndroid Build Coastguard Worker                     if (readColor != 0x00000000 && readColor != 0xFF000000) {
325*c8dee2aaSAndroid Build Coastguard Worker                         ERRORF(reporter,
326*c8dee2aaSAndroid Build Coastguard Worker                                "Failed on ct %s format %s 0x%08x is not 0x00000000 or 0xFF000000",
327*c8dee2aaSAndroid Build Coastguard Worker                                GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
328*c8dee2aaSAndroid Build Coastguard Worker                                readColor);
329*c8dee2aaSAndroid Build Coastguard Worker                         return false;
330*c8dee2aaSAndroid Build Coastguard Worker                     }
331*c8dee2aaSAndroid Build Coastguard Worker                 } else {
332*c8dee2aaSAndroid Build Coastguard Worker                     if (readColor) {
333*c8dee2aaSAndroid Build Coastguard Worker                         ERRORF(reporter, "Failed on ct %s format %s 0x%08x != 0x00000000",
334*c8dee2aaSAndroid Build Coastguard Worker                                GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
335*c8dee2aaSAndroid Build Coastguard Worker                                readColor);
336*c8dee2aaSAndroid Build Coastguard Worker                         return false;
337*c8dee2aaSAndroid Build Coastguard Worker                     }
338*c8dee2aaSAndroid Build Coastguard Worker                 }
339*c8dee2aaSAndroid Build Coastguard Worker                 return true;
340*c8dee2aaSAndroid Build Coastguard Worker             };
341*c8dee2aaSAndroid Build Coastguard Worker 
342*c8dee2aaSAndroid Build Coastguard Worker             for (auto renderable : {GrRenderable::kNo, GrRenderable::kYes}) {
343*c8dee2aaSAndroid Build Coastguard Worker                 if (renderable == GrRenderable::kYes &&
344*c8dee2aaSAndroid Build Coastguard Worker                     !caps->isFormatAsColorTypeRenderable(combo.fColorType, combo.fFormat)) {
345*c8dee2aaSAndroid Build Coastguard Worker                     continue;
346*c8dee2aaSAndroid Build Coastguard Worker                 }
347*c8dee2aaSAndroid Build Coastguard Worker 
348*c8dee2aaSAndroid Build Coastguard Worker                 for (auto fit : {SkBackingFit::kApprox, SkBackingFit::kExact}) {
349*c8dee2aaSAndroid Build Coastguard Worker 
350*c8dee2aaSAndroid Build Coastguard Worker                     // Does directly allocating a texture clear it?
351*c8dee2aaSAndroid Build Coastguard Worker                     {
352*c8dee2aaSAndroid Build Coastguard Worker                         auto proxy = proxyProvider->testingOnly_createInstantiatedProxy(
353*c8dee2aaSAndroid Build Coastguard Worker                                 {kSize, kSize},
354*c8dee2aaSAndroid Build Coastguard Worker                                 combo.fFormat,
355*c8dee2aaSAndroid Build Coastguard Worker                                 renderable,
356*c8dee2aaSAndroid Build Coastguard Worker                                 1,
357*c8dee2aaSAndroid Build Coastguard Worker                                 fit,
358*c8dee2aaSAndroid Build Coastguard Worker                                 skgpu::Budgeted::kYes,
359*c8dee2aaSAndroid Build Coastguard Worker                                 GrProtected::kNo);
360*c8dee2aaSAndroid Build Coastguard Worker                         if (proxy) {
361*c8dee2aaSAndroid Build Coastguard Worker                             skgpu::Swizzle swizzle = caps->getReadSwizzle(combo.fFormat,
362*c8dee2aaSAndroid Build Coastguard Worker                                                                           combo.fColorType);
363*c8dee2aaSAndroid Build Coastguard Worker                             GrSurfaceProxyView view(std::move(proxy), kTopLeft_GrSurfaceOrigin,
364*c8dee2aaSAndroid Build Coastguard Worker                                                     swizzle);
365*c8dee2aaSAndroid Build Coastguard Worker                             GrColorInfo info(combo.fColorType, kPremul_SkAlphaType, nullptr);
366*c8dee2aaSAndroid Build Coastguard Worker                             auto texCtx = dContext->priv().makeSC(std::move(view), info);
367*c8dee2aaSAndroid Build Coastguard Worker 
368*c8dee2aaSAndroid Build Coastguard Worker                             readback.erase(kClearColor);
369*c8dee2aaSAndroid Build Coastguard Worker                             if (texCtx->readPixels(dContext, readback, {0, 0})) {
370*c8dee2aaSAndroid Build Coastguard Worker                                 for (int i = 0; i < kSize * kSize; ++i) {
371*c8dee2aaSAndroid Build Coastguard Worker                                     if (!checkColor(combo, readback.addr32()[i])) {
372*c8dee2aaSAndroid Build Coastguard Worker                                         break;
373*c8dee2aaSAndroid Build Coastguard Worker                                     }
374*c8dee2aaSAndroid Build Coastguard Worker                                 }
375*c8dee2aaSAndroid Build Coastguard Worker                             }
376*c8dee2aaSAndroid Build Coastguard Worker                         }
377*c8dee2aaSAndroid Build Coastguard Worker 
378*c8dee2aaSAndroid Build Coastguard Worker                         dContext->priv().getResourceCache()->purgeUnlockedResources(
379*c8dee2aaSAndroid Build Coastguard Worker                                 GrPurgeResourceOptions::kAllResources);
380*c8dee2aaSAndroid Build Coastguard Worker                     }
381*c8dee2aaSAndroid Build Coastguard Worker 
382*c8dee2aaSAndroid Build Coastguard Worker                     // Try creating the texture as a deferred proxy.
383*c8dee2aaSAndroid Build Coastguard Worker                     {
384*c8dee2aaSAndroid Build Coastguard Worker                         GrImageInfo info(combo.fColorType,
385*c8dee2aaSAndroid Build Coastguard Worker                                          GrColorTypeHasAlpha(combo.fColorType)
386*c8dee2aaSAndroid Build Coastguard Worker                                                                             ? kPremul_SkAlphaType
387*c8dee2aaSAndroid Build Coastguard Worker                                                                             : kOpaque_SkAlphaType,
388*c8dee2aaSAndroid Build Coastguard Worker                                          nullptr,
389*c8dee2aaSAndroid Build Coastguard Worker                                          {desc.fHeight, desc.fHeight});
390*c8dee2aaSAndroid Build Coastguard Worker 
391*c8dee2aaSAndroid Build Coastguard Worker                         auto sc = dContext->priv().makeSC(info,
392*c8dee2aaSAndroid Build Coastguard Worker                                                           combo.fFormat,
393*c8dee2aaSAndroid Build Coastguard Worker                                                           /*label=*/{},
394*c8dee2aaSAndroid Build Coastguard Worker                                                           fit,
395*c8dee2aaSAndroid Build Coastguard Worker                                                           kTopLeft_GrSurfaceOrigin,
396*c8dee2aaSAndroid Build Coastguard Worker                                                           renderable);
397*c8dee2aaSAndroid Build Coastguard Worker                         if (!sc) {
398*c8dee2aaSAndroid Build Coastguard Worker                             continue;
399*c8dee2aaSAndroid Build Coastguard Worker                         }
400*c8dee2aaSAndroid Build Coastguard Worker 
401*c8dee2aaSAndroid Build Coastguard Worker                         readback.erase(kClearColor);
402*c8dee2aaSAndroid Build Coastguard Worker                         if (sc->readPixels(dContext, readback, {0, 0})) {
403*c8dee2aaSAndroid Build Coastguard Worker                             for (int i = 0; i < kSize * kSize; ++i) {
404*c8dee2aaSAndroid Build Coastguard Worker                                 if (!checkColor(combo, readback.addr32()[i])) {
405*c8dee2aaSAndroid Build Coastguard Worker                                     break;
406*c8dee2aaSAndroid Build Coastguard Worker                                 }
407*c8dee2aaSAndroid Build Coastguard Worker                             }
408*c8dee2aaSAndroid Build Coastguard Worker                         }
409*c8dee2aaSAndroid Build Coastguard Worker                         dContext->priv().getResourceCache()->purgeUnlockedResources(
410*c8dee2aaSAndroid Build Coastguard Worker                                 GrPurgeResourceOptions::kAllResources);
411*c8dee2aaSAndroid Build Coastguard Worker                     }
412*c8dee2aaSAndroid Build Coastguard Worker                 }
413*c8dee2aaSAndroid Build Coastguard Worker             }
414*c8dee2aaSAndroid Build Coastguard Worker         }
415*c8dee2aaSAndroid Build Coastguard Worker     }
416*c8dee2aaSAndroid Build Coastguard Worker }
417*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(ReadOnlyTexture,reporter,context_info,CtsEnforcement::kApiLevel_T)418*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(ReadOnlyTexture,
419*c8dee2aaSAndroid Build Coastguard Worker                                        reporter,
420*c8dee2aaSAndroid Build Coastguard Worker                                        context_info,
421*c8dee2aaSAndroid Build Coastguard Worker                                        CtsEnforcement::kApiLevel_T) {
422*c8dee2aaSAndroid Build Coastguard Worker     using namespace skgpu;
423*c8dee2aaSAndroid Build Coastguard Worker 
424*c8dee2aaSAndroid Build Coastguard Worker     auto fillPixels = [](SkPixmap* p, const std::function<uint32_t(int x, int y)>& f) {
425*c8dee2aaSAndroid Build Coastguard Worker         for (int y = 0; y < p->height(); ++y) {
426*c8dee2aaSAndroid Build Coastguard Worker             for (int x = 0; x < p->width(); ++x) {
427*c8dee2aaSAndroid Build Coastguard Worker                 *p->writable_addr32(x, y) = f(x, y);
428*c8dee2aaSAndroid Build Coastguard Worker             }
429*c8dee2aaSAndroid Build Coastguard Worker         }
430*c8dee2aaSAndroid Build Coastguard Worker     };
431*c8dee2aaSAndroid Build Coastguard Worker 
432*c8dee2aaSAndroid Build Coastguard Worker     auto comparePixels = [](const SkPixmap& p1, const SkPixmap& p2, skiatest::Reporter* reporter) {
433*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(p1.info() == p2.info());
434*c8dee2aaSAndroid Build Coastguard Worker         for (int y = 0; y < p1.height(); ++y) {
435*c8dee2aaSAndroid Build Coastguard Worker             for (int x = 0; x < p1.width(); ++x) {
436*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(reporter, p1.getColor(x, y) == p2.getColor(x, y));
437*c8dee2aaSAndroid Build Coastguard Worker                 if (p1.getColor(x, y) != p2.getColor(x, y)) {
438*c8dee2aaSAndroid Build Coastguard Worker                     return;
439*c8dee2aaSAndroid Build Coastguard Worker                 }
440*c8dee2aaSAndroid Build Coastguard Worker             }
441*c8dee2aaSAndroid Build Coastguard Worker         }
442*c8dee2aaSAndroid Build Coastguard Worker     };
443*c8dee2aaSAndroid Build Coastguard Worker 
444*c8dee2aaSAndroid Build Coastguard Worker     static constexpr int kSize = 100;
445*c8dee2aaSAndroid Build Coastguard Worker     SkImageInfo ii = SkImageInfo::Make(kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
446*c8dee2aaSAndroid Build Coastguard Worker     SkAutoPixmapStorage srcPixmap;
447*c8dee2aaSAndroid Build Coastguard Worker     srcPixmap.alloc(ii);
448*c8dee2aaSAndroid Build Coastguard Worker     fillPixels(&srcPixmap,
449*c8dee2aaSAndroid Build Coastguard Worker                [](int x, int y) {
450*c8dee2aaSAndroid Build Coastguard Worker                     return (0xFFU << 24) | (x << 16) | (y << 8) | uint8_t((x * y) & 0xFF);
451*c8dee2aaSAndroid Build Coastguard Worker                });
452*c8dee2aaSAndroid Build Coastguard Worker 
453*c8dee2aaSAndroid Build Coastguard Worker     auto dContext = context_info.directContext();
454*c8dee2aaSAndroid Build Coastguard Worker     GrProxyProvider* proxyProvider = dContext->priv().proxyProvider();
455*c8dee2aaSAndroid Build Coastguard Worker 
456*c8dee2aaSAndroid Build Coastguard Worker     Protected isProtected = Protected(dContext->priv().caps()->supportsProtectedContent());
457*c8dee2aaSAndroid Build Coastguard Worker 
458*c8dee2aaSAndroid Build Coastguard Worker     // We test both kRW in addition to kRead mostly to ensure that the calls are structured such
459*c8dee2aaSAndroid Build Coastguard Worker     // that they'd succeed if the texture wasn't kRead. We want to be sure we're failing with
460*c8dee2aaSAndroid Build Coastguard Worker     // kRead for the right reason.
461*c8dee2aaSAndroid Build Coastguard Worker     for (auto ioType : {kRead_GrIOType, kRW_GrIOType}) {
462*c8dee2aaSAndroid Build Coastguard Worker         auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithData(dContext,
463*c8dee2aaSAndroid Build Coastguard Worker                                                                      srcPixmap,
464*c8dee2aaSAndroid Build Coastguard Worker                                                                      kTopLeft_GrSurfaceOrigin,
465*c8dee2aaSAndroid Build Coastguard Worker                                                                      GrRenderable::kNo,
466*c8dee2aaSAndroid Build Coastguard Worker                                                                      isProtected);
467*c8dee2aaSAndroid Build Coastguard Worker         if (!mbet) {
468*c8dee2aaSAndroid Build Coastguard Worker             ERRORF(reporter, "Could not make texture.");
469*c8dee2aaSAndroid Build Coastguard Worker             return;
470*c8dee2aaSAndroid Build Coastguard Worker         }
471*c8dee2aaSAndroid Build Coastguard Worker         auto proxy = proxyProvider->wrapBackendTexture(mbet->texture(), kBorrow_GrWrapOwnership,
472*c8dee2aaSAndroid Build Coastguard Worker                                                        GrWrapCacheable::kNo, ioType,
473*c8dee2aaSAndroid Build Coastguard Worker                                                        mbet->refCountedCallback());
474*c8dee2aaSAndroid Build Coastguard Worker         Swizzle swizzle = dContext->priv().caps()->getReadSwizzle(proxy->backendFormat(),
475*c8dee2aaSAndroid Build Coastguard Worker                                                                   GrColorType::kRGBA_8888);
476*c8dee2aaSAndroid Build Coastguard Worker         GrSurfaceProxyView view(proxy, kTopLeft_GrSurfaceOrigin, swizzle);
477*c8dee2aaSAndroid Build Coastguard Worker         auto surfContext = dContext->priv().makeSC(std::move(view), ii.colorInfo());
478*c8dee2aaSAndroid Build Coastguard Worker         // Read pixels should work with a read-only texture.
479*c8dee2aaSAndroid Build Coastguard Worker         {
480*c8dee2aaSAndroid Build Coastguard Worker             SkAutoPixmapStorage read;
481*c8dee2aaSAndroid Build Coastguard Worker             read.alloc(srcPixmap.info());
482*c8dee2aaSAndroid Build Coastguard Worker             auto readResult = surfContext->readPixels(dContext, read, {0, 0});
483*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, readResult);
484*c8dee2aaSAndroid Build Coastguard Worker             if (readResult) {
485*c8dee2aaSAndroid Build Coastguard Worker                 comparePixels(srcPixmap, read, reporter);
486*c8dee2aaSAndroid Build Coastguard Worker             }
487*c8dee2aaSAndroid Build Coastguard Worker         }
488*c8dee2aaSAndroid Build Coastguard Worker 
489*c8dee2aaSAndroid Build Coastguard Worker         // Write pixels should not work with a read-only texture.
490*c8dee2aaSAndroid Build Coastguard Worker         SkAutoPixmapStorage write;
491*c8dee2aaSAndroid Build Coastguard Worker         write.alloc(srcPixmap.info());
492*c8dee2aaSAndroid Build Coastguard Worker         fillPixels(&write, [&srcPixmap](int x, int y) { return ~*srcPixmap.addr32(); });
493*c8dee2aaSAndroid Build Coastguard Worker         auto writeResult = surfContext->writePixels(dContext, write, {0, 0});
494*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, writeResult == (ioType == kRW_GrIOType));
495*c8dee2aaSAndroid Build Coastguard Worker         // Try the low level write.
496*c8dee2aaSAndroid Build Coastguard Worker         dContext->flushAndSubmit();
497*c8dee2aaSAndroid Build Coastguard Worker         auto gpuWriteResult = dContext->priv().getGpu()->writePixels(
498*c8dee2aaSAndroid Build Coastguard Worker                 proxy->peekTexture(),
499*c8dee2aaSAndroid Build Coastguard Worker                 SkIRect::MakeWH(kSize, kSize),
500*c8dee2aaSAndroid Build Coastguard Worker                 GrColorType::kRGBA_8888,
501*c8dee2aaSAndroid Build Coastguard Worker                 GrColorType::kRGBA_8888,
502*c8dee2aaSAndroid Build Coastguard Worker                 write.addr32(),
503*c8dee2aaSAndroid Build Coastguard Worker                 kSize*GrColorTypeBytesPerPixel(GrColorType::kRGBA_8888));
504*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, gpuWriteResult == (ioType == kRW_GrIOType));
505*c8dee2aaSAndroid Build Coastguard Worker 
506*c8dee2aaSAndroid Build Coastguard Worker         SkBitmap copySrcBitmap;
507*c8dee2aaSAndroid Build Coastguard Worker         copySrcBitmap.installPixels(write);
508*c8dee2aaSAndroid Build Coastguard Worker         copySrcBitmap.setImmutable();
509*c8dee2aaSAndroid Build Coastguard Worker 
510*c8dee2aaSAndroid Build Coastguard Worker         auto copySrc = std::get<0>(GrMakeUncachedBitmapProxyView(dContext, copySrcBitmap));
511*c8dee2aaSAndroid Build Coastguard Worker 
512*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, copySrc);
513*c8dee2aaSAndroid Build Coastguard Worker         auto copyResult = surfContext->testCopy(copySrc.refProxy());
514*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, copyResult == (ioType == kRW_GrIOType));
515*c8dee2aaSAndroid Build Coastguard Worker         // Try the low level copy.
516*c8dee2aaSAndroid Build Coastguard Worker         dContext->flushAndSubmit();
517*c8dee2aaSAndroid Build Coastguard Worker         auto gpuCopyResult = dContext->priv().getGpu()->copySurface(
518*c8dee2aaSAndroid Build Coastguard Worker                 proxy->peekSurface(),
519*c8dee2aaSAndroid Build Coastguard Worker                 SkIRect::MakeWH(kSize, kSize),
520*c8dee2aaSAndroid Build Coastguard Worker                 copySrc.proxy()->peekSurface(),
521*c8dee2aaSAndroid Build Coastguard Worker                 SkIRect::MakeWH(kSize, kSize),
522*c8dee2aaSAndroid Build Coastguard Worker                 GrSamplerState::Filter::kNearest);
523*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, gpuCopyResult == (ioType == kRW_GrIOType));
524*c8dee2aaSAndroid Build Coastguard Worker 
525*c8dee2aaSAndroid Build Coastguard Worker         // Mip regen should not work with a read only texture.
526*c8dee2aaSAndroid Build Coastguard Worker         if (dContext->priv().caps()->mipmapSupport()) {
527*c8dee2aaSAndroid Build Coastguard Worker             mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(dContext,
528*c8dee2aaSAndroid Build Coastguard Worker                                                                        kSize,
529*c8dee2aaSAndroid Build Coastguard Worker                                                                        kSize,
530*c8dee2aaSAndroid Build Coastguard Worker                                                                        kRGBA_8888_SkColorType,
531*c8dee2aaSAndroid Build Coastguard Worker                                                                        Mipmapped::kYes,
532*c8dee2aaSAndroid Build Coastguard Worker                                                                        GrRenderable::kNo,
533*c8dee2aaSAndroid Build Coastguard Worker                                                                        isProtected);
534*c8dee2aaSAndroid Build Coastguard Worker             proxy = proxyProvider->wrapBackendTexture(mbet->texture(), kBorrow_GrWrapOwnership,
535*c8dee2aaSAndroid Build Coastguard Worker                                                       GrWrapCacheable::kNo, ioType,
536*c8dee2aaSAndroid Build Coastguard Worker                                                       mbet->refCountedCallback());
537*c8dee2aaSAndroid Build Coastguard Worker             dContext->flushAndSubmit();
538*c8dee2aaSAndroid Build Coastguard Worker             proxy->peekTexture()->markMipmapsDirty();  // avoids assert in GrGpu.
539*c8dee2aaSAndroid Build Coastguard Worker             auto regenResult =
540*c8dee2aaSAndroid Build Coastguard Worker                     dContext->priv().getGpu()->regenerateMipMapLevels(proxy->peekTexture());
541*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, regenResult == (ioType == kRW_GrIOType));
542*c8dee2aaSAndroid Build Coastguard Worker         }
543*c8dee2aaSAndroid Build Coastguard Worker     }
544*c8dee2aaSAndroid Build Coastguard Worker }
545