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