From b468dbe092907112b87a93fdbb4da10e108e19a3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 18 Dec 2016 00:36:41 +0100 Subject: [PATCH] Renderer: Add uniform dumper when shader fails to validate --- include/Nazara/Renderer/OpenGL.hpp | 2 + src/Nazara/Renderer/OpenGL.cpp | 4 ++ src/Nazara/Renderer/Renderer.cpp | 87 ++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+) diff --git a/include/Nazara/Renderer/OpenGL.hpp b/include/Nazara/Renderer/OpenGL.hpp index 535a77388..e7f21d228 100644 --- a/include/Nazara/Renderer/OpenGL.hpp +++ b/include/Nazara/Renderer/OpenGL.hpp @@ -249,6 +249,8 @@ NAZARA_RENDERER_API extern PFNGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParame NAZARA_RENDERER_API extern PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv; NAZARA_RENDERER_API extern PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv; NAZARA_RENDERER_API extern PFNGLGETTEXPARAMETERIVPROC glGetTexParameteriv; +NAZARA_RENDERER_API extern PFNGLGETUNIFORMFVPROC glGetUniformfv; +NAZARA_RENDERER_API extern PFNGLGETUNIFORMIVPROC glGetUniformiv; NAZARA_RENDERER_API extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; NAZARA_RENDERER_API extern PFNGLINVALIDATEBUFFERDATAPROC glInvalidateBufferData; NAZARA_RENDERER_API extern PFNGLISENABLEDPROC glIsEnabled; diff --git a/src/Nazara/Renderer/OpenGL.cpp b/src/Nazara/Renderer/OpenGL.cpp index b06c1c3a7..af4d16d28 100644 --- a/src/Nazara/Renderer/OpenGL.cpp +++ b/src/Nazara/Renderer/OpenGL.cpp @@ -969,6 +969,8 @@ namespace Nz glGetTexLevelParameteriv = reinterpret_cast(LoadEntry("glGetTexLevelParameteriv")); glGetTexParameterfv = reinterpret_cast(LoadEntry("glGetTexParameterfv")); glGetTexParameteriv = reinterpret_cast(LoadEntry("glGetTexParameteriv")); + glGetUniformfv = reinterpret_cast(LoadEntry("glGetUniformfv")); + glGetUniformiv = reinterpret_cast(LoadEntry("glGetUniformiv")); glGetUniformLocation = reinterpret_cast(LoadEntry("glGetUniformLocation")); glIsEnabled = reinterpret_cast(LoadEntry("glIsEnabled")); glLineWidth = reinterpret_cast(LoadEntry("glLineWidth")); @@ -2203,6 +2205,8 @@ PFNGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParameterfv = nullptr; PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv = nullptr; PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv = nullptr; PFNGLGETTEXPARAMETERIVPROC glGetTexParameteriv = nullptr; +PFNGLGETUNIFORMFVPROC glGetUniformfv = nullptr; +PFNGLGETUNIFORMIVPROC glGetUniformiv = nullptr; PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = nullptr; PFNGLINVALIDATEBUFFERDATAPROC glInvalidateBufferData = nullptr; PFNGLISENABLEDPROC glIsEnabled = nullptr; diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index f6257eed4..a5140c7ec 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -1775,6 +1776,92 @@ namespace Nz if (!s_shader->Validate()) { NazaraError(Error::GetLastError()); + + GLuint program = s_shader->GetOpenGLID(); + + StringStream dump; + + GLint count; + glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &count); + dump << "Active uniforms: " << count << '\n'; + + GLint maxLength; + glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxLength); + maxLength++; + + StackAllocation stackAlloc = NazaraStackAllocation((maxLength + 1) * sizeof(GLchar)); + GLchar* nameBuffer = static_cast(stackAlloc.GetPtr()); + + for (GLint i = 0; i < count; i++) + { + GLint size; + GLenum type; + + glGetActiveUniform(program, i, maxLength, nullptr, &size, &type, nameBuffer); + + dump << "Uniform #" << i << ": " << nameBuffer << "(Type: 0x" << String::Number(type, 16); + + GLint location = glGetUniformLocation(program, nameBuffer); + switch (type) + { + case GL_FLOAT: + { + GLfloat value; + glGetUniformfv(program, location, &value); + + dump << ", Value = " << value << ')'; + break; + } + case GL_FLOAT_VEC2: + { + GLfloat values[2]; + glGetUniformfv(program, location, &values[0]); + + dump << ", Value = vec2(" << values[0] << ',' << values[1] << ')'; + break; + } + case GL_FLOAT_VEC3: + { + GLfloat values[3]; + glGetUniformfv(program, location, &values[0]); + + dump << ", Value = vec4(" << values[0] << ',' << values[1] << ',' << values[2] << ')'; + break; + } + case GL_FLOAT_VEC4: + { + GLfloat values[4]; + glGetUniformfv(program, location, &values[0]); + + dump << ", Value = vec4(" << values[0] << ',' << values[1] << ',' << values[2] << ',' << values[3] << ')'; + break; + } + case GL_INT: + { + GLint value; + glGetUniformiv(program, location, &value); + + dump << ", Value = " << value; + break; + } + case GL_SAMPLER_2D: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_CUBE: + case GL_SAMPLER_CUBE_SHADOW: + { + GLint value; + glGetUniformiv(program, location, &value); + + dump << ", Unit = " << value; + break; + } + } + + dump << ")\n"; + } + + NazaraNotice("Dumping shader uniforms:\n" + dump.ToString()); + return false; } #endif