diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 2fd3c3cde..5562ef849 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -215,6 +215,31 @@ void DoVendorChecks(const GLHookSet &gl, GLWindowingData context) gl.glDeleteTextures(2, texs); } + if(gl.glGetError && gl.glGenProgramPipelines && gl.glDeleteProgramPipelines && gl.glGetProgramPipelineiv) + { + GLuint pipe = 0; + gl.glGenProgramPipelines(1, &pipe); + + // clear all error flags. + GLenum err = gl.glGetError(); + while(err != eGL_NONE) err = gl.glGetError(); + + GLint dummy = 0; + gl.glGetProgramPipelineiv(pipe, eGL_COMPUTE_SHADER, &dummy); + + err = gl.glGetError(); + + if(err != eGL_NONE) + { + // if we got an error trying to query that, we should enable this hack + VendorCheck[VendorCheck_AMD_pipeline_compute_query] = true; + + RDCWARN("Using hack to avoid glGetProgramPipelineiv with GL_COMPUTE_SHADER"); + } + + gl.glDeleteProgramPipelines(1, &pipe); + } + // only do this when we have a proper context e.g. on windows where an old // context is first created. Check to see if FBOs or VAOs are shared between // contexts. diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 805b26874..a7dfdcc77 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -112,6 +112,7 @@ enum VendorCheckEnum VendorCheck_EXT_vao_shared, VendorCheck_AMD_polygon_mode_query, VendorCheck_AMD_copy_compressed_tinymips, + VendorCheck_AMD_pipeline_compute_query, VendorCheck_Count, }; extern bool VendorCheck[VendorCheck_Count]; diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index b44b1d3c9..baff8605f 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -130,20 +130,21 @@ void GLRenderState::FetchState(void *ctx, WrappedOpenGL *gl) m_Real->glGetIntegerv(eGL_CURRENT_PROGRAM, (GLint *)&Program); m_Real->glGetIntegerv(eGL_PROGRAM_PIPELINE_BINDING, (GLint *)&Pipeline); - GLenum shs[] = { + const GLenum shs[] = { eGL_VERTEX_SHADER, eGL_TESS_CONTROL_SHADER, eGL_TESS_EVALUATION_SHADER, eGL_GEOMETRY_SHADER, eGL_FRAGMENT_SHADER, - eGL_COMPUTE_SHADER + VendorCheck[VendorCheck_AMD_pipeline_compute_query] ? eGL_NONE : eGL_COMPUTE_SHADER, }; RDCCOMPILE_ASSERT(ARRAY_COUNT(shs) == ARRAY_COUNT(Subroutines), "Subroutine array not the right size"); for(size_t s=0; s < ARRAY_COUNT(shs); s++) { GLuint prog = Program; - if(prog == 0 && Pipeline != 0) m_Real->glGetProgramPipelineiv(Pipeline, shs[s], (GLint *)&prog); + if(prog == 0 && Pipeline != 0 && shs[s] != eGL_NONE) + m_Real->glGetProgramPipelineiv(Pipeline, shs[s], (GLint *)&prog); if(prog == 0) continue;