mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-08 08:40:55 +00:00
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:
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user