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 DEF_GPUTEST(GrContextFactory_NVPRContextOptionHasPathRenderingSupport, reporter, /*factory*/) { 17 // Test that if NVPR is requested, the context always has path rendering 18 // or the context creation fails. 19 GrContextFactory testFactory; 20 // Test that if NVPR is possible, caps are in sync. 21 for (int i = 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { 22 GrContextFactory::GLContextType glCtxType = static_cast<GrContextFactory::GLContextType>(i); 23 GrContext* context = testFactory.get(glCtxType, 24 GrContextFactory::kEnableNVPR_GLContextOptions); 25 if (!context) { 26 continue; 27 } 28 REPORTER_ASSERT( 29 reporter, 30 context->caps()->shaderCaps()->pathRenderingSupport()); 31 } 32 } 33 34 DEF_GPUTEST(GrContextFactory_NoPathRenderingUnlessNVPRRequested, reporter, /*factory*/) { 35 // Test that if NVPR is not requested, the context never has path rendering support. 36 37 GrContextFactory testFactory; 38 for (int i = 0; i <= GrContextFactory::kLastGLContextType; ++i) { 39 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType)i; 40 GrContext* context = testFactory.get(glCtxType); 41 if (context) { 42 REPORTER_ASSERT( 43 reporter, 44 !context->caps()->shaderCaps()->pathRenderingSupport()); 45 } 46 } 47 } 48 49 DEF_GPUTEST(GrContextFactory_abandon, reporter, /*factory*/) { 50 GrContextFactory testFactory; 51 for (int i = 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { 52 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i; 53 GrContextFactory::ContextInfo info1 = 54 testFactory.getContextInfo(glCtxType); 55 if (!info1.fGrContext) { 56 continue; 57 } 58 REPORTER_ASSERT(reporter, info1.fGLContext); 59 // Ref for comparison. The API does not explicitly say that this stays alive. 60 info1.fGrContext->ref(); 61 testFactory.abandonContexts(); 62 63 // Test that we get different context after abandon. 64 GrContextFactory::ContextInfo info2 = 65 testFactory.getContextInfo(glCtxType); 66 REPORTER_ASSERT(reporter, info2.fGrContext); 67 REPORTER_ASSERT(reporter, info2.fGLContext); 68 REPORTER_ASSERT(reporter, info1.fGrContext != info2.fGrContext); 69 // fGLContext should also change, but it also could get the same address. 70 71 info1.fGrContext->unref(); 72 } 73 } 74 75 #endif 76