Home | History | Annotate | Download | only in tests
      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