Renderer: Add uniform dumper when shader fails to validate

This commit is contained in:
Lynix 2016-12-18 00:36:41 +01:00
parent b410956d1b
commit b468dbe092
3 changed files with 93 additions and 0 deletions

View File

@ -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;

View File

@ -969,6 +969,8 @@ namespace Nz
glGetTexLevelParameteriv = reinterpret_cast<PFNGLGETTEXLEVELPARAMETERIVPROC>(LoadEntry("glGetTexLevelParameteriv"));
glGetTexParameterfv = reinterpret_cast<PFNGLGETTEXPARAMETERFVPROC>(LoadEntry("glGetTexParameterfv"));
glGetTexParameteriv = reinterpret_cast<PFNGLGETTEXPARAMETERIVPROC>(LoadEntry("glGetTexParameteriv"));
glGetUniformfv = reinterpret_cast<PFNGLGETUNIFORMFVPROC>(LoadEntry("glGetUniformfv"));
glGetUniformiv = reinterpret_cast<PFNGLGETUNIFORMIVPROC>(LoadEntry("glGetUniformiv"));
glGetUniformLocation = reinterpret_cast<PFNGLGETUNIFORMLOCATIONPROC>(LoadEntry("glGetUniformLocation"));
glIsEnabled = reinterpret_cast<PFNGLISENABLEDPROC>(LoadEntry("glIsEnabled"));
glLineWidth = reinterpret_cast<PFNGLLINEWIDTHPROC>(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;

View File

@ -8,6 +8,7 @@
#include <Nazara/Core/Error.hpp>
#include <Nazara/Core/ErrorFlags.hpp>
#include <Nazara/Core/Log.hpp>
#include <Nazara/Core/MemoryHelper.hpp>
#include <Nazara/Core/Signal.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Context.hpp>
@ -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<GLchar*>(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