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