diff options
Diffstat (limited to 'src/gpu')
-rwxr-xr-x | src/gpu/GrContextFactory.cpp | 7 | ||||
-rw-r--r-- | src/gpu/GrContextFactory.h | 8 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 18 | ||||
-rw-r--r-- | src/gpu/gl/GrGLInterface.cpp | 49 | ||||
-rw-r--r-- | src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp | 64 |
5 files changed, 49 insertions, 97 deletions
diff --git a/src/gpu/GrContextFactory.cpp b/src/gpu/GrContextFactory.cpp index 3f7fd4abd9..b7e48254c8 100755 --- a/src/gpu/GrContextFactory.cpp +++ b/src/gpu/GrContextFactory.cpp @@ -95,11 +95,8 @@ GrContextFactory::ContextInfo GrContextFactory::getContextInfo(GLContextType typ break; #endif #if SK_COMMAND_BUFFER - case kCommandBufferES2_GLContextType: - glCtx.reset(SkCommandBufferGLContext::CreateES2()); - break; - case kCommandBufferES3_GLContextType: - glCtx.reset(SkCommandBufferGLContext::CreateES3()); + case kCommandBuffer_GLContextType: + glCtx.reset(SkCommandBufferGLContext::Create()); break; #endif #if SK_MESA diff --git a/src/gpu/GrContextFactory.h b/src/gpu/GrContextFactory.h index ca4420e182..7afa3108c6 100644 --- a/src/gpu/GrContextFactory.h +++ b/src/gpu/GrContextFactory.h @@ -34,9 +34,7 @@ public: kANGLE_GL_GLContextType, //! ANGLE on OpenGL OpenGL ES context. #endif #if SK_COMMAND_BUFFER - kCommandBufferES2_GLContextType, //! Chromium command buffer OpenGL ES 2.0 context. - kCommandBufferES3_GLContextType, //! Chromium command buffer OpenGL ES 3.0 context. - //! Not ready for production. + kCommandBuffer_GLContextType, //! Chromium command buffer OpenGL ES context. #endif #if SK_MESA kMESA_GLContextType, //! MESA OpenGL context @@ -84,10 +82,8 @@ public: return "angle-gl"; #endif #if SK_COMMAND_BUFFER - case kCommandBufferES2_GLContextType: + case kCommandBuffer_GLContextType: return "commandbuffer"; - case kCommandBufferES3_GLContextType: - return "commandbuffer3"; #endif #if SK_MESA case kMESA_GLContextType: diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index 22aa13f0ab..5baed59f14 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -363,12 +363,12 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, } else { // Unextended GLES2 doesn't have any buffer mapping. fMapBufferFlags = kNone_MapBufferType; - if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_EXT_map_buffer_range")) { - fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag; - fMapBufferType = kMapBufferRange_MapBufferType; - } else if (ctxInfo.hasExtension("GL_CHROMIUM_map_sub")) { + if (ctxInfo.hasExtension("GL_CHROMIUM_map_sub")) { fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag; fMapBufferType = kChromium_MapBufferType; + } else if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_EXT_map_buffer_range")) { + fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag; + fMapBufferType = kMapBufferRange_MapBufferType; } else if (ctxInfo.hasExtension("GL_OES_mapbuffer")) { fMapBufferFlags = kCanMap_MapFlag; fMapBufferType = kMapBuffer_MapBufferType; @@ -523,16 +523,6 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, fTextureSwizzleSupport = false; } - // TODO: remove after command buffer supports full ES 3.0. - if (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3, 0) && - kChromium_GrGLDriver == ctxInfo.driver()) { - fSupportsInstancedDraws = false; - fTextureSwizzleSupport = false; - SkASSERT(ctxInfo.hasExtension("GL_CHROMIUM_map_sub")); - fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag; - fMapBufferType = kChromium_MapBufferType; - } - // Requires fTextureRedSupport, fTextureSwizzleSupport, msaa support, ES compatibility have // already been detected. this->initConfigTable(ctxInfo, gli, glslCaps); diff --git a/src/gpu/gl/GrGLInterface.cpp b/src/gpu/gl/GrGLInterface.cpp index 7c7744792d..84c51fb252 100644 --- a/src/gpu/gl/GrGLInterface.cpp +++ b/src/gpu/gl/GrGLInterface.cpp @@ -216,15 +216,6 @@ bool GrGLInterface::validate() const { if (GR_GL_INVALID_VER == glVer) { RETURN_FALSE_INTERFACE } - // TODO: Remove this once command buffer implements full ES3. - bool ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3 = false; - if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) { - const GrGLubyte* rendererUByte; - GR_GL_CALL_RET(this, rendererUByte, GetString(GR_GL_RENDERER)); - const char* renderer = reinterpret_cast<const char*>(rendererUByte); - ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3 = - 0 == strcmp(renderer, "Chromium"); - } // Now check that baseline ES/Desktop fns not covered above are present // and that we have fn pointers for any advertised fExtensions that we will @@ -315,10 +306,8 @@ bool GrGLInterface::validate() const { } } } else if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_texture_storage")) { - if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { - if (nullptr == fFunctions.fTexStorage2D) { - RETURN_FALSE_INTERFACE - } + if (nullptr == fFunctions.fTexStorage2D) { + RETURN_FALSE_INTERFACE } } @@ -491,11 +480,9 @@ bool GrGLInterface::validate() const { if (glVer >= GR_GL_VER(3,0) || (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_map_buffer_range")) || (kGL_GrGLStandard == fStandard && fExtensions.has("GL_ARB_map_buffer_range"))) { - if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { - if (nullptr == fFunctions.fMapBufferRange || - nullptr == fFunctions.fFlushMappedBufferRange) { - RETURN_FALSE_INTERFACE; - } + if (nullptr == fFunctions.fMapBufferRange || + nullptr == fFunctions.fFlushMappedBufferRange) { + RETURN_FALSE_INTERFACE; } } @@ -583,16 +570,14 @@ bool GrGLInterface::validate() const { nullptr == fFunctions.fDrawElementsInstanced) { RETURN_FALSE_INTERFACE } - } + } } else if (kGLES_GrGLStandard == fStandard) { - if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { - if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_draw_instanced")) { - if (nullptr == fFunctions.fDrawArraysInstanced || - nullptr == fFunctions.fDrawElementsInstanced) { - RETURN_FALSE_INTERFACE - } + if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_draw_instanced")) { + if (nullptr == fFunctions.fDrawArraysInstanced || + nullptr == fFunctions.fDrawElementsInstanced) { + RETURN_FALSE_INTERFACE } - } + } } if (kGL_GrGLStandard == fStandard) { @@ -600,15 +585,13 @@ bool GrGLInterface::validate() const { if (nullptr == fFunctions.fVertexAttribDivisor) { RETURN_FALSE_INTERFACE } - } + } } else if (kGLES_GrGLStandard == fStandard) { - if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { - if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_instanced_arrays")) { - if (nullptr == fFunctions.fVertexAttribDivisor) { - RETURN_FALSE_INTERFACE - } + if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_instanced_arrays")) { + if (nullptr == fFunctions.fVertexAttribDivisor) { + RETURN_FALSE_INTERFACE } - } + } } if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || diff --git a/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp b/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp index 946cd4af2c..cf9da9365b 100644 --- a/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp +++ b/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp @@ -33,7 +33,6 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void); #define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) #define EGL_SURFACE_TYPE 0x3033 #define EGL_PBUFFER_BIT 0x0001 -#define EGL_WINDOW_BIT 0x0004 #define EGL_RENDERABLE_TYPE 0x3040 #define EGL_RED_SIZE 0x3024 #define EGL_GREEN_SIZE 0x3023 @@ -53,11 +52,6 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void); #endif -#ifndef EGL_OPENGL_ES3_BIT -// Part of EGL 1.5, typical headers are 1.4. -#define EGL_OPENGL_ES3_BIT 0x0040 -#endif - typedef EGLDisplay (*GetDisplayProc)(EGLNativeDisplayType display_id); typedef EGLBoolean (*InitializeProc)(EGLDisplay dpy, EGLint *major, EGLint *minor); typedef EGLBoolean (*TerminateProc)(EGLDisplay dpy); @@ -143,15 +137,14 @@ const GrGLInterface* GrGLCreateCommandBufferInterface() { return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc); } -SkCommandBufferGLContext::SkCommandBufferGLContext(ContextVersion minContextVersion) +SkCommandBufferGLContext::SkCommandBufferGLContext() : fContext(EGL_NO_CONTEXT) , fDisplay(EGL_NO_DISPLAY) , fSurface(EGL_NO_SURFACE) { static const EGLint configAttribs[] = { EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, - EGL_RENDERABLE_TYPE, minContextVersion == kGLES3_ContextVersion ? EGL_OPENGL_ES3_BIT - : EGL_OPENGL_ES2_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, @@ -165,15 +158,13 @@ SkCommandBufferGLContext::SkCommandBufferGLContext(ContextVersion minContextVers EGL_NONE }; - initializeGLContext(minContextVersion, nullptr, configAttribs, surfaceAttribs); + initializeGLContext(nullptr, configAttribs, surfaceAttribs); } SkCommandBufferGLContext::SkCommandBufferGLContext(void* nativeWindow, int msaaSampleCount) { static const EGLint surfaceAttribs[] = { EGL_NONE }; EGLint configAttribs[] = { - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, @@ -188,11 +179,10 @@ SkCommandBufferGLContext::SkCommandBufferGLContext(void* nativeWindow, int msaaS configAttribs[12] = EGL_NONE; } - initializeGLContext(kGLES2_ContextVersion, nativeWindow, configAttribs, surfaceAttribs); + initializeGLContext(nativeWindow, configAttribs, surfaceAttribs); } -void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVersion, - void* nativeWindow, const int* configAttribs, +void SkCommandBufferGLContext::initializeGLContext(void* nativeWindow, const int* configAttribs, const int* surfaceAttribs) { LoadCommandBufferOnce(); if (!gfFunctionsLoadedSuccessfully) { @@ -201,14 +191,16 @@ void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVers } // Make sure CHROMIUM_path_rendering is enabled for NVPR support. - sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering --enable-unsafe-es3-apis"); + sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering"); fDisplay = gfGetDisplay(EGL_DEFAULT_DISPLAY); if (EGL_NO_DISPLAY == fDisplay) { SkDebugf("Command Buffer: Could not create EGL display.\n"); return; } - if (!gfInitialize(fDisplay, nullptr, nullptr)) { + EGLint majorVersion; + EGLint minorVersion; + if (!gfInitialize(fDisplay, &majorVersion, &minorVersion)) { SkDebugf("Command Buffer: Could not initialize EGL display.\n"); this->destroyGLContext(); return; @@ -216,7 +208,7 @@ void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVers EGLint numConfigs; if (!gfChooseConfig(fDisplay, configAttribs, static_cast<EGLConfig*>(&fConfig), 1, - &numConfigs) || numConfigs < 1) { + &numConfigs) || numConfigs != 1) { SkDebugf("Command Buffer: Could not choose EGL config.\n"); this->destroyGLContext(); return; @@ -239,7 +231,7 @@ void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVers } static const EGLint contextAttribs[] = { - EGL_CONTEXT_CLIENT_VERSION, minContextVersion == kGLES3_ContextVersion ? 3 : 2, + EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; fContext = gfCreateContext(fDisplay, static_cast<EGLConfig>(fConfig), nullptr, contextAttribs); @@ -279,28 +271,22 @@ void SkCommandBufferGLContext::destroyGLContext() { if (!gfFunctionsLoadedSuccessfully) { return; } - if (EGL_NO_DISPLAY == fDisplay) { - return; - } + if (fDisplay) { + gfMakeCurrent(fDisplay, 0, 0, 0); - if (EGL_NO_CONTEXT != fContext) { - gfDestroyContext(fDisplay, fContext); - fContext = EGL_NO_CONTEXT; - } - // Call MakeCurrent after destroying the context, so that the EGL implementation knows - // that the context is not used anymore after it is released from being current. - // This way command buffer does not need to abandon the context before destruction, and no - // client-side errors are printed. - gfMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - - if (EGL_NO_SURFACE != fSurface) { - gfDestroySurface(fDisplay, fSurface); - fSurface = EGL_NO_SURFACE; + if (fContext) { + gfDestroyContext(fDisplay, fContext); + fContext = EGL_NO_CONTEXT; + } + + if (fSurface) { + gfDestroySurface(fDisplay, fSurface); + fSurface = EGL_NO_SURFACE; + } + + gfTerminate(fDisplay); + fDisplay = EGL_NO_DISPLAY; } - // The display is likely to be used again for another test, do not call gfTerminate. Also, - // terminating could imply terminating the "host" EGL inside command buffer. This would - // terminate also EGL that this thread might use outside of command buffer. - fDisplay = EGL_NO_DISPLAY; } void SkCommandBufferGLContext::onPlatformMakeCurrent() const { |