From e4545210c950f98d9fa20f51bc1be6c5591534bd Mon Sep 17 00:00:00 2001 From: djsollen Date: Thu, 13 Nov 2014 11:12:41 -0800 Subject: Cleanup GrContextFactory and make it's subclasses private Review URL: https://codereview.chromium.org/723183002 --- src/gpu/GrContextFactory.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 src/gpu/GrContextFactory.cpp (limited to 'src/gpu/GrContextFactory.cpp') diff --git a/src/gpu/GrContextFactory.cpp b/src/gpu/GrContextFactory.cpp new file mode 100755 index 0000000000..1a3864ac14 --- /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 glCtx; + SkAutoTUnref 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 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(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; +} -- cgit v1.2.3