From 21959ddfeffe6b4d2ffc49eac6d175c9a534fda4 Mon Sep 17 00:00:00 2001 From: Subv Date: Sat, 19 May 2018 11:19:34 -0500 Subject: GLRenderer: Log the shader source code when program linking fails. --- src/video_core/renderer_opengl/gl_shader_util.h | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/video_core/renderer_opengl/gl_shader_util.h b/src/video_core/renderer_opengl/gl_shader_util.h index a1fa9e814..2036a06a9 100644 --- a/src/video_core/renderer_opengl/gl_shader_util.h +++ b/src/video_core/renderer_opengl/gl_shader_util.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include #include "common/assert.h" @@ -11,6 +12,27 @@ namespace GLShader { +/** + * Utility function to log the source code of a list of shaders. + * @param shaders The OpenGL shaders whose source we will print. + */ +template +void LogShaderSource(T... shaders) { + auto shader_list = {shaders...}; + + for (const auto& shader : shader_list) { + if (shader == 0) + continue; + + GLint source_length; + glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &source_length); + + std::string source(source_length, ' '); + glGetShaderSource(shader, source_length, nullptr, &source[0]); + NGLOG_INFO(Render_OpenGL, "Shader source {}", source); + } +} + /** * Utility function to create and compile an OpenGL GLSL shader * @param source String of the GLSL shader program @@ -55,6 +77,11 @@ GLuint LoadProgram(bool separable_program, T... shaders) { } } + if (result == GL_FALSE) { + // There was a problem linking the shader, print the source for debugging purposes. + LogShaderSource(shaders...); + } + ASSERT_MSG(result == GL_TRUE, "Shader not linked"); ((shaders == 0 ? (void)0 : glDetachShader(program_id, shaders)), ...); -- cgit v1.2.3