| 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;
|
|
|