1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrContextFactory_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrContextFactory_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ContextType.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/TestContext.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GL 19*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/gl/GLTestContext.h" 20*c8dee2aaSAndroid Build Coastguard Worker #endif 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 23*c8dee2aaSAndroid Build Coastguard Worker struct VulkanBackendContext; 24*c8dee2aaSAndroid Build Coastguard Worker } 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker namespace sk_gpu_test { 27*c8dee2aaSAndroid Build Coastguard Worker class ContextInfo; 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker /** 30*c8dee2aaSAndroid Build Coastguard Worker * This is a simple class that is useful in test apps that use different 31*c8dee2aaSAndroid Build Coastguard Worker * GrContexts backed by different types of GL contexts. It manages creating the 32*c8dee2aaSAndroid Build Coastguard Worker * GL context and a GrContext that uses it. The GL/Gr contexts persist until the 33*c8dee2aaSAndroid Build Coastguard Worker * factory is destroyed (though the caller can always grab a ref on the returned 34*c8dee2aaSAndroid Build Coastguard Worker * Gr and GL contexts to make them outlive the factory). 35*c8dee2aaSAndroid Build Coastguard Worker */ 36*c8dee2aaSAndroid Build Coastguard Worker class GrContextFactory : SkNoncopyable { 37*c8dee2aaSAndroid Build Coastguard Worker public: 38*c8dee2aaSAndroid Build Coastguard Worker using ContextType = skgpu::ContextType; 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker /** 41*c8dee2aaSAndroid Build Coastguard Worker * Overrides for the initial GrContextOptions provided at construction time, and required 42*c8dee2aaSAndroid Build Coastguard Worker * features that will cause context creation to fail if not present. 43*c8dee2aaSAndroid Build Coastguard Worker */ 44*c8dee2aaSAndroid Build Coastguard Worker enum class ContextOverrides { 45*c8dee2aaSAndroid Build Coastguard Worker kNone = 0x0, 46*c8dee2aaSAndroid Build Coastguard Worker kAvoidStencilBuffers = 0x1, 47*c8dee2aaSAndroid Build Coastguard Worker kFakeGLESVersionAs2 = 0x2, 48*c8dee2aaSAndroid Build Coastguard Worker kReducedShaders = 0x4, 49*c8dee2aaSAndroid Build Coastguard Worker }; 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker explicit GrContextFactory(const GrContextOptions& opts); 52*c8dee2aaSAndroid Build Coastguard Worker GrContextFactory(); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker ~GrContextFactory(); 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker void destroyContexts(); 57*c8dee2aaSAndroid Build Coastguard Worker void abandonContexts(); 58*c8dee2aaSAndroid Build Coastguard Worker void releaseResourcesAndAbandonContexts(); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker /** 61*c8dee2aaSAndroid Build Coastguard Worker * Get a context initialized with a type of GL context. It also makes the GL context current. 62*c8dee2aaSAndroid Build Coastguard Worker */ 63*c8dee2aaSAndroid Build Coastguard Worker ContextInfo getContextInfo(ContextType type, ContextOverrides = ContextOverrides::kNone); 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker /** 66*c8dee2aaSAndroid Build Coastguard Worker * Get a context in the same share group as the passed in GrContext, with the same type and 67*c8dee2aaSAndroid Build Coastguard Worker * overrides. To get multiple contexts in a single share group, pass the same shareContext, 68*c8dee2aaSAndroid Build Coastguard Worker * with different values for shareIndex. 69*c8dee2aaSAndroid Build Coastguard Worker */ 70*c8dee2aaSAndroid Build Coastguard Worker ContextInfo getSharedContextInfo(GrDirectContext* shareContext, uint32_t shareIndex = 0); 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker /** 73*c8dee2aaSAndroid Build Coastguard Worker * Get a GrContext initialized with a type of GL context. It also makes the GL context current. 74*c8dee2aaSAndroid Build Coastguard Worker */ 75*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* get(ContextType type, ContextOverrides overrides = ContextOverrides::kNone); getGlobalOptions()76*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& getGlobalOptions() const { return fGlobalOptions; } 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker private: 79*c8dee2aaSAndroid Build Coastguard Worker ContextInfo getContextInfoInternal(ContextType type, ContextOverrides overrides, 80*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* shareContext, uint32_t shareIndex); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker struct Context { 83*c8dee2aaSAndroid Build Coastguard Worker ContextType fType; 84*c8dee2aaSAndroid Build Coastguard Worker ContextOverrides fOverrides; 85*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions fOptions; 86*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi fBackend; 87*c8dee2aaSAndroid Build Coastguard Worker TestContext* fTestContext; 88*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* fGrContext; 89*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* fShareContext; 90*c8dee2aaSAndroid Build Coastguard Worker uint32_t fShareIndex; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker bool fAbandoned; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<Context, true> fContexts; 95*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GL 96*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GLTestContext> fSentinelGLContext; 97*c8dee2aaSAndroid Build Coastguard Worker #endif 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions fGlobalOptions; 100*c8dee2aaSAndroid Build Coastguard Worker }; 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker class ContextInfo { 103*c8dee2aaSAndroid Build Coastguard Worker public: 104*c8dee2aaSAndroid Build Coastguard Worker ContextInfo() = default; 105*c8dee2aaSAndroid Build Coastguard Worker ContextInfo(const ContextInfo&) = default; 106*c8dee2aaSAndroid Build Coastguard Worker ContextInfo& operator=(const ContextInfo&) = default; 107*c8dee2aaSAndroid Build Coastguard Worker type()108*c8dee2aaSAndroid Build Coastguard Worker skgpu::ContextType type() const { return fType; } backend()109*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi backend() const { return skgpu::ganesh::ContextTypeBackend(fType); } 110*c8dee2aaSAndroid Build Coastguard Worker directContext()111*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* directContext() const { return fContext; } testContext()112*c8dee2aaSAndroid Build Coastguard Worker TestContext* testContext() const { return fTestContext; } 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GL glContext()115*c8dee2aaSAndroid Build Coastguard Worker GLTestContext* glContext() const { 116*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(GrBackendApi::kOpenGL == this->backend()); 117*c8dee2aaSAndroid Build Coastguard Worker return static_cast<GLTestContext*>(fTestContext); 118*c8dee2aaSAndroid Build Coastguard Worker } 119*c8dee2aaSAndroid Build Coastguard Worker #endif 120*c8dee2aaSAndroid Build Coastguard Worker options()121*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& options() const { return fOptions; } 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker private: ContextInfo(skgpu::ContextType type,TestContext * testContext,GrDirectContext * context,const GrContextOptions & options)124*c8dee2aaSAndroid Build Coastguard Worker ContextInfo(skgpu::ContextType type, 125*c8dee2aaSAndroid Build Coastguard Worker TestContext* testContext, 126*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* context, 127*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& options) 128*c8dee2aaSAndroid Build Coastguard Worker : fType(type), fTestContext(testContext), fContext(context), fOptions(options) {} 129*c8dee2aaSAndroid Build Coastguard Worker 130*c8dee2aaSAndroid Build Coastguard Worker skgpu::ContextType fType = skgpu::ContextType::kGL; 131*c8dee2aaSAndroid Build Coastguard Worker // Valid until the factory destroys it via abandonContexts() or destroyContexts(). 132*c8dee2aaSAndroid Build Coastguard Worker TestContext* fTestContext = nullptr; 133*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* fContext = nullptr; 134*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions fOptions; 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker friend class GrContextFactory; 137*c8dee2aaSAndroid Build Coastguard Worker }; 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker } // namespace sk_gpu_test 140*c8dee2aaSAndroid Build Coastguard Worker 141*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITFIELD_CLASS_OPS(sk_gpu_test::GrContextFactory::ContextOverrides) 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker #endif 144