From 8c6566c6b8fc71b720a29fcc2ad558aa02b09970 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 21 Dec 2022 12:16:34 +0000 Subject: [PATCH] Don't crash in glslang reflection fallback path if shaders don't compile --- .../driver/gl/wrappers/gl_shader_funcs.cpp | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 915170c23..524a92ff3 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -205,8 +205,13 @@ void WrappedOpenGL::ShaderData::ProcessCompilation(WrappedOpenGL &drv, ResourceI // if we don't have program_interface_query, need to compile the shader with glslang to be able // to reflect with. This is needed on capture or replay if(!HasExt[ARB_program_interface_query] && status == 1) + { glslangShader = CompileShaderForReflection(rdcspv::ShaderStage(ShaderIdx(type)), sources); + if(glslangShader == NULL) + RDCERR("glslang shader failed to compile, reflection will fail"); + } + if(IsReplayMode(drv.GetState()) && !drv.IsInternalShader()) { // no shaders made under this point should be reflected themselves, they're only used for @@ -249,22 +254,30 @@ void WrappedOpenGL::ShaderData::ProcessCompilation(WrappedOpenGL &drv, ResourceI // In this case we forcibly emulate ARB_program_interface_query. RDCASSERT(!HasExt[ARB_program_interface_query]); - // to do this, we need to create an empty program object and manually configure its glslang - // program. - GLuint fakeProgram = drv.glCreateProgram(); + if(glslangShader == NULL) + { + RDCERR("Couldn't compile shader via glslang - functionality will be broken."); + } + else + { + // to do this, we need to create an empty program object and manually configure its + // glslang program. + GLuint fakeProgram = drv.glCreateProgram(); - ResourceId progid = drv.GetResourceManager()->GetResID(ProgramRes(drv.GetCtx(), fakeProgram)); + ResourceId progid = + drv.GetResourceManager()->GetResID(ProgramRes(drv.GetCtx(), fakeProgram)); - ProgramData &progDetails = drv.m_Programs[progid]; + ProgramData &progDetails = drv.m_Programs[progid]; - progDetails.linked = true; + progDetails.linked = true; - progDetails.glslangProgram = LinkProgramForReflection({glslangShader}); + progDetails.glslangProgram = LinkProgramForReflection({glslangShader}); - MakeShaderReflection(type, fakeProgram, *reflection, outputUsage); - reflected = true; + MakeShaderReflection(type, fakeProgram, *reflection, outputUsage); + reflected = true; - drv.glDeleteProgram(fakeProgram); + drv.glDeleteProgram(fakeProgram); + } } if(reflected)