diff options
Diffstat (limited to 'include/gpu/GrContextFactory.h')
-rw-r--r-- | include/gpu/GrContextFactory.h | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/include/gpu/GrContextFactory.h b/include/gpu/GrContextFactory.h index 389c398c7c..333afd29f6 100644 --- a/include/gpu/GrContextFactory.h +++ b/include/gpu/GrContextFactory.h @@ -26,12 +26,15 @@ * GrContexts backed by different types of GL contexts. It manages creating the * GL context and a GrContext that uses it. The GL/Gr contexts persist until the * factory is destroyed (though the caller can always grab a ref on the returned - * GrContext to make it outlive the factory). + * Gr and GL contexts to make them outlive the factory). */ class GrContextFactory : public SkNoncopyable { public: /** - * Types of GL contexts supported. + * Types of GL contexts supported. For historical and testing reasons the native GrContext will + * not use "GL_NV_path_rendering" even when the driver supports it. There is a separate context + * type that does not remove NVPR support and which will fail when the driver does not support + * the extension. */ enum GLContextType { kNative_GLContextType, @@ -41,6 +44,9 @@ public: #if SK_MESA kMESA_GLContextType, #endif + /** Similar to kNative but does not filter NVPR. It will fail if the GL driver does not + support NVPR */ + kNVPR_GLContextType, kNull_GLContextType, kDebug_GLContextType, @@ -73,6 +79,8 @@ public: case kMESA_GLContextType: return "mesa"; #endif + case kNVPR_GLContextType: + return "nvpr"; case kDebug_GLContextType: return "debug"; default: @@ -87,6 +95,7 @@ public: void destroyContexts() { for (int i = 0; i < fContexts.count(); ++i) { + fContexts[i].fGLContext->makeCurrent(); fContexts[i].fGrContext->unref(); fContexts[i].fGLContext->unref(); } @@ -107,6 +116,7 @@ public: SkAutoTUnref<SkGLContextHelper> glCtx; SkAutoTUnref<GrContext> grCtx; switch (type) { + case kNVPR_GLContextType: // fallthru case kNative_GLContextType: glCtx.reset(SkNEW(SkNativeGLContext)); break; @@ -134,7 +144,22 @@ public: if (!glCtx.get()->init(kBogusSize, kBogusSize)) { return NULL; } - GrBackendContext p3dctx = reinterpret_cast<GrBackendContext>(glCtx.get()->gl()); + + // Ensure NVPR is available for the NVPR type and block it from other types. + SkAutoTUnref<const GrGLInterface> glInterface(SkRef(glCtx.get()->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)); if (!grCtx.get()) { return NULL; |