1 /* 2 * Copyright 2012 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 #ifndef GrContextFactory_DEFINED 9 #define GrContextFactory_DEFINED 10 11 #if SK_ANGLE 12 #include "gl/SkANGLEGLContext.h" 13 #endif 14 #include "gl/SkDebugGLContext.h" 15 #if SK_MESA 16 #include "gl/SkMesaGLContext.h" 17 #endif 18 #include "gl/SkNativeGLContext.h" 19 #include "gl/SkNullGLContext.h" 20 21 #include "GrContext.h" 22 #include "SkTArray.h" 23 24 /** 25 * This is a simple class that is useful in test apps that use different 26 * GrContexts backed by different types of GL contexts. It manages creating the 27 * GL context and a GrContext that uses it. The GL/Gr contexts persist until the 28 * factory is destroyed (though the caller can always grab a ref on the returned 29 * GrContext to make it outlive the factory). 30 */ 31 class GrContextFactory : GrNoncopyable { 32 public: 33 /** 34 * Types of GL contexts supported. 35 */ 36 enum GLContextType { 37 kNative_GLContextType, 38 #if SK_ANGLE 39 kANGLE_GLContextType, 40 #endif 41 #if SK_MESA 42 kMESA_GLContextType, 43 #endif 44 kNull_GLContextType, 45 kDebug_GLContextType, 46 }; 47 48 GrContextFactory() { 49 } 50 51 ~GrContextFactory() { 52 for (int i = 0; i < fContexts.count(); ++i) { 53 fContexts[i].fGrContext->unref(); 54 fContexts[i].fGLContext->unref(); 55 } 56 } 57 58 /** 59 * Get a GrContext initalized with a type of GL context. 60 */ 61 GrContext* get(GLContextType type) { 62 63 for (int i = 0; i < fContexts.count(); ++i) { 64 if (fContexts[i].fType == type) { 65 return fContexts[i].fGrContext; 66 } 67 } 68 SkAutoTUnref<SkGLContext> glCtx; 69 SkAutoTUnref<GrContext> grCtx; 70 switch (type) { 71 case kNative_GLContextType: 72 glCtx.reset(SkNEW(SkNativeGLContext)); 73 break; 74 #ifdef SK_ANGLE 75 case kANGLE_GLContextType: 76 glCtx.reset(SkNEW(SkANGLEGLContext)); 77 break; 78 #endif 79 #ifdef SK_MESA 80 case kMESA_GLContextType: 81 glCtx.reset(SkNEW(SkMesaGLContext)); 82 break; 83 #endif 84 case kNull_GLContextType: 85 glCtx.reset(SkNEW(SkNullGLContext)); 86 break; 87 case kDebug_GLContextType: 88 glCtx.reset(SkNEW(SkDebugGLContext)); 89 break; 90 } 91 static const int kBogusSize = 1; 92 if (!glCtx.get()) { 93 return NULL; 94 } 95 if (!glCtx.get()->init(kBogusSize, kBogusSize)) { 96 return NULL; 97 } 98 GrBackendContext p3dctx = reinterpret_cast<GrBackendContext>(glCtx.get()->gl()); 99 grCtx.reset(GrContext::Create(kOpenGL_GrBackend, p3dctx)); 100 if (!grCtx.get()) { 101 return NULL; 102 } 103 GPUContext& ctx = fContexts.push_back(); 104 ctx.fGLContext = glCtx.get(); 105 ctx.fGLContext->ref(); 106 ctx.fGrContext = grCtx.get(); 107 ctx.fGrContext->ref(); 108 ctx.fType = type; 109 return ctx.fGrContext; 110 } 111 112 // Returns the GLContext of the given type. If it has not been created yet, 113 // NULL is returned instead. 114 SkGLContext* getGLContext(GLContextType type) { 115 for (int i = 0; i < fContexts.count(); ++i) { 116 if (fContexts[i].fType == type) { 117 return fContexts[i].fGLContext; 118 } 119 } 120 121 return NULL; 122 } 123 124 private: 125 struct GPUContext { 126 GLContextType fType; 127 SkGLContext* fGLContext; 128 GrContext* fGrContext; 129 }; 130 SkTArray<GPUContext, true> fContexts; 131 }; 132 133 #endif 134