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 #if SK_SUPPORT_GPU
13 #include "GrRenderTargetProxy.h"
14 #include "GrResourceProvider.h"
15 #include "GrSurfaceProxy.h"
16 #include "GrTextureProxy.h"
17
make_wrapped_FBO0(GrResourceProvider * provider,skiatest::Reporter * reporter,const GrSurfaceDesc & desc)18 static sk_sp<GrSurfaceProxy> make_wrapped_FBO0(GrResourceProvider* provider,
19 skiatest::Reporter* reporter,
20 const GrSurfaceDesc& desc) {
21 GrBackendRenderTargetDesc backendDesc;
22 backendDesc.fWidth = desc.fWidth;
23 backendDesc.fHeight = desc.fHeight;
24 backendDesc.fConfig = desc.fConfig;
25 backendDesc.fOrigin = desc.fOrigin;
26 backendDesc.fSampleCnt = desc.fSampleCnt;
27 backendDesc.fStencilBits = 8;
28 backendDesc.fRenderTargetHandle = 0;
29
30 sk_sp<GrRenderTarget> defaultFBO(provider->wrapBackendRenderTarget(backendDesc));
31 SkASSERT(!defaultFBO->asTexture());
32
33 return GrSurfaceProxy::MakeWrapped(std::move(defaultFBO));
34 }
35
make_wrapped_offscreen_rt(GrResourceProvider * provider,skiatest::Reporter * reporter,const GrSurfaceDesc & desc,SkBudgeted budgeted)36 static sk_sp<GrSurfaceProxy> make_wrapped_offscreen_rt(GrResourceProvider* provider,
37 skiatest::Reporter* reporter,
38 const GrSurfaceDesc& desc,
39 SkBudgeted budgeted) {
40 SkASSERT(kRenderTarget_GrSurfaceFlag == desc.fFlags);
41
42 sk_sp<GrTexture> tex(provider->createTexture(desc, budgeted));
43
44 return GrSurfaceProxy::MakeWrapped(std::move(tex));
45 }
46
make_wrapped_texture(GrResourceProvider * provider,const GrSurfaceDesc & desc,SkBudgeted budgeted)47 static sk_sp<GrSurfaceProxy> make_wrapped_texture(GrResourceProvider* provider,
48 const GrSurfaceDesc& desc,
49 SkBudgeted budgeted) {
50 sk_sp<GrTexture> tex(provider->createTexture(desc, budgeted));
51
52 return GrSurfaceProxy::MakeWrapped(std::move(tex));
53 }
54
55 // Test converting between RenderTargetProxies and TextureProxies for wrapped
56 // Proxies
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyConversionTest,reporter,ctxInfo)57 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyConversionTest, reporter, ctxInfo) {
58 GrResourceProvider* provider = ctxInfo.grContext()->resourceProvider();
59
60 GrSurfaceDesc desc;
61 desc.fFlags = kRenderTarget_GrSurfaceFlag;
62 desc.fWidth = 64;
63 desc.fHeight = 64;
64 desc.fConfig = kRGBA_8888_GrPixelConfig;
65
66 if (kOpenGL_GrBackend == ctxInfo.backend()) {
67 // External on-screen render target.
68 sk_sp<GrSurfaceProxy> sProxy(make_wrapped_FBO0(provider, reporter, desc));
69
70 // RenderTarget-only
71 GrRenderTargetProxy* rtProxy = sProxy->asRenderTargetProxy();
72 REPORTER_ASSERT(reporter, rtProxy);
73 REPORTER_ASSERT(reporter, !rtProxy->asTextureProxy());
74 REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
75 }
76
77 {
78 // Internal offscreen render target.
79 sk_sp<GrSurfaceProxy> sProxy(make_wrapped_offscreen_rt(provider,
80 reporter, desc,
81 SkBudgeted::kYes));
82
83 // Both RenderTarget and Texture
84 GrRenderTargetProxy* rtProxy = sProxy->asRenderTargetProxy();
85 REPORTER_ASSERT(reporter, rtProxy);
86 GrTextureProxy* tProxy = rtProxy->asTextureProxy();
87 REPORTER_ASSERT(reporter, tProxy);
88 REPORTER_ASSERT(reporter, tProxy->asRenderTargetProxy() == rtProxy);
89 REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
90 }
91
92 {
93 // Internal offscreen render target - but through GrTextureProxy
94 sk_sp<GrSurfaceProxy> sProxy(make_wrapped_texture(provider, desc, SkBudgeted::kYes));
95
96 // Both RenderTarget and Texture
97 GrTextureProxy* tProxy = sProxy->asTextureProxy();
98 REPORTER_ASSERT(reporter, tProxy);
99 GrRenderTargetProxy* rtProxy = tProxy->asRenderTargetProxy();
100 REPORTER_ASSERT(reporter, rtProxy);
101 REPORTER_ASSERT(reporter, rtProxy->asTextureProxy() == tProxy);
102 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
103 }
104
105 {
106 desc.fFlags = kNone_GrSurfaceFlags; // force no-RT
107
108 sk_sp<GrSurfaceProxy> sProxy(make_wrapped_texture(provider, desc, SkBudgeted::kYes));
109
110 // Texture-only
111 GrTextureProxy* tProxy = sProxy->asTextureProxy();
112 REPORTER_ASSERT(reporter, tProxy);
113 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
114 REPORTER_ASSERT(reporter, !tProxy->asRenderTargetProxy());
115 }
116 }
117
118 // Test converting between RenderTargetProxies and TextureProxies for deferred
119 // Proxies
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DefferredProxyConversionTest,reporter,ctxInfo)120 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DefferredProxyConversionTest, reporter, ctxInfo) {
121 GrResourceProvider* resourceProvider = ctxInfo.grContext()->resourceProvider();
122
123 GrSurfaceDesc desc;
124 desc.fFlags = kRenderTarget_GrSurfaceFlag;
125 desc.fWidth = 64;
126 desc.fHeight = 64;
127 desc.fConfig = kRGBA_8888_GrPixelConfig;
128
129 {
130 sk_sp<GrTextureProxy> proxy(GrSurfaceProxy::MakeDeferred(resourceProvider, desc,
131 SkBackingFit::kApprox,
132 SkBudgeted::kYes));
133
134 // Both RenderTarget and Texture
135 GrRenderTargetProxy* rtProxy = proxy->asRenderTargetProxy();
136 REPORTER_ASSERT(reporter, rtProxy);
137 GrTextureProxy* tProxy = rtProxy->asTextureProxy();
138 REPORTER_ASSERT(reporter, tProxy);
139 REPORTER_ASSERT(reporter, tProxy->asRenderTargetProxy() == rtProxy);
140 REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
141 }
142
143 {
144 sk_sp<GrTextureProxy> proxy(GrSurfaceProxy::MakeDeferred(resourceProvider, desc,
145 SkBackingFit::kApprox,
146 SkBudgeted::kYes));
147
148 // Both RenderTarget and Texture - but via GrTextureProxy
149 GrTextureProxy* tProxy = proxy->asTextureProxy();
150 REPORTER_ASSERT(reporter, tProxy);
151 GrRenderTargetProxy* rtProxy = tProxy->asRenderTargetProxy();
152 REPORTER_ASSERT(reporter, rtProxy);
153 REPORTER_ASSERT(reporter, rtProxy->asTextureProxy() == tProxy);
154 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
155 }
156
157 {
158 desc.fFlags = kNone_GrSurfaceFlags; // force no-RT
159
160 sk_sp<GrTextureProxy> proxy(GrSurfaceProxy::MakeDeferred(resourceProvider, desc,
161 SkBackingFit::kApprox,
162 SkBudgeted::kYes));
163
164 // Texture-only
165 GrTextureProxy* tProxy = proxy->asTextureProxy();
166 REPORTER_ASSERT(reporter, tProxy);
167 REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
168 REPORTER_ASSERT(reporter, !tProxy->asRenderTargetProxy());
169 }
170 }
171 #endif
172