From bcd342aa795bea3b2806a6642faf4b5ea271b72a Mon Sep 17 00:00:00 2001 From: michaelrgb Date: Mon, 4 Sep 2017 16:47:37 +0100 Subject: [PATCH] Set TF mode for all initProg varyings, to stop driver culling uniforms. --- renderdoc/driver/gl/gl_manager.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index 2fc8d8797..5670bda30 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -1074,12 +1074,19 @@ bool GLResourceManager::Serialise_InitialState(ResourceId resid, GLResource res) GLuint initProg = gl.glCreateProgram(); + std::vector vertexOutputs; for(size_t i = 0; i < details.shaders.size(); i++) { const auto &shadDetails = m_GL->m_Shaders[details.shaders[i]]; GLuint shad = gl.glCreateShader(shadDetails.type); + if(shadDetails.type == eGL_VERTEX_SHADER) + { + for(int s = 0; s < shadDetails.reflection.OutputSig.count; s++) + vertexOutputs.push_back(shadDetails.reflection.OutputSig[s].varName.c_str()); + } + char **srcs = new char *[shadDetails.sources.size()]; for(size_t s = 0; s < shadDetails.sources.size(); s++) srcs[s] = (char *)shadDetails.sources[s].c_str(); @@ -1091,6 +1098,12 @@ bool GLResourceManager::Serialise_InitialState(ResourceId resid, GLResource res) gl.glDeleteShader(shad); } + // Some drivers optimize out uniforms if they dont change any active vertex shader outputs. + // This resulted in initProg locationTranslate table being -1 for a particular shader where + // some uniforms were only intended to affect TF. Therefore set a TF mode for all varyings. + // As the initial state program is never used for TF, this wont adversely affect anything. + gl.glTransformFeedbackVaryings(initProg, (GLsizei)vertexOutputs.size(), &vertexOutputs[0], + eGL_INTERLEAVED_ATTRIBS); gl.glLinkProgram(initProg); GLint status = 0;