diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-24 20:49:44 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-24 20:49:44 +0000 |
commit | d8ed85101ee77ad2cb0c186a79d197698a75d246 (patch) | |
tree | 0de059817c9954a768b85c15a972a5b09b33cb8b /include/gpu | |
parent | 8f2201144945be6693dd4954c2cc89e085f14ef8 (diff) |
Turn NVPR on by default (but off in tools).
BUG=skia:2042
Committed: http://code.google.com/p/skia/source/detail?r=13164
R=robertphillips@google.com
Author: bsalomon@google.com
Review URL: https://codereview.chromium.org/144003006
git-svn-id: http://skia.googlecode.com/svn/trunk@13176 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/gpu')
-rw-r--r-- | include/gpu/GrContextFactory.h | 31 | ||||
-rw-r--r-- | include/gpu/gl/GrGLConfig.h | 8 | ||||
-rw-r--r-- | include/gpu/gl/GrGLExtensions.h | 14 | ||||
-rw-r--r-- | include/gpu/gl/GrGLInterface.h | 9 |
4 files changed, 47 insertions, 15 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; diff --git a/include/gpu/gl/GrGLConfig.h b/include/gpu/gl/GrGLConfig.h index 842c303f38..444be00f15 100644 --- a/include/gpu/gl/GrGLConfig.h +++ b/include/gpu/gl/GrGLConfig.h @@ -93,10 +93,6 @@ * stencil formats as attachments. If the FBO is complete we will assume * subsequent attachments with the same formats are complete as well. * - * GR_GL_USE_NV_PATH_RENDERING: Enable experimental support for - * GL_NV_path_rendering. There are known issues with clipping, non-AA paths, and - * perspective. - * * GR_GL_MUST_USE_VBO: Indicates that all vertices and indices must be rendered * from VBOs. Chromium's command buffer doesn't allow glVertexAttribArray with * ARARY_BUFFER 0 bound or glDrawElements with ELEMENT_ARRAY_BUFFER 0 bound. @@ -158,10 +154,6 @@ #define GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT 0 #endif -#if !defined(GR_GL_USE_NV_PATH_RENDERING) - #define GR_GL_USE_NV_PATH_RENDERING 0 -#endif - #if !defined(GR_GL_MUST_USE_VBO) #define GR_GL_MUST_USE_VBO 0 #endif diff --git a/include/gpu/gl/GrGLExtensions.h b/include/gpu/gl/GrGLExtensions.h index c9f59a2702..76516cf11f 100644 --- a/include/gpu/gl/GrGLExtensions.h +++ b/include/gpu/gl/GrGLExtensions.h @@ -19,12 +19,17 @@ struct GrGLInterface; * queried. It supports both glGetString- and glGetStringi-style extension string APIs and will * use the latter if it is available. */ -class GrGLExtensions : public SkNoncopyable { +class GrGLExtensions { public: GrGLExtensions() : fInitialized(false), fStrings(SkNEW(SkTArray<SkString>)) {} + GrGLExtensions(const GrGLExtensions&); + + GrGLExtensions& operator=(const GrGLExtensions&); + void swap(GrGLExtensions* that) { fStrings.swap(&that->fStrings); + SkTSwap(fInitialized, that->fInitialized); } /** @@ -42,7 +47,12 @@ public: /** * Queries whether an extension is present. This will fail if init() has not been called. */ - bool has(const char*) const; + bool has(const char[]) const; + + /** + * Removes an extension if present. Returns true if the extension was present before the call. + */ + bool remove(const char[]); void reset() { fStrings->reset(); } diff --git a/include/gpu/gl/GrGLInterface.h b/include/gpu/gl/GrGLInterface.h index cd7c6bdf60..f5bcd16682 100644 --- a/include/gpu/gl/GrGLInterface.h +++ b/include/gpu/gl/GrGLInterface.h @@ -72,7 +72,11 @@ typedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*); typedef intptr_t GrGLInterfaceCallbackData; #endif -/* +/** Function that returns a new interface identical to "interface" but without support for + GL_NV_path_rendering. */ +const GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface*); + +/** * GrContext uses the following interface to make all calls into OpenGL. When a * GrContext is created it is given a GrGLInterface. The interface's function * pointers must be valid for the OpenGL context associated with the GrContext. @@ -112,6 +116,8 @@ public: GrGLInterface(); + static GrGLInterface* NewClone(const GrGLInterface*); + // Validates that the GrGLInterface supports its advertised standard. This means the necessary // function pointers have been initialized for both the GL version and any advertised // extensions. @@ -358,7 +364,6 @@ public: GLPtr<GrGLPointAlongPathProc> fPointAlongPath; } fFunctions; - // Temporary workaround aliases to keep Chromium GrGLInterface factories compiling until they // assign the members of fFunctions. GLPtrAlias<GrGLActiveTextureProc> fActiveTexture; |