diff options
author | 2014-11-13 11:12:41 -0800 | |
---|---|---|
committer | 2014-11-13 11:12:41 -0800 | |
commit | e4545210c950f98d9fa20f51bc1be6c5591534bd (patch) | |
tree | 0485f434709c8c1ad9ffb43ea5a63e5c013fc71b /src/gpu/GrContextFactory.cpp | |
parent | 912c9ec6ee8e28724861f0ac2b746e970895f745 (diff) |
Cleanup GrContextFactory and make it's subclasses private
Review URL: https://codereview.chromium.org/723183002
Diffstat (limited to 'src/gpu/GrContextFactory.cpp')
-rwxr-xr-x | src/gpu/GrContextFactory.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
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<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; +} |