diff --git a/renderdoc/data/glsl/quadwrite.frag b/renderdoc/data/glsl/quadwrite.frag index 305515fca..67b769a40 100644 --- a/renderdoc/data/glsl/quadwrite.frag +++ b/renderdoc/data/glsl/quadwrite.frag @@ -42,7 +42,7 @@ // descriptor set will be patched from 0 to whichever descriptor set we're using in code layout(set = 0, binding = 0, r32ui) uniform coherent uimage2DArray overdrawImage; #else // OPENGL and OPENGL_ES -layout(binding = 0, r32ui) uniform PRECISION coherent uimage2DArray overdrawImage; +layout(r32ui) uniform coherent uimage2DArray overdrawImage; #endif layout(early_fragment_tests) in; diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index 3a3d537be..ca28d3987 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -301,7 +301,18 @@ void GLReplay::InitDebugData() DebugData.fixedcolFragShader = DebugData.quadoverdrawFragShader = 0; - if(glesShadersAreComplete && HasExt[ARB_shader_image_load_store] && HasExt[ARB_gpu_shader5]) + if(IsGLES) + { + // quad overdraw not supported on GLES. + // 1. + // dFdx doesn't support uints - potentially workaroundable with float casts, but highly + // doubtful GLES compilers will do that properly without exploding. + // 2. + // quad overdraw write shader must be linked with user shaders in program, which requires + // matching ESSL version and features required for it aren't exposed as extensions to older + // versions but only in core versions. + } + else if(HasExt[ARB_shader_image_load_store] && HasExt[ARB_gpu_shader5]) { GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_quadresolve_frag), glslBaseVer); diff --git a/renderdoc/driver/gl/gl_overlay.cpp b/renderdoc/driver/gl/gl_overlay.cpp index 1e4d1623a..8f5f4982d 100644 --- a/renderdoc/driver/gl/gl_overlay.cpp +++ b/renderdoc/driver/gl/gl_overlay.cpp @@ -213,12 +213,12 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve DebugData.fixedcolFragShader = CreateShader(eGL_FRAGMENT_SHADER, sources); } - // this is not supported on GLES shading language 100 - if(shaderType == eShaderGLSL || glslVer >= 300) + // this is not supported on GLES + if(shaderType == eShaderGLSL) { std::string defines = ""; - if(glslVer < 450) + if(GLCoreVersion < 45) { // dFdx fine functions not available before GLSL 450. Use normal dFdx, which might be coarse, // so won't show quad overdraw properly @@ -227,16 +227,20 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve RDCWARN("Quad overdraw requires GLSL 4.50 for dFd(xy)fine, using possibly coarse dFd(xy)."); } + else + { + glslVer = 450; + } std::vector sources; GenerateGLSLShader(sources, shaderType, defines, GetEmbeddedResource(glsl_quadwrite_frag), - glslVer); + glslVer, false); DebugData.quadoverdrawFragShader = CreateShader(eGL_FRAGMENT_SHADER, sources); } else { if(overlay == DebugOverlay::QuadOverdrawDraw || overlay == DebugOverlay::QuadOverdrawPass) - RDCWARN("Quad overdraw shader not supported on GLES with %d shader", glslVer); + RDCWARN("Quad overdraw not supported on GLES", glslVer); } // we bind the separable program created for each shader, and copy @@ -1316,6 +1320,12 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve drv.glUseProgram(DebugData.overlayProg); drv.glBindProgramPipeline(0); + GLint loc = drv.glGetUniformLocation(DebugData.overlayProg, "overdrawImage"); + if(loc != -1) + drv.glUniform1ui(loc, 0); + else + RDCERR("Couldn't get location of overdrawImage"); + drv.glBindFramebuffer(eGL_READ_FRAMEBUFFER, curdrawfbo); SafeBlitFramebuffer(0, 0, texDetails.width, texDetails.height, 0, 0, texDetails.width, texDetails.height, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,