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