xref: /aosp_15_r20/external/skia/tests/ProxyTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2016 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 is a GPU-backend specific test.
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorType.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/RefCntedCallback.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceProvider.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxy.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ManagedBackendTexture.h"
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GL)
38*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLBackendSurface.h"
39*c8dee2aaSAndroid Build Coastguard Worker #endif
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker #include <initializer_list>
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker // Check that the surface proxy's member vars are set as expected
check_surface(skiatest::Reporter * reporter,GrSurfaceProxy * proxy,int width,int height,skgpu::Budgeted budgeted)46*c8dee2aaSAndroid Build Coastguard Worker static void check_surface(skiatest::Reporter* reporter,
47*c8dee2aaSAndroid Build Coastguard Worker                           GrSurfaceProxy* proxy,
48*c8dee2aaSAndroid Build Coastguard Worker                           int width,
49*c8dee2aaSAndroid Build Coastguard Worker                           int height,
50*c8dee2aaSAndroid Build Coastguard Worker                           skgpu::Budgeted budgeted) {
51*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->width() == width);
52*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->height() == height);
53*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, !proxy->uniqueID().isInvalid());
54*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->isBudgeted() == budgeted);
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker 
check_rendertarget(skiatest::Reporter * reporter,const GrCaps & caps,GrResourceProvider * provider,GrRenderTargetProxy * rtProxy,int numSamples,SkBackingFit fit,int expectedMaxWindowRects)57*c8dee2aaSAndroid Build Coastguard Worker static void check_rendertarget(skiatest::Reporter* reporter,
58*c8dee2aaSAndroid Build Coastguard Worker                                const GrCaps& caps,
59*c8dee2aaSAndroid Build Coastguard Worker                                GrResourceProvider* provider,
60*c8dee2aaSAndroid Build Coastguard Worker                                GrRenderTargetProxy* rtProxy,
61*c8dee2aaSAndroid Build Coastguard Worker                                int numSamples,
62*c8dee2aaSAndroid Build Coastguard Worker                                SkBackingFit fit,
63*c8dee2aaSAndroid Build Coastguard Worker                                int expectedMaxWindowRects) {
64*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, rtProxy->maxWindowRectangles(caps) == expectedMaxWindowRects);
65*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, rtProxy->numSamples() == numSamples);
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxy::UniqueID idBefore = rtProxy->uniqueID();
68*c8dee2aaSAndroid Build Coastguard Worker     bool preinstantiated = rtProxy->isInstantiated();
69*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, rtProxy->instantiate(provider));
70*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTarget* rt = rtProxy->peekRenderTarget();
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, rtProxy->uniqueID() == idBefore);
73*c8dee2aaSAndroid Build Coastguard Worker     // Deferred resources should always have a different ID from their instantiated rendertarget
74*c8dee2aaSAndroid Build Coastguard Worker     if (preinstantiated) {
75*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rtProxy->uniqueID().asUInt() == rt->uniqueID().asUInt());
76*c8dee2aaSAndroid Build Coastguard Worker     } else {
77*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rtProxy->uniqueID().asUInt() != rt->uniqueID().asUInt());
78*c8dee2aaSAndroid Build Coastguard Worker     }
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     if (SkBackingFit::kExact == fit) {
81*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rt->dimensions() == rtProxy->dimensions());
82*c8dee2aaSAndroid Build Coastguard Worker     } else {
83*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rt->width() >= rtProxy->width());
84*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rt->height() >= rtProxy->height());
85*c8dee2aaSAndroid Build Coastguard Worker     }
86*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, rt->backendFormat() == rtProxy->backendFormat());
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, rt->numSamples() == rtProxy->numSamples());
89*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, rt->flags() == rtProxy->testingOnly_getFlags());
90*c8dee2aaSAndroid Build Coastguard Worker }
91*c8dee2aaSAndroid Build Coastguard Worker 
check_texture(skiatest::Reporter * reporter,GrResourceProvider * provider,GrTextureProxy * texProxy,SkBackingFit fit)92*c8dee2aaSAndroid Build Coastguard Worker static void check_texture(skiatest::Reporter* reporter,
93*c8dee2aaSAndroid Build Coastguard Worker                           GrResourceProvider* provider,
94*c8dee2aaSAndroid Build Coastguard Worker                           GrTextureProxy* texProxy,
95*c8dee2aaSAndroid Build Coastguard Worker                           SkBackingFit fit) {
96*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxy::UniqueID idBefore = texProxy->uniqueID();
97*c8dee2aaSAndroid Build Coastguard Worker 
98*c8dee2aaSAndroid Build Coastguard Worker     bool preinstantiated = texProxy->isInstantiated();
99*c8dee2aaSAndroid Build Coastguard Worker     // The instantiated texture should have these dimensions. If the fit is kExact, then
100*c8dee2aaSAndroid Build Coastguard Worker     // 'backingStoreDimensions' reports the original WxH. If it is kApprox, make sure that
101*c8dee2aaSAndroid Build Coastguard Worker     // the texture is that size and didn't reuse one of the kExact surfaces in the provider.
102*c8dee2aaSAndroid Build Coastguard Worker     // This is important because upstream usage (e.g. SkImage) reports size based on the
103*c8dee2aaSAndroid Build Coastguard Worker     // backingStoreDimensions and client code may rely on that if they are creating backend
104*c8dee2aaSAndroid Build Coastguard Worker     // resources.
105*c8dee2aaSAndroid Build Coastguard Worker     // NOTE: we store these before instantiating, since after instantiation backingStoreDimensions
106*c8dee2aaSAndroid Build Coastguard Worker     // just returns the target's dimensions. In this instance, we want to ensure the target's
107*c8dee2aaSAndroid Build Coastguard Worker     // dimensions are no different from the original approximate (or exact) dimensions.
108*c8dee2aaSAndroid Build Coastguard Worker     SkISize expectedSize = texProxy->backingStoreDimensions();
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texProxy->instantiate(provider));
111*c8dee2aaSAndroid Build Coastguard Worker     GrTexture* tex = texProxy->peekTexture();
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, texProxy->uniqueID() == idBefore);
114*c8dee2aaSAndroid Build Coastguard Worker     // Deferred resources should always have a different ID from their instantiated texture
115*c8dee2aaSAndroid Build Coastguard Worker     if (preinstantiated) {
116*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, texProxy->uniqueID().asUInt() == tex->uniqueID().asUInt());
117*c8dee2aaSAndroid Build Coastguard Worker     } else {
118*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, texProxy->uniqueID().asUInt() != tex->uniqueID().asUInt());
119*c8dee2aaSAndroid Build Coastguard Worker     }
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, tex->dimensions() == expectedSize);
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, tex->backendFormat() == texProxy->backendFormat());
124*c8dee2aaSAndroid Build Coastguard Worker }
125*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(DeferredProxyTest,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)126*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(DeferredProxyTest,
127*c8dee2aaSAndroid Build Coastguard Worker                                        reporter,
128*c8dee2aaSAndroid Build Coastguard Worker                                        ctxInfo,
129*c8dee2aaSAndroid Build Coastguard Worker                                        CtsEnforcement::kApiLevel_T) {
130*c8dee2aaSAndroid Build Coastguard Worker     using namespace skgpu;
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker     auto direct = ctxInfo.directContext();
133*c8dee2aaSAndroid Build Coastguard Worker     GrProxyProvider* proxyProvider = direct->priv().proxyProvider();
134*c8dee2aaSAndroid Build Coastguard Worker     GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
135*c8dee2aaSAndroid Build Coastguard Worker     const GrCaps& caps = *direct->priv().caps();
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker     Protected isProtected = Protected(caps.supportsProtectedContent());
138*c8dee2aaSAndroid Build Coastguard Worker 
139*c8dee2aaSAndroid Build Coastguard Worker     for (auto widthHeight : {100, 128, 1048576}) {
140*c8dee2aaSAndroid Build Coastguard Worker         for (auto ct : {GrColorType::kAlpha_8, GrColorType::kBGR_565, GrColorType::kRGBA_8888,
141*c8dee2aaSAndroid Build Coastguard Worker                         GrColorType::kRGBA_1010102}) {
142*c8dee2aaSAndroid Build Coastguard Worker             for (auto fit : {SkBackingFit::kExact, SkBackingFit::kApprox}) {
143*c8dee2aaSAndroid Build Coastguard Worker                 for (auto budgeted : { Budgeted::kYes, Budgeted::kNo }) {
144*c8dee2aaSAndroid Build Coastguard Worker                     for (auto numSamples : {1, 4, 16, 128}) {
145*c8dee2aaSAndroid Build Coastguard Worker                         SkISize dims = {widthHeight, widthHeight};
146*c8dee2aaSAndroid Build Coastguard Worker 
147*c8dee2aaSAndroid Build Coastguard Worker                         auto format = caps.getDefaultBackendFormat(ct, GrRenderable::kYes);
148*c8dee2aaSAndroid Build Coastguard Worker                         if (!format.isValid()) {
149*c8dee2aaSAndroid Build Coastguard Worker                             continue;
150*c8dee2aaSAndroid Build Coastguard Worker                         }
151*c8dee2aaSAndroid Build Coastguard Worker 
152*c8dee2aaSAndroid Build Coastguard Worker                         // Renderable
153*c8dee2aaSAndroid Build Coastguard Worker                         {
154*c8dee2aaSAndroid Build Coastguard Worker                             sk_sp<GrTexture> tex;
155*c8dee2aaSAndroid Build Coastguard Worker                             if (SkBackingFit::kApprox == fit) {
156*c8dee2aaSAndroid Build Coastguard Worker                                 tex = resourceProvider->createApproxTexture(dims,
157*c8dee2aaSAndroid Build Coastguard Worker                                                                             format,
158*c8dee2aaSAndroid Build Coastguard Worker                                                                             GrTextureType::k2D,
159*c8dee2aaSAndroid Build Coastguard Worker                                                                             GrRenderable::kYes,
160*c8dee2aaSAndroid Build Coastguard Worker                                                                             numSamples,
161*c8dee2aaSAndroid Build Coastguard Worker                                                                             isProtected,
162*c8dee2aaSAndroid Build Coastguard Worker                                                                             /*label=*/{});
163*c8dee2aaSAndroid Build Coastguard Worker                             } else {
164*c8dee2aaSAndroid Build Coastguard Worker                                 tex = resourceProvider->createTexture(dims,
165*c8dee2aaSAndroid Build Coastguard Worker                                                                       format,
166*c8dee2aaSAndroid Build Coastguard Worker                                                                       GrTextureType::k2D,
167*c8dee2aaSAndroid Build Coastguard Worker                                                                       GrRenderable::kYes,
168*c8dee2aaSAndroid Build Coastguard Worker                                                                       numSamples,
169*c8dee2aaSAndroid Build Coastguard Worker                                                                       Mipmapped::kNo,
170*c8dee2aaSAndroid Build Coastguard Worker                                                                       budgeted,
171*c8dee2aaSAndroid Build Coastguard Worker                                                                       isProtected,
172*c8dee2aaSAndroid Build Coastguard Worker                                                                       /*label=*/{});
173*c8dee2aaSAndroid Build Coastguard Worker                             }
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker                             sk_sp<GrTextureProxy> proxy =
176*c8dee2aaSAndroid Build Coastguard Worker                                     proxyProvider->createProxy(format,
177*c8dee2aaSAndroid Build Coastguard Worker                                                                dims,
178*c8dee2aaSAndroid Build Coastguard Worker                                                                GrRenderable::kYes,
179*c8dee2aaSAndroid Build Coastguard Worker                                                                numSamples,
180*c8dee2aaSAndroid Build Coastguard Worker                                                                Mipmapped::kNo,
181*c8dee2aaSAndroid Build Coastguard Worker                                                                fit,
182*c8dee2aaSAndroid Build Coastguard Worker                                                                budgeted,
183*c8dee2aaSAndroid Build Coastguard Worker                                                                isProtected,
184*c8dee2aaSAndroid Build Coastguard Worker                                                                /*label=*/{});
185*c8dee2aaSAndroid Build Coastguard Worker                             REPORTER_ASSERT(reporter, SkToBool(tex) == SkToBool(proxy));
186*c8dee2aaSAndroid Build Coastguard Worker                             if (proxy) {
187*c8dee2aaSAndroid Build Coastguard Worker                                 REPORTER_ASSERT(reporter, proxy->asRenderTargetProxy());
188*c8dee2aaSAndroid Build Coastguard Worker                                 // This forces the proxy to compute and cache its
189*c8dee2aaSAndroid Build Coastguard Worker                                 // pre-instantiation size guess. Later, when it is actually
190*c8dee2aaSAndroid Build Coastguard Worker                                 // instantiated, it checks that the instantiated size is <= to
191*c8dee2aaSAndroid Build Coastguard Worker                                 // the pre-computation. If the proxy never computed its
192*c8dee2aaSAndroid Build Coastguard Worker                                 // pre-instantiation size then the check is skipped.
193*c8dee2aaSAndroid Build Coastguard Worker                                 proxy->gpuMemorySize();
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker                                 check_surface(reporter, proxy.get(), widthHeight, widthHeight,
196*c8dee2aaSAndroid Build Coastguard Worker                                               budgeted);
197*c8dee2aaSAndroid Build Coastguard Worker                                 int supportedSamples =
198*c8dee2aaSAndroid Build Coastguard Worker                                         caps.getRenderTargetSampleCount(numSamples, format);
199*c8dee2aaSAndroid Build Coastguard Worker                                 check_rendertarget(reporter, caps, resourceProvider,
200*c8dee2aaSAndroid Build Coastguard Worker                                                    proxy->asRenderTargetProxy(), supportedSamples,
201*c8dee2aaSAndroid Build Coastguard Worker                                                    fit, caps.maxWindowRectangles());
202*c8dee2aaSAndroid Build Coastguard Worker                             }
203*c8dee2aaSAndroid Build Coastguard Worker                         }
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker                         // Not renderable
206*c8dee2aaSAndroid Build Coastguard Worker                         {
207*c8dee2aaSAndroid Build Coastguard Worker                             sk_sp<GrTexture> tex;
208*c8dee2aaSAndroid Build Coastguard Worker                             if (SkBackingFit::kApprox == fit) {
209*c8dee2aaSAndroid Build Coastguard Worker                                 tex = resourceProvider->createApproxTexture(dims,
210*c8dee2aaSAndroid Build Coastguard Worker                                                                             format,
211*c8dee2aaSAndroid Build Coastguard Worker                                                                             GrTextureType::k2D,
212*c8dee2aaSAndroid Build Coastguard Worker                                                                             GrRenderable::kNo,
213*c8dee2aaSAndroid Build Coastguard Worker                                                                             numSamples,
214*c8dee2aaSAndroid Build Coastguard Worker                                                                             isProtected,
215*c8dee2aaSAndroid Build Coastguard Worker                                                                             /*label=*/{});
216*c8dee2aaSAndroid Build Coastguard Worker                             } else {
217*c8dee2aaSAndroid Build Coastguard Worker                                 tex = resourceProvider->createTexture(dims,
218*c8dee2aaSAndroid Build Coastguard Worker                                                                       format,
219*c8dee2aaSAndroid Build Coastguard Worker                                                                       GrTextureType::k2D,
220*c8dee2aaSAndroid Build Coastguard Worker                                                                       GrRenderable::kNo,
221*c8dee2aaSAndroid Build Coastguard Worker                                                                       numSamples,
222*c8dee2aaSAndroid Build Coastguard Worker                                                                       Mipmapped::kNo,
223*c8dee2aaSAndroid Build Coastguard Worker                                                                       budgeted,
224*c8dee2aaSAndroid Build Coastguard Worker                                                                       isProtected,
225*c8dee2aaSAndroid Build Coastguard Worker                                                                       /*label=*/{});
226*c8dee2aaSAndroid Build Coastguard Worker                             }
227*c8dee2aaSAndroid Build Coastguard Worker 
228*c8dee2aaSAndroid Build Coastguard Worker                             sk_sp<GrTextureProxy> proxy(
229*c8dee2aaSAndroid Build Coastguard Worker                                     proxyProvider->createProxy(format,
230*c8dee2aaSAndroid Build Coastguard Worker                                                                dims,
231*c8dee2aaSAndroid Build Coastguard Worker                                                                GrRenderable::kNo,
232*c8dee2aaSAndroid Build Coastguard Worker                                                                numSamples,
233*c8dee2aaSAndroid Build Coastguard Worker                                                                Mipmapped::kNo,
234*c8dee2aaSAndroid Build Coastguard Worker                                                                fit,
235*c8dee2aaSAndroid Build Coastguard Worker                                                                budgeted,
236*c8dee2aaSAndroid Build Coastguard Worker                                                                isProtected,
237*c8dee2aaSAndroid Build Coastguard Worker                                                                /*label=*/{}));
238*c8dee2aaSAndroid Build Coastguard Worker                             REPORTER_ASSERT(reporter, SkToBool(tex) == SkToBool(proxy));
239*c8dee2aaSAndroid Build Coastguard Worker                             if (proxy) {
240*c8dee2aaSAndroid Build Coastguard Worker                                 // This forces the proxy to compute and cache its
241*c8dee2aaSAndroid Build Coastguard Worker                                 // pre-instantiation size guess. Later, when it is actually
242*c8dee2aaSAndroid Build Coastguard Worker                                 // instantiated, it checks that the instantiated size is <= to
243*c8dee2aaSAndroid Build Coastguard Worker                                 // the pre-computation. If the proxy never computed its
244*c8dee2aaSAndroid Build Coastguard Worker                                 // pre-instantiation size then the check is skipped.
245*c8dee2aaSAndroid Build Coastguard Worker                                 proxy->gpuMemorySize();
246*c8dee2aaSAndroid Build Coastguard Worker 
247*c8dee2aaSAndroid Build Coastguard Worker                                 check_surface(reporter, proxy.get(), widthHeight, widthHeight,
248*c8dee2aaSAndroid Build Coastguard Worker                                               budgeted);
249*c8dee2aaSAndroid Build Coastguard Worker                                 check_texture(reporter, resourceProvider, proxy->asTextureProxy(),
250*c8dee2aaSAndroid Build Coastguard Worker                                               fit);
251*c8dee2aaSAndroid Build Coastguard Worker                             }
252*c8dee2aaSAndroid Build Coastguard Worker                         }
253*c8dee2aaSAndroid Build Coastguard Worker                     }
254*c8dee2aaSAndroid Build Coastguard Worker                 }
255*c8dee2aaSAndroid Build Coastguard Worker             }
256*c8dee2aaSAndroid Build Coastguard Worker         }
257*c8dee2aaSAndroid Build Coastguard Worker     }
258*c8dee2aaSAndroid Build Coastguard Worker }
259*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)260*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest,
261*c8dee2aaSAndroid Build Coastguard Worker                                        reporter,
262*c8dee2aaSAndroid Build Coastguard Worker                                        ctxInfo,
263*c8dee2aaSAndroid Build Coastguard Worker                                        CtsEnforcement::kApiLevel_T) {
264*c8dee2aaSAndroid Build Coastguard Worker     using namespace skgpu;
265*c8dee2aaSAndroid Build Coastguard Worker 
266*c8dee2aaSAndroid Build Coastguard Worker     auto direct = ctxInfo.directContext();
267*c8dee2aaSAndroid Build Coastguard Worker     GrProxyProvider* proxyProvider = direct->priv().proxyProvider();
268*c8dee2aaSAndroid Build Coastguard Worker     GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
269*c8dee2aaSAndroid Build Coastguard Worker     GrGpu* gpu = direct->priv().getGpu();
270*c8dee2aaSAndroid Build Coastguard Worker     const GrCaps& caps = *direct->priv().caps();
271*c8dee2aaSAndroid Build Coastguard Worker 
272*c8dee2aaSAndroid Build Coastguard Worker     Protected isProtected = Protected(caps.supportsProtectedContent());
273*c8dee2aaSAndroid Build Coastguard Worker 
274*c8dee2aaSAndroid Build Coastguard Worker     static const int kWidthHeight = 100;
275*c8dee2aaSAndroid Build Coastguard Worker 
276*c8dee2aaSAndroid Build Coastguard Worker     for (auto colorType :
277*c8dee2aaSAndroid Build Coastguard Worker          {kAlpha_8_SkColorType, kRGBA_8888_SkColorType, kRGBA_1010102_SkColorType}) {
278*c8dee2aaSAndroid Build Coastguard Worker         GrColorType grColorType = SkColorTypeToGrColorType(colorType);
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker         // External on-screen render target.
281*c8dee2aaSAndroid Build Coastguard Worker         // Tests wrapBackendRenderTarget with a GrBackendRenderTarget
282*c8dee2aaSAndroid Build Coastguard Worker         // Our test-only function that creates a backend render target doesn't currently support
283*c8dee2aaSAndroid Build Coastguard Worker         // sample counts :(.
284*c8dee2aaSAndroid Build Coastguard Worker         if (direct->colorTypeSupportedAsSurface(colorType)) {
285*c8dee2aaSAndroid Build Coastguard Worker             GrBackendRenderTarget backendRT = gpu->createTestingOnlyBackendRenderTarget(
286*c8dee2aaSAndroid Build Coastguard Worker                     {kWidthHeight, kWidthHeight}, grColorType, /* sampleCount= */ 1, isProtected);
287*c8dee2aaSAndroid Build Coastguard Worker             if (!backendRT.isValid()) {
288*c8dee2aaSAndroid Build Coastguard Worker                 continue;
289*c8dee2aaSAndroid Build Coastguard Worker             }
290*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<GrSurfaceProxy> sProxy(
291*c8dee2aaSAndroid Build Coastguard Worker                     proxyProvider->wrapBackendRenderTarget(backendRT, nullptr));
292*c8dee2aaSAndroid Build Coastguard Worker             check_surface(reporter, sProxy.get(), kWidthHeight, kWidthHeight, Budgeted::kNo);
293*c8dee2aaSAndroid Build Coastguard Worker             static constexpr int kExpectedNumSamples = 1;
294*c8dee2aaSAndroid Build Coastguard Worker             check_rendertarget(reporter, caps, resourceProvider, sProxy->asRenderTargetProxy(),
295*c8dee2aaSAndroid Build Coastguard Worker                                kExpectedNumSamples, SkBackingFit::kExact,
296*c8dee2aaSAndroid Build Coastguard Worker                                caps.maxWindowRectangles());
297*c8dee2aaSAndroid Build Coastguard Worker             gpu->deleteTestingOnlyBackendRenderTarget(backendRT);
298*c8dee2aaSAndroid Build Coastguard Worker         }
299*c8dee2aaSAndroid Build Coastguard Worker 
300*c8dee2aaSAndroid Build Coastguard Worker         for (auto numSamples : {1, 4}) {
301*c8dee2aaSAndroid Build Coastguard Worker             auto beFormat = caps.getDefaultBackendFormat(grColorType, GrRenderable::kYes);
302*c8dee2aaSAndroid Build Coastguard Worker             int supportedNumSamples = caps.getRenderTargetSampleCount(numSamples, beFormat);
303*c8dee2aaSAndroid Build Coastguard Worker             if (!supportedNumSamples) {
304*c8dee2aaSAndroid Build Coastguard Worker                 continue;
305*c8dee2aaSAndroid Build Coastguard Worker             }
306*c8dee2aaSAndroid Build Coastguard Worker 
307*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GL
308*c8dee2aaSAndroid Build Coastguard Worker             // Test wrapping FBO 0 (with made up properties). This tests sample count and the
309*c8dee2aaSAndroid Build Coastguard Worker             // special case where FBO 0 doesn't support window rectangles.
310*c8dee2aaSAndroid Build Coastguard Worker             if (GrBackendApi::kOpenGL == ctxInfo.backend()) {
311*c8dee2aaSAndroid Build Coastguard Worker                 GrGLFramebufferInfo fboInfo;
312*c8dee2aaSAndroid Build Coastguard Worker                 fboInfo.fFBOID = 0;
313*c8dee2aaSAndroid Build Coastguard Worker                 fboInfo.fFormat = GrBackendFormats::AsGLFormatEnum(beFormat);
314*c8dee2aaSAndroid Build Coastguard Worker                 fboInfo.fProtected = isProtected;
315*c8dee2aaSAndroid Build Coastguard Worker                 SkASSERT(fboInfo.fFormat);
316*c8dee2aaSAndroid Build Coastguard Worker                 static constexpr int kStencilBits = 8;
317*c8dee2aaSAndroid Build Coastguard Worker                 GrBackendRenderTarget backendRT = GrBackendRenderTargets::MakeGL(
318*c8dee2aaSAndroid Build Coastguard Worker                         kWidthHeight, kWidthHeight, numSamples, kStencilBits, fboInfo);
319*c8dee2aaSAndroid Build Coastguard Worker                 sk_sp<GrSurfaceProxy> sProxy(
320*c8dee2aaSAndroid Build Coastguard Worker                         proxyProvider->wrapBackendRenderTarget(backendRT, nullptr));
321*c8dee2aaSAndroid Build Coastguard Worker                 check_surface(
322*c8dee2aaSAndroid Build Coastguard Worker                         reporter, sProxy.get(), kWidthHeight, kWidthHeight, Budgeted::kNo);
323*c8dee2aaSAndroid Build Coastguard Worker                 check_rendertarget(reporter, caps, resourceProvider, sProxy->asRenderTargetProxy(),
324*c8dee2aaSAndroid Build Coastguard Worker                                    supportedNumSamples, SkBackingFit::kExact, 0);
325*c8dee2aaSAndroid Build Coastguard Worker             }
326*c8dee2aaSAndroid Build Coastguard Worker #endif
327*c8dee2aaSAndroid Build Coastguard Worker 
328*c8dee2aaSAndroid Build Coastguard Worker             // Tests wrapBackendTexture that is only renderable
329*c8dee2aaSAndroid Build Coastguard Worker             {
330*c8dee2aaSAndroid Build Coastguard Worker                 auto mbet =
331*c8dee2aaSAndroid Build Coastguard Worker                         sk_gpu_test::ManagedBackendTexture::MakeWithoutData(direct,
332*c8dee2aaSAndroid Build Coastguard Worker                                                                             kWidthHeight,
333*c8dee2aaSAndroid Build Coastguard Worker                                                                             kWidthHeight,
334*c8dee2aaSAndroid Build Coastguard Worker                                                                             colorType,
335*c8dee2aaSAndroid Build Coastguard Worker                                                                             Mipmapped::kNo,
336*c8dee2aaSAndroid Build Coastguard Worker                                                                             GrRenderable::kYes,
337*c8dee2aaSAndroid Build Coastguard Worker                                                                             isProtected);
338*c8dee2aaSAndroid Build Coastguard Worker                 if (!mbet) {
339*c8dee2aaSAndroid Build Coastguard Worker                     ERRORF(reporter,
340*c8dee2aaSAndroid Build Coastguard Worker                            "Could not create renderable backend texture of color type %d",
341*c8dee2aaSAndroid Build Coastguard Worker                            colorType);
342*c8dee2aaSAndroid Build Coastguard Worker                     continue;
343*c8dee2aaSAndroid Build Coastguard Worker                 }
344*c8dee2aaSAndroid Build Coastguard Worker                 sk_sp<GrSurfaceProxy> sProxy = proxyProvider->wrapRenderableBackendTexture(
345*c8dee2aaSAndroid Build Coastguard Worker                         mbet->texture(), supportedNumSamples, kBorrow_GrWrapOwnership,
346*c8dee2aaSAndroid Build Coastguard Worker                         GrWrapCacheable::kNo, nullptr);
347*c8dee2aaSAndroid Build Coastguard Worker                 if (!sProxy) {
348*c8dee2aaSAndroid Build Coastguard Worker                     ERRORF(reporter, "wrapRenderableBackendTexture failed");
349*c8dee2aaSAndroid Build Coastguard Worker                     continue;
350*c8dee2aaSAndroid Build Coastguard Worker                 }
351*c8dee2aaSAndroid Build Coastguard Worker 
352*c8dee2aaSAndroid Build Coastguard Worker                 check_surface(
353*c8dee2aaSAndroid Build Coastguard Worker                         reporter, sProxy.get(), kWidthHeight, kWidthHeight, Budgeted::kNo);
354*c8dee2aaSAndroid Build Coastguard Worker                 check_rendertarget(reporter, caps, resourceProvider, sProxy->asRenderTargetProxy(),
355*c8dee2aaSAndroid Build Coastguard Worker                                    supportedNumSamples, SkBackingFit::kExact,
356*c8dee2aaSAndroid Build Coastguard Worker                                    caps.maxWindowRectangles());
357*c8dee2aaSAndroid Build Coastguard Worker             }
358*c8dee2aaSAndroid Build Coastguard Worker 
359*c8dee2aaSAndroid Build Coastguard Worker             {
360*c8dee2aaSAndroid Build Coastguard Worker                 // Tests wrapBackendTexture that is only textureable
361*c8dee2aaSAndroid Build Coastguard Worker                 auto mbet =
362*c8dee2aaSAndroid Build Coastguard Worker                         sk_gpu_test::ManagedBackendTexture::MakeWithoutData(direct,
363*c8dee2aaSAndroid Build Coastguard Worker                                                                             kWidthHeight,
364*c8dee2aaSAndroid Build Coastguard Worker                                                                             kWidthHeight,
365*c8dee2aaSAndroid Build Coastguard Worker                                                                             colorType,
366*c8dee2aaSAndroid Build Coastguard Worker                                                                             Mipmapped::kNo,
367*c8dee2aaSAndroid Build Coastguard Worker                                                                             GrRenderable::kNo,
368*c8dee2aaSAndroid Build Coastguard Worker                                                                             isProtected);
369*c8dee2aaSAndroid Build Coastguard Worker                 if (!mbet) {
370*c8dee2aaSAndroid Build Coastguard Worker                     ERRORF(reporter,
371*c8dee2aaSAndroid Build Coastguard Worker                            "Could not create non-renderable backend texture of color type %d",
372*c8dee2aaSAndroid Build Coastguard Worker                            colorType);
373*c8dee2aaSAndroid Build Coastguard Worker                     continue;
374*c8dee2aaSAndroid Build Coastguard Worker                 }
375*c8dee2aaSAndroid Build Coastguard Worker                 sk_sp<GrSurfaceProxy> sProxy = proxyProvider->wrapBackendTexture(
376*c8dee2aaSAndroid Build Coastguard Worker                         mbet->texture(), kBorrow_GrWrapOwnership, GrWrapCacheable::kNo,
377*c8dee2aaSAndroid Build Coastguard Worker                         kRead_GrIOType, mbet->refCountedCallback());
378*c8dee2aaSAndroid Build Coastguard Worker                 if (!sProxy) {
379*c8dee2aaSAndroid Build Coastguard Worker                     ERRORF(reporter, "wrapBackendTexture failed");
380*c8dee2aaSAndroid Build Coastguard Worker                     continue;
381*c8dee2aaSAndroid Build Coastguard Worker                 }
382*c8dee2aaSAndroid Build Coastguard Worker 
383*c8dee2aaSAndroid Build Coastguard Worker                 check_surface(
384*c8dee2aaSAndroid Build Coastguard Worker                         reporter, sProxy.get(), kWidthHeight, kWidthHeight, Budgeted::kNo);
385*c8dee2aaSAndroid Build Coastguard Worker                 check_texture(reporter, resourceProvider, sProxy->asTextureProxy(),
386*c8dee2aaSAndroid Build Coastguard Worker                               SkBackingFit::kExact);
387*c8dee2aaSAndroid Build Coastguard Worker             }
388*c8dee2aaSAndroid Build Coastguard Worker         }
389*c8dee2aaSAndroid Build Coastguard Worker     }
390*c8dee2aaSAndroid Build Coastguard Worker }
391*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(ZeroSizedProxyTest,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)392*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(ZeroSizedProxyTest,
393*c8dee2aaSAndroid Build Coastguard Worker                                        reporter,
394*c8dee2aaSAndroid Build Coastguard Worker                                        ctxInfo,
395*c8dee2aaSAndroid Build Coastguard Worker                                        CtsEnforcement::kApiLevel_T) {
396*c8dee2aaSAndroid Build Coastguard Worker     auto direct = ctxInfo.directContext();
397*c8dee2aaSAndroid Build Coastguard Worker     GrProxyProvider* provider = direct->priv().proxyProvider();
398*c8dee2aaSAndroid Build Coastguard Worker 
399*c8dee2aaSAndroid Build Coastguard Worker     for (auto renderable : {GrRenderable::kNo, GrRenderable::kYes}) {
400*c8dee2aaSAndroid Build Coastguard Worker         for (auto fit : { SkBackingFit::kExact, SkBackingFit::kApprox }) {
401*c8dee2aaSAndroid Build Coastguard Worker             for (int width : { 0, 100 }) {
402*c8dee2aaSAndroid Build Coastguard Worker                 for (int height : { 0, 100}) {
403*c8dee2aaSAndroid Build Coastguard Worker                     if (width && height) {
404*c8dee2aaSAndroid Build Coastguard Worker                         continue; // not zero-sized
405*c8dee2aaSAndroid Build Coastguard Worker                     }
406*c8dee2aaSAndroid Build Coastguard Worker 
407*c8dee2aaSAndroid Build Coastguard Worker                     const GrBackendFormat format =
408*c8dee2aaSAndroid Build Coastguard Worker                             direct->priv().caps()->getDefaultBackendFormat(
409*c8dee2aaSAndroid Build Coastguard Worker                                 GrColorType::kRGBA_8888,
410*c8dee2aaSAndroid Build Coastguard Worker                                 renderable);
411*c8dee2aaSAndroid Build Coastguard Worker 
412*c8dee2aaSAndroid Build Coastguard Worker                     sk_sp<GrTextureProxy> proxy = provider->createProxy(format,
413*c8dee2aaSAndroid Build Coastguard Worker                                                                         {width, height},
414*c8dee2aaSAndroid Build Coastguard Worker                                                                         renderable,
415*c8dee2aaSAndroid Build Coastguard Worker                                                                         1,
416*c8dee2aaSAndroid Build Coastguard Worker                                                                         skgpu::Mipmapped::kNo,
417*c8dee2aaSAndroid Build Coastguard Worker                                                                         fit,
418*c8dee2aaSAndroid Build Coastguard Worker                                                                         skgpu::Budgeted::kNo,
419*c8dee2aaSAndroid Build Coastguard Worker                                                                         GrProtected::kNo,
420*c8dee2aaSAndroid Build Coastguard Worker                                                                         /*label=*/{});
421*c8dee2aaSAndroid Build Coastguard Worker                     REPORTER_ASSERT(reporter, !proxy);
422*c8dee2aaSAndroid Build Coastguard Worker                 }
423*c8dee2aaSAndroid Build Coastguard Worker             }
424*c8dee2aaSAndroid Build Coastguard Worker         }
425*c8dee2aaSAndroid Build Coastguard Worker     }
426*c8dee2aaSAndroid Build Coastguard Worker }
427