From 71c104761ad2f55eb7e2dfb743286de804e96493 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 12 Jul 2018 15:53:12 +0100 Subject: [PATCH] Fix sRGB handling on GLES * Check for EXT_sRGB_write_control extension before enabling. The equivalent extension EXT_framebuffer_sRGB on desktop GL has been core since 3.1. * Look for EGL_KHR_gl_colorspace extension and request an sRGB surface when creating window surfaces. --- renderdoc/driver/gl/egl_platform.cpp | 15 ++++++++++++++- renderdoc/driver/gl/gl_common.h | 4 +++- renderdoc/driver/gl/gl_debug.cpp | 3 ++- renderdoc/driver/gl/gl_outputwindow.cpp | 3 ++- renderdoc/driver/gl/gl_rendermesh.cpp | 3 ++- renderdoc/driver/gl/gl_renderstate.cpp | 3 ++- renderdoc/driver/gl/gl_rendertexture.cpp | 3 ++- 7 files changed, 27 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/gl/egl_platform.cpp b/renderdoc/driver/gl/egl_platform.cpp index 922cce2ef..29e64e83d 100644 --- a/renderdoc/driver/gl/egl_platform.cpp +++ b/renderdoc/driver/gl/egl_platform.cpp @@ -212,7 +212,20 @@ class EGLPlatform : public GLPlatform EGLSurface surface = 0; if(window != 0) { - surface = EGL.CreateWindowSurface(eglDisplay, ret.egl_cfg, window, NULL); + const char *exts = EGL.QueryString(eglDisplay, EGL_EXTENSIONS); + + // create an sRGB surface if possible + const EGLint *attrib_list = NULL; + const EGLint srgb_attribs[] = {EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR, EGL_NONE}; + + if(exts && strstr(exts, "KHR_gl_colorspace")) + attrib_list = srgb_attribs; + + surface = EGL.CreateWindowSurface(eglDisplay, ret.egl_cfg, window, attrib_list); + + // if the sRGB surface request failed, fall back to linear + if(surface == NULL && attrib_list != NULL) + surface = EGL.CreateWindowSurface(eglDisplay, ret.egl_cfg, window, NULL); if(surface == NULL) RDCERR("Couldn't create surface for window"); diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 59cb0cb2d..78865e6c4 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -590,6 +590,7 @@ extern bool IsGLES; EXT_TO_CHECK(13, 99, ARB_texture_border_clamp) \ EXT_TO_CHECK(30, 30, EXT_transform_feedback) \ EXT_TO_CHECK(30, 32, EXT_draw_buffers2) \ + EXT_TO_CHECK(31, 99, EXT_framebuffer_sRGB) \ EXT_TO_CHECK(31, 99, ARB_texture_buffer_object) \ /* This is a hack, the extension doesn't exist but is */ \ /* equivalent to GLES 3.1's addition of MSAA textures but */ \ @@ -690,7 +691,8 @@ extern bool IsGLES; EXT_COMP_CHECK(ARB_viewport_array, NV_viewport_array) \ EXT_COMP_CHECK(ARB_viewport_array, OES_viewport_array) \ EXT_COMP_CHECK(ARB_texture_buffer_object, EXT_texture_buffer) \ - EXT_COMP_CHECK(ARB_texture_buffer_object, OES_texture_buffer) + EXT_COMP_CHECK(ARB_texture_buffer_object, OES_texture_buffer) \ + EXT_COMP_CHECK(EXT_framebuffer_sRGB, EXT_sRGB_write_control) // extensions we know we want to check for are precached, indexd by this enum enum ExtensionCheckEnum diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index f23da5f20..f043c41fc 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -1692,7 +1692,8 @@ void GLReplay::RenderCheckerboard() drv.glDisable(eGL_DEPTH_TEST); - drv.glEnable(eGL_FRAMEBUFFER_SRGB); + if(HasExt[EXT_framebuffer_sRGB]) + drv.glEnable(eGL_FRAMEBUFFER_SRGB); drv.glBindBufferBase(eGL_UNIFORM_BUFFER, 0, DebugData.UBOs[0]); diff --git a/renderdoc/driver/gl/gl_outputwindow.cpp b/renderdoc/driver/gl/gl_outputwindow.cpp index 4276f7193..fefee3ed5 100644 --- a/renderdoc/driver/gl/gl_outputwindow.cpp +++ b/renderdoc/driver/gl/gl_outputwindow.cpp @@ -194,7 +194,8 @@ void GLReplay::FlipOutputWindow(uint64_t id) outw.BlitData.backbuffer, 0); drv.glReadBuffer(eGL_COLOR_ATTACHMENT0); - drv.glEnable(eGL_FRAMEBUFFER_SRGB); + if(HasExt[EXT_framebuffer_sRGB]) + drv.glEnable(eGL_FRAMEBUFFER_SRGB); drv.glBlitFramebuffer(0, 0, outw.width, outw.height, 0, 0, outw.width, outw.height, GL_COLOR_BUFFER_BIT, eGL_NEAREST); diff --git a/renderdoc/driver/gl/gl_rendermesh.cpp b/renderdoc/driver/gl/gl_rendermesh.cpp index 5933bb23c..e8a1f2869 100644 --- a/renderdoc/driver/gl/gl_rendermesh.cpp +++ b/renderdoc/driver/gl/gl_rendermesh.cpp @@ -66,7 +66,8 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector &secondaryD drv.glUseProgram(prog); - drv.glEnable(eGL_FRAMEBUFFER_SRGB); + if(HasExt[EXT_framebuffer_sRGB]) + drv.glEnable(eGL_FRAMEBUFFER_SRGB); drv.glDisable(eGL_CULL_FACE); diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index f2e49d847..9bfadf243 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -656,7 +656,6 @@ bool GLRenderState::CheckEnableDisableParam(GLenum pname) case eGL_PROGRAM_POINT_SIZE: case eGL_PRIMITIVE_RESTART: case eGL_TEXTURE_CUBE_MAP_SEAMLESS: - case eGL_FRAMEBUFFER_SRGB: // these are not supported by OpenGL ES return false; @@ -683,6 +682,8 @@ bool GLRenderState::CheckEnableDisableParam(GLenum pname) case eGL_SAMPLE_SHADING: return HasExt[ARB_sample_shading]; + case eGL_FRAMEBUFFER_SRGB: return HasExt[EXT_framebuffer_sRGB]; + default: break; } } diff --git a/renderdoc/driver/gl/gl_rendertexture.cpp b/renderdoc/driver/gl/gl_rendertexture.cpp index 114784d41..2dbc7b34b 100644 --- a/renderdoc/driver/gl/gl_rendertexture.cpp +++ b/renderdoc/driver/gl/gl_rendertexture.cpp @@ -387,7 +387,8 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, int flags) drv.glDisable(eGL_DEPTH_TEST); - drv.glEnable(eGL_FRAMEBUFFER_SRGB); + if(HasExt[EXT_framebuffer_sRGB]) + drv.glEnable(eGL_FRAMEBUFFER_SRGB); drv.glBindVertexArray(DebugData.emptyVAO); drv.glDrawArrays(eGL_TRIANGLE_STRIP, 0, 4);