Index: include/gpu/GrContextFactory.h |
diff --git a/include/gpu/GrContextFactory.h b/include/gpu/GrContextFactory.h |
index 389c398c7c5720166c493503879d9e34ce687b93..333afd29f6b71b0346079346ded27307bc673f4a 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; |