Index: src/gpu/GrContextFactory.cpp |
diff --git a/src/gpu/GrContextFactory.cpp b/src/gpu/GrContextFactory.cpp |
new file mode 100755 |
index 0000000000000000000000000000000000000000..1a3864ac143112ab7c01f763433b2c832a044e85 |
--- /dev/null |
+++ b/src/gpu/GrContextFactory.cpp |
@@ -0,0 +1,89 @@ |
+ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "GrContextFactory.h" |
+ |
+#if SK_ANGLE |
+ #include "gl/angle/SkANGLEGLContext.h" |
+#endif |
+#include "gl/debug/SkDebugGLContext.h" |
+#if SK_MESA |
+ #include "gl/mesa/SkMesaGLContext.h" |
+#endif |
+#include "gl/SkGLContext.h" |
+#include "gl/SkNullGLContext.h" |
+ |
+ |
+GrContext* GrContextFactory::get(GLContextType type, GrGLStandard forcedGpuAPI) { |
+ for (int i = 0; i < fContexts.count(); ++i) { |
+ if (forcedGpuAPI != kNone_GrGLStandard && |
+ forcedGpuAPI != fContexts[i].fGLContext->gl()->fStandard) |
+ continue; |
+ |
+ if (fContexts[i].fType == type) { |
+ fContexts[i].fGLContext->makeCurrent(); |
+ return fContexts[i].fGrContext; |
+ } |
+ } |
+ SkAutoTUnref<SkGLContext> glCtx; |
+ SkAutoTUnref<GrContext> grCtx; |
+ switch (type) { |
+ case kNVPR_GLContextType: // fallthru |
+ case kNative_GLContextType: |
+ glCtx.reset(SkCreatePlatformGLContext(forcedGpuAPI)); |
+ break; |
+#ifdef SK_ANGLE |
+ case kANGLE_GLContextType: |
+ glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI)); |
+ break; |
+#endif |
+#ifdef SK_MESA |
+ case kMESA_GLContextType: |
+ glCtx.reset(SkMesaGLContext::Create(forcedGpuAPI)); |
+ break; |
+#endif |
+ case kNull_GLContextType: |
+ glCtx.reset(SkNullGLContext::Create(forcedGpuAPI)); |
+ break; |
+ case kDebug_GLContextType: |
+ glCtx.reset(SkDebugGLContext::Create(forcedGpuAPI)); |
+ break; |
+ } |
+ if (NULL == glCtx.get()) { |
+ return NULL; |
+ } |
+ |
+ SkASSERT(glCtx->isValid()); |
+ |
+ // Ensure NVPR is available for the NVPR type and block it from other types. |
+ SkAutoTUnref<const GrGLInterface> glInterface(SkRef(glCtx->gl())); |
+ if (kNVPR_GLContextType == type) { |
+ if (!glInterface->hasExtension("GL_NV_path_rendering")) { |
+ return NULL; |
+ } |
+ } else { |
+ glInterface.reset(GrGLInterfaceRemoveNVPR(glInterface)); |
+ if (!glInterface) { |
+ return NULL; |
+ } |
+ } |
+ |
+ glCtx->makeCurrent(); |
+ GrBackendContext p3dctx = reinterpret_cast<GrBackendContext>(glInterface.get()); |
+ grCtx.reset(GrContext::Create(kOpenGL_GrBackend, p3dctx, &fGlobalOptions)); |
+ if (!grCtx.get()) { |
+ return NULL; |
+ } |
+ GPUContext& ctx = fContexts.push_back(); |
+ ctx.fGLContext = glCtx.get(); |
+ ctx.fGLContext->ref(); |
+ ctx.fGrContext = grCtx.get(); |
+ ctx.fGrContext->ref(); |
+ ctx.fType = type; |
+ return ctx.fGrContext; |
+} |