1 /*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 // This is a GPU-backend specific test.
9
10 #include "Test.h"
11
12 #include "GrBackendSurface.h"
13 #include "GrContextPriv.h"
14 #include "GrGpu.h"
15 #include "GrProxyProvider.h"
16 #include "GrRenderTarget.h"
17 #include "GrRenderTargetProxy.h"
18 #include "GrSurfaceProxy.h"
19 #include "GrTexture.h"
20 #include "GrTextureProxy.h"
21
make_wrapped_rt(GrProxyProvider * provider,GrGpu * gpu,skiatest::Reporter * reporter,const GrSurfaceDesc & desc,GrSurfaceOrigin origin)22 static sk_sp<GrSurfaceProxy> make_wrapped_rt(GrProxyProvider* provider,
23 GrGpu* gpu,
24 skiatest::Reporter* reporter,
25 const GrSurfaceDesc& desc,
26 GrSurfaceOrigin origin) {
27 // We don't currently have a way of making MSAA backend render targets.
28 SkASSERT(1 == desc.fSampleCnt);
29 GrSRGBEncoded srgbEncoded;
30 auto ct = GrPixelConfigToColorTypeAndEncoding(desc.fConfig, &srgbEncoded);
31 auto backendRT = gpu->createTestingOnlyBackendRenderTarget(desc.fWidth, desc.fHeight, ct);
32 return provider->wrapBackendRenderTarget(backendRT, origin);
33 }
34
clean_up_wrapped_rt(GrGpu * gpu,sk_sp<GrSurfaceProxy> proxy)35 void clean_up_wrapped_rt(GrGpu* gpu, sk_sp<GrSurfaceProxy> proxy) {
36 SkASSERT(proxy->isUnique_debugOnly());
37 SkASSERT(proxy->peekRenderTarget());
38 GrBackendRenderTarget rt = proxy->peekRenderTarget()->getBackendRenderTarget();
39 proxy.reset();
40 gpu->deleteTestingOnlyBackendRenderTarget(rt);
41 }
42
make_offscreen_rt(GrProxyProvider * provider,const GrSurfaceDesc & desc,GrSurfaceOrigin origin)43 static sk_sp<GrSurfaceProxy> make_offscreen_rt(GrProxyProvider* provider,
44 const GrSurfaceDesc& desc,
45 GrSurfaceOrigin origin) {
46 SkASSERT(kRenderTarget_GrSurfaceFlag == desc.fFlags);
47
48 return provider->testingOnly_createInstantiatedProxy(desc, origin, SkBackingFit::kExact,
49 SkBudgeted::kYes);
50 }
51
make_texture(GrProxyProvider * provider,const GrSurfaceDesc & desc,GrSurfaceOrigin origin)52 static sk_sp<GrSurfaceProxy> make_texture(GrProxyProvider* provider,
53 const GrSurfaceDesc& desc,
54 GrSurfaceOrigin origin) {
55 return provider->testingOnly_createInstantiatedProxy(desc, origin, SkBackingFit::kExact,
56 SkBudgeted::kYes);
57 }
58
59 // Test converting between RenderTargetProxies and TextureProxies for preinstantiated Proxies
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(PreinstantiatedProxyConversionTest,reporter,ctxInfo)60 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(PreinstantiatedProxyConversionTest, reporter, ctxInfo) {
61 GrProxyProvider* proxyProvider = ctxInfo.grContext()->contextPriv().proxyProvider();
62 GrGpu* gpu = ctxInfo.grContext()->contextPriv().getGpu();
63
64 GrSurfaceDesc desc;
65 desc.fFlags = kRenderTarget_GrSurfaceFlag;
66 desc.fWidth = 64;
67 desc.fHeight = 64;
68 desc.fConfig = kRGBA_8888_GrPixelConfig;
69
70 {
71 // External on-screen render target.
72 sk_sp<GrSurfaceProxy> sProxy(
73 make_wrapped_rt(proxyProvider, gpu, reporter, desc, kBottomLeft_GrSurfaceOrigin));
74 if (sProxy) {
75 // RenderTarget-only
76 GrRenderTargetProxy* rtProxy = sProxy->asRenderTargetProxy();
77 REPORTER_ASSERT(reporter, rtProxy);
78 REPORTER_ASSERT(reporter, !rtProxy->asTextureProxy());
79 REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
80 clean_up_wrapped_rt(gpu, std::move(sProxy));
81 }
82 }
83
84 {
85 // Internal offscreen render target.
86 sk_sp<GrSurfaceProxy> sProxy(
87 make_offscreen_rt(proxyProvider, desc, kBottomLeft_GrSurfaceOrigin));
88 if (sProxy) {
89 // Both RenderTarget and Texture
90 GrRenderTargetProxy* rtProxy = sProxy->asRenderTargetProxy();
91 REPORTER_ASSERT(reporter, rtProxy);
92 GrTextureProxy* tProxy = rtProxy->asTextureProxy();
93 REPORTER_ASSERT(reporter, tProxy);
94 REPORTER_ASSERT(reporter, tProxy->asRenderTargetProxy() == rtProxy);
95 REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
96 }
97 }
98
99 {
100 // Internal offscreen render target - but through GrTextureProxy
101 sk_sp<GrSurfaceProxy> sProxy(
102 make_texture(proxyProvider, desc, kBottomLeft_GrSurfaceOrigin));
103 if (sProxy) {
104 // Both RenderTarget and Texture
105 GrTextureProxy* tProxy = sProxy->asTextureProxy();
106 REPORTER_ASSERT(reporter, tProxy);
107 GrRenderTargetProxy* rtProxy = tProxy->asRenderTargetProxy();
108 REPORTER_ASSERT(reporter, rtProxy);
109 REPORTER_ASSERT(reporter, rtProxy->asTextureProxy() == tProxy);
110 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
111 }
112 }
113
114 {
115 desc.fFlags = kNone_GrSurfaceFlags; // force no-RT
116
117 sk_sp<GrSurfaceProxy> sProxy(
118 make_texture(proxyProvider, desc, kBottomLeft_GrSurfaceOrigin));
119 if (sProxy) {
120 // Texture-only
121 GrTextureProxy* tProxy = sProxy->asTextureProxy();
122 REPORTER_ASSERT(reporter, tProxy);
123 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
124 REPORTER_ASSERT(reporter, !tProxy->asRenderTargetProxy());
125 }
126 }
127 }
128
129 // Test converting between RenderTargetProxies and TextureProxies for deferred
130 // Proxies
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DefferredProxyConversionTest,reporter,ctxInfo)131 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DefferredProxyConversionTest, reporter, ctxInfo) {
132 GrProxyProvider* proxyProvider = ctxInfo.grContext()->contextPriv().proxyProvider();
133
134 GrSurfaceDesc desc;
135 desc.fFlags = kRenderTarget_GrSurfaceFlag;
136 desc.fWidth = 64;
137 desc.fHeight = 64;
138 desc.fConfig = kRGBA_8888_GrPixelConfig;
139
140 const GrBackendFormat format =
141 ctxInfo.grContext()->contextPriv().caps()->getBackendFormatFromColorType(
142 kRGBA_8888_SkColorType);
143 {
144 sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(
145 format, desc, kBottomLeft_GrSurfaceOrigin, SkBackingFit::kApprox, SkBudgeted::kYes);
146
147 // Both RenderTarget and Texture
148 GrRenderTargetProxy* rtProxy = proxy->asRenderTargetProxy();
149 REPORTER_ASSERT(reporter, rtProxy);
150 GrTextureProxy* tProxy = rtProxy->asTextureProxy();
151 REPORTER_ASSERT(reporter, tProxy);
152 REPORTER_ASSERT(reporter, tProxy->asRenderTargetProxy() == rtProxy);
153 REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
154 }
155
156 {
157 sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(
158 format, desc, kBottomLeft_GrSurfaceOrigin, SkBackingFit::kApprox, SkBudgeted::kYes);
159
160 // Both RenderTarget and Texture - but via GrTextureProxy
161 GrTextureProxy* tProxy = proxy->asTextureProxy();
162 REPORTER_ASSERT(reporter, tProxy);
163 GrRenderTargetProxy* rtProxy = tProxy->asRenderTargetProxy();
164 REPORTER_ASSERT(reporter, rtProxy);
165 REPORTER_ASSERT(reporter, rtProxy->asTextureProxy() == tProxy);
166 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
167 }
168
169 {
170 desc.fFlags = kNone_GrSurfaceFlags; // force no-RT
171
172 sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(
173 format, desc, kTopLeft_GrSurfaceOrigin, SkBackingFit::kApprox, SkBudgeted::kYes);
174 // Texture-only
175 GrTextureProxy* tProxy = proxy->asTextureProxy();
176 REPORTER_ASSERT(reporter, tProxy);
177 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
178 REPORTER_ASSERT(reporter, !tProxy->asRenderTargetProxy());
179 }
180 }
181