Index: include/gpu/GrContextFactory.h |
diff --git a/include/gpu/GrContextFactory.h b/include/gpu/GrContextFactory.h |
index 389c398c7c5720166c493503879d9e34ce687b93..d56d74d272539d880b95c8e1717086eec9c9344b 100644 |
--- a/include/gpu/GrContextFactory.h |
+++ b/include/gpu/GrContextFactory.h |
@@ -26,14 +26,19 @@ |
* 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 { |
robertphillips
2014/01/22 20:12:06
remove this comment since it appears above?
bsalomon
2014/01/23 16:16:09
oops, done
|
+ // For historical and testing reasons the native context will not expose GL_NV_path_rendering |
+ // even when the driver does. There is a a |
kNative_GLContextType, |
#if SK_ANGLE |
kANGLE_GLContextType, |
@@ -41,6 +46,9 @@ public: |
#if SK_MESA |
kMESA_GLContextType, |
#endif |
robertphillips
2014/01/22 20:12:06
no,t?
bsalomon
2014/01/23 16:16:09
Done.
|
+ /** Similar to kNative but does no,t filter NVPR. It will fail if the GL driver does not |
+ support NVPR */ |
+ kNVPR_GLContextType, |
kNull_GLContextType, |
kDebug_GLContextType, |
@@ -73,6 +81,8 @@ public: |
case kMESA_GLContextType: |
return "mesa"; |
#endif |
+ case kNVPR_GLContextType: |
+ return "nvpr"; |
case kDebug_GLContextType: |
return "debug"; |
default: |
@@ -107,6 +117,7 @@ public: |
SkAutoTUnref<SkGLContextHelper> glCtx; |
SkAutoTUnref<GrContext> grCtx; |
switch (type) { |
+ case kNVPR_GLContextType: // fallthru |
case kNative_GLContextType: |
glCtx.reset(SkNEW(SkNativeGLContext)); |
break; |
@@ -134,7 +145,21 @@ 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; |
+ } |
+ } |
+ |
+ GrBackendContext p3dctx = reinterpret_cast<GrBackendContext>(glInterface.get()); |
grCtx.reset(GrContext::Create(kOpenGL_GrBackend, p3dctx)); |
if (!grCtx.get()) { |
return NULL; |