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.
This commit is contained in:
baldurk
2018-07-12 15:53:12 +01:00
parent e8e7aea693
commit 71c104761a
7 changed files with 27 additions and 7 deletions
+14 -1
View File
@@ -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");
+3 -1
View File
@@ -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
+2 -1
View File
@@ -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]);
+2 -1
View File
@@ -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);
+2 -1
View File
@@ -66,7 +66,8 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
drv.glUseProgram(prog);
drv.glEnable(eGL_FRAMEBUFFER_SRGB);
if(HasExt[EXT_framebuffer_sRGB])
drv.glEnable(eGL_FRAMEBUFFER_SRGB);
drv.glDisable(eGL_CULL_FACE);
+2 -1
View File
@@ -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;
}
}
+2 -1
View File
@@ -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);