From c0c436f6edc153d8f11c866e0496793cf9a14afc Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 3 Dec 2014 10:23:31 +0000 Subject: [PATCH] Make sure to set all sources at once (glShaderSource replaces). --- renderdoc/driver/gl/gl_debug.cpp | 10 ++++++---- renderdoc/driver/gl/gl_manager.cpp | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index 0b3cacfa1..eb1fa3d23 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -1019,11 +1019,13 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, TextureDisplayOverlay overl if(shadDetails.type != eGL_FRAGMENT_SHADER) { shad = gl.glCreateShader(shadDetails.type); + + char **srcs = new char *[shadDetails.sources.size()]; for(size_t s=0; s < shadDetails.sources.size(); s++) - { - src = shadDetails.sources[s].c_str(); - gl.glShaderSource(shad, 1, &src, NULL); - } + srcs[s] = (char *)shadDetails.sources[s].c_str(); + gl.glShaderSource(shad, shadDetails.sources.size(), srcs, NULL); + SAFE_DELETE_ARRAY(srcs); + gl.glCompileShader(shad); gl.glAttachShader(progDetails.colOutProg, shad); gl.glDeleteShader(shad); diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index cddbe42fc..df2f195f3 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -363,17 +363,28 @@ bool GLResourceManager::Serialise_InitialState(GLResource res) const auto &shadDetails = m_GL->m_Shaders[details.shaders[i]]; GLuint shad = gl.glCreateShader(shadDetails.type); + + char **srcs = new char *[shadDetails.sources.size()]; for(size_t s=0; s < shadDetails.sources.size(); s++) - { - const char *src = shadDetails.sources[s].c_str(); - gl.glShaderSource(shad, 1, &src, NULL); - } + srcs[s] = (char *)shadDetails.sources[s].c_str(); + gl.glShaderSource(shad, shadDetails.sources.size(), srcs, NULL); + + SAFE_DELETE_ARRAY(srcs); gl.glCompileShader(shad); gl.glAttachShader(initProg, shad); gl.glDeleteShader(shad); } gl.glLinkProgram(initProg); + + GLint status = 0; + gl.glGetProgramiv(initProg, eGL_LINK_STATUS, &status); + if(status == 0) + { + char buffer[1025] = {0}; + gl.glGetProgramInfoLog(initProg, 1024, NULL, buffer); + RDCERR("Link error: %s", buffer); + } SerialiseProgramUniforms(gl, m_pSerialiser, initProg, &details.locationTranslate, false);