• 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 "tests/Test.h"
11 
12 #include "include/gpu/GrBackendSurface.h"
13 #include "include/gpu/GrDirectContext.h"
14 #include "src/gpu/GrDirectContextPriv.h"
15 #include "src/gpu/GrGpu.h"
16 #include "src/gpu/GrProxyProvider.h"
17 #include "src/gpu/GrRenderTarget.h"
18 #include "src/gpu/GrRenderTargetProxy.h"
19 #include "src/gpu/GrSurfaceProxy.h"
20 #include "src/gpu/GrTexture.h"
21 #include "src/gpu/GrTextureProxy.h"
22 
make_wrapped_rt(GrProxyProvider * provider,GrGpu * gpu,skiatest::Reporter * reporter,const SkISize & size,GrColorType colorType)23 static sk_sp<GrSurfaceProxy> make_wrapped_rt(GrProxyProvider* provider,
24                                              GrGpu* gpu,
25                                              skiatest::Reporter* reporter,
26                                              const SkISize& size,
27                                              GrColorType colorType) {
28     auto backendRT = gpu->createTestingOnlyBackendRenderTarget(size, colorType);
29     return provider->wrapBackendRenderTarget(backendRT, nullptr);
30 }
31 
clean_up_wrapped_rt(GrGpu * gpu,sk_sp<GrSurfaceProxy> proxy)32 void clean_up_wrapped_rt(GrGpu* gpu, sk_sp<GrSurfaceProxy> proxy) {
33     SkASSERT(proxy->unique());
34     SkASSERT(proxy->peekRenderTarget());
35     GrBackendRenderTarget rt = proxy->peekRenderTarget()->getBackendRenderTarget();
36     proxy.reset();
37     gpu->deleteTestingOnlyBackendRenderTarget(rt);
38 }
39 
make_offscreen_rt(GrProxyProvider * provider,SkISize dimensions,GrColorType colorType)40 static sk_sp<GrSurfaceProxy> make_offscreen_rt(GrProxyProvider* provider,
41                                                SkISize dimensions,
42                                                GrColorType colorType) {
43     return provider->testingOnly_createInstantiatedProxy(dimensions, colorType, GrRenderable::kYes,
44                                                          1, SkBackingFit::kExact, SkBudgeted::kYes,
45                                                          GrProtected::kNo);
46 }
47 
make_texture(GrProxyProvider * provider,SkISize dimensions,GrColorType colorType,GrRenderable renderable)48 static sk_sp<GrSurfaceProxy> make_texture(GrProxyProvider* provider,
49                                           SkISize dimensions,
50                                           GrColorType colorType,
51                                           GrRenderable renderable) {
52     return provider->testingOnly_createInstantiatedProxy(dimensions, colorType, renderable, 1,
53                                                          SkBackingFit::kExact, SkBudgeted::kYes,
54                                                          GrProtected::kNo);
55 }
56 
57 // Test converting between RenderTargetProxies and TextureProxies for preinstantiated Proxies
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(PreinstantiatedProxyConversionTest,reporter,ctxInfo)58 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(PreinstantiatedProxyConversionTest, reporter, ctxInfo) {
59     auto context = ctxInfo.directContext();
60     GrProxyProvider* proxyProvider = context->priv().proxyProvider();
61     GrGpu* gpu = context->priv().getGpu();
62 
63     static constexpr auto kSize = SkISize::Make(64, 64);
64     static constexpr auto kColorType = GrColorType::kRGBA_8888;
65 
66     {
67         // External on-screen render target.
68         sk_sp<GrSurfaceProxy> sProxy(
69                 make_wrapped_rt(proxyProvider, gpu, reporter, kSize, kColorType));
70         if (sProxy) {
71             // RenderTarget-only
72             GrRenderTargetProxy* rtProxy = sProxy->asRenderTargetProxy();
73             REPORTER_ASSERT(reporter, rtProxy);
74             REPORTER_ASSERT(reporter, !rtProxy->asTextureProxy());
75             REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
76             clean_up_wrapped_rt(gpu, std::move(sProxy));
77         }
78     }
79 
80     {
81         // Internal offscreen render target.
82         sk_sp<GrSurfaceProxy> sProxy(make_offscreen_rt(proxyProvider, kSize, kColorType));
83         if (sProxy) {
84             // Both RenderTarget and Texture
85             GrRenderTargetProxy* rtProxy = sProxy->asRenderTargetProxy();
86             REPORTER_ASSERT(reporter, rtProxy);
87             GrTextureProxy* tProxy = rtProxy->asTextureProxy();
88             REPORTER_ASSERT(reporter, tProxy);
89             REPORTER_ASSERT(reporter, tProxy->asRenderTargetProxy() == rtProxy);
90             REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
91         }
92     }
93 
94     {
95         // Internal offscreen render target - but through GrTextureProxy
96         sk_sp<GrSurfaceProxy> sProxy(
97                 make_texture(proxyProvider, kSize, kColorType, GrRenderable::kYes));
98         if (sProxy) {
99             // Both RenderTarget and Texture
100             GrTextureProxy* tProxy = sProxy->asTextureProxy();
101             REPORTER_ASSERT(reporter, tProxy);
102             GrRenderTargetProxy* rtProxy = tProxy->asRenderTargetProxy();
103             REPORTER_ASSERT(reporter, rtProxy);
104             REPORTER_ASSERT(reporter, rtProxy->asTextureProxy() == tProxy);
105             REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
106         }
107     }
108 
109     {
110         // force no-RT
111         sk_sp<GrSurfaceProxy> sProxy(
112                 make_texture(proxyProvider, kSize, kColorType, GrRenderable::kNo));
113         if (sProxy) {
114             // Texture-only
115             GrTextureProxy* tProxy = sProxy->asTextureProxy();
116             REPORTER_ASSERT(reporter, tProxy);
117             REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
118             REPORTER_ASSERT(reporter, !tProxy->asRenderTargetProxy());
119         }
120     }
121 }
122 
123 // Test converting between RenderTargetProxies and TextureProxies for deferred
124 // Proxies
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DefferredProxyConversionTest,reporter,ctxInfo)125 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DefferredProxyConversionTest, reporter, ctxInfo) {
126     auto context = ctxInfo.directContext();
127     GrProxyProvider* proxyProvider = context->priv().proxyProvider();
128     const GrCaps* caps = context->priv().caps();
129 
130     static constexpr SkISize kDims = {64, 64};
131 
132     const GrBackendFormat format = caps->getDefaultBackendFormat(GrColorType::kRGBA_8888,
133                                                                  GrRenderable::kYes);
134     {
135         sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(
136                 format, kDims, GrRenderable::kYes, 1, GrMipmapped::kNo, SkBackingFit::kApprox,
137                 SkBudgeted::kYes, GrProtected::kNo);
138 
139         // Both RenderTarget and Texture
140         GrRenderTargetProxy* rtProxy = proxy->asRenderTargetProxy();
141         REPORTER_ASSERT(reporter, rtProxy);
142         GrTextureProxy* tProxy = rtProxy->asTextureProxy();
143         REPORTER_ASSERT(reporter, tProxy);
144         REPORTER_ASSERT(reporter, tProxy->asRenderTargetProxy() == rtProxy);
145         REPORTER_ASSERT(reporter, rtProxy->asRenderTargetProxy() == rtProxy);
146     }
147 
148     {
149         sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(
150                 format, kDims, GrRenderable::kYes, 1, GrMipmapped::kNo, SkBackingFit::kApprox,
151                 SkBudgeted::kYes, GrProtected::kNo);
152 
153         // Both RenderTarget and Texture - but via GrTextureProxy
154         GrTextureProxy* tProxy = proxy->asTextureProxy();
155         REPORTER_ASSERT(reporter, tProxy);
156         GrRenderTargetProxy* rtProxy = tProxy->asRenderTargetProxy();
157         REPORTER_ASSERT(reporter, rtProxy);
158         REPORTER_ASSERT(reporter, rtProxy->asTextureProxy() == tProxy);
159         REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
160     }
161 
162     {
163         sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(
164                 format, kDims, GrRenderable::kNo, 1, GrMipmapped::kNo, SkBackingFit::kApprox,
165                 SkBudgeted::kYes, GrProtected::kNo);
166         // Texture-only
167         GrTextureProxy* tProxy = proxy->asTextureProxy();
168         REPORTER_ASSERT(reporter, tProxy);
169         REPORTER_ASSERT(reporter, tProxy->asTextureProxy() == tProxy);
170         REPORTER_ASSERT(reporter, !tProxy->asRenderTargetProxy());
171     }
172 }
173