• 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 "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