Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2011 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 #include "SkTypes.h"
      9 
     10 #if SK_SUPPORT_GPU
     11 
     12 #include "GrContextFactory.h"
     13 #include "GrCaps.h"
     14 #include "Test.h"
     15 
     16 using namespace sk_gpu_test;
     17 
     18 DEF_GPUTEST(GrContextFactory_NVPRContextOptionHasPathRenderingSupport, reporter, /*factory*/) {
     19     // Test that if NVPR is requested, the context always has path rendering
     20     // or the context creation fails.
     21     GrContextFactory testFactory;
     22     // Test that if NVPR is possible, caps are in sync.
     23     for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
     24         GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
     25         GrContext* context = testFactory.get(ctxType,
     26                                            GrContextFactory::ContextOverrides::kRequireNVPRSupport);
     27         if (!context) {
     28             continue;
     29         }
     30         REPORTER_ASSERT(
     31             reporter,
     32             context->caps()->shaderCaps()->pathRenderingSupport());
     33     }
     34 }
     35 
     36 DEF_GPUTEST(GrContextFactory_NoPathRenderingIfNVPRDisabled, reporter, /*factory*/) {
     37     // Test that if NVPR is explicitly disabled, the context has no path rendering support.
     38 
     39     GrContextFactory testFactory;
     40     for (int i = 0; i <= GrContextFactory::kLastContextType; ++i) {
     41         GrContextFactory::ContextType ctxType = (GrContextFactory::ContextType)i;
     42         GrContext* context =
     43             testFactory.get(ctxType, GrContextFactory::ContextOverrides::kDisableNVPR);
     44         if (context) {
     45             REPORTER_ASSERT(
     46                 reporter,
     47                 !context->caps()->shaderCaps()->pathRenderingSupport());
     48         }
     49     }
     50 }
     51 
     52 DEF_GPUTEST(GrContextFactory_RequiredSRGBSupport, reporter, /*factory*/) {
     53     // Test that if sRGB support is requested, the context always has that capability
     54     // or the context creation fails. Also test that if the creation fails, a context
     55     // created without that flag would not have had sRGB support.
     56     GrContextFactory testFactory;
     57     // Test that if sRGB is requested, caps are in sync.
     58     for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
     59         GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
     60         GrContext* context =
     61             testFactory.get(ctxType, GrContextFactory::ContextOverrides::kRequireSRGBSupport);
     62 
     63         if (context) {
     64             REPORTER_ASSERT(reporter, context->caps()->srgbSupport());
     65         } else {
     66             context = testFactory.get(ctxType);
     67             if (context) {
     68                 REPORTER_ASSERT(reporter, !context->caps()->srgbSupport());
     69             }
     70         }
     71     }
     72 }
     73 
     74 DEF_GPUTEST(GrContextFactory_abandon, reporter, /*factory*/) {
     75     GrContextFactory testFactory;
     76     for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
     77         GrContextFactory::ContextType ctxType = (GrContextFactory::ContextType) i;
     78         ContextInfo info1 = testFactory.getContextInfo(ctxType);
     79         if (!info1.grContext()) {
     80             continue;
     81         }
     82         REPORTER_ASSERT(reporter, info1.testContext());
     83          // Ref for comparison. The API does not explicitly say that this stays alive.
     84         info1.grContext()->ref();
     85         testFactory.abandonContexts();
     86 
     87         // Test that we get different context after abandon.
     88         ContextInfo info2 = testFactory.getContextInfo(ctxType);
     89         REPORTER_ASSERT(reporter, info2.grContext());
     90         REPORTER_ASSERT(reporter, info2.testContext());
     91 
     92         REPORTER_ASSERT(reporter, info1.grContext() != info2.grContext());
     93         // The GL context should also change, but it also could get the same address.
     94 
     95         info1.grContext()->unref();
     96     }
     97 }
     98 
     99 DEF_GPUTEST(GrContextFactory_sharedContexts, reporter, /*factory*/) {
    100     GrContextFactory testFactory;
    101 
    102     for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
    103         GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
    104         ContextInfo info1 = testFactory.getContextInfo(ctxType);
    105         if (!info1.grContext()) {
    106             continue;
    107         }
    108 
    109         // Ref for passing in. The API does not explicitly say that this stays alive.
    110         info1.grContext()->ref();
    111         testFactory.abandonContexts();
    112 
    113         // Test that creating a context in a share group with an abandoned context fails.
    114         ContextInfo info2 = testFactory.getSharedContextInfo(info1.grContext());
    115         REPORTER_ASSERT(reporter, !info2.grContext());
    116         info1.grContext()->unref();
    117 
    118         // Create a new base context
    119         ContextInfo info3 = testFactory.getContextInfo(ctxType);
    120         if (!info3.grContext()) {
    121             // Vulkan NexusPlayer bot fails here. Sigh.
    122             continue;
    123         }
    124 
    125         // Creating a context in a share group may fail, but should never crash.
    126         ContextInfo info4 = testFactory.getSharedContextInfo(info3.grContext());
    127         if (!info4.grContext()) {
    128             continue;
    129         }
    130         REPORTER_ASSERT(reporter, info3.grContext() != info4.grContext());
    131         REPORTER_ASSERT(reporter, info3.testContext() != info4.testContext());
    132 
    133         // Passing a different index should create a new (unique) context.
    134         ContextInfo info5 = testFactory.getSharedContextInfo(info3.grContext(), 1);
    135         REPORTER_ASSERT(reporter, info5.grContext());
    136         REPORTER_ASSERT(reporter, info5.testContext());
    137         REPORTER_ASSERT(reporter, info5.grContext() != info4.grContext());
    138         REPORTER_ASSERT(reporter, info5.testContext() != info4.testContext());
    139     }
    140 }
    141 
    142 #endif
    143