• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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