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