Renderer: Add uniform dumper when shader fails to validate
This commit is contained in:
parent
b410956d1b
commit
b468dbe092
|
|
@ -249,6 +249,8 @@ NAZARA_RENDERER_API extern PFNGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParame
|
||||||
NAZARA_RENDERER_API extern PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv;
|
NAZARA_RENDERER_API extern PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv;
|
||||||
NAZARA_RENDERER_API extern PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv;
|
NAZARA_RENDERER_API extern PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv;
|
||||||
NAZARA_RENDERER_API extern PFNGLGETTEXPARAMETERIVPROC glGetTexParameteriv;
|
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 PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
|
||||||
NAZARA_RENDERER_API extern PFNGLINVALIDATEBUFFERDATAPROC glInvalidateBufferData;
|
NAZARA_RENDERER_API extern PFNGLINVALIDATEBUFFERDATAPROC glInvalidateBufferData;
|
||||||
NAZARA_RENDERER_API extern PFNGLISENABLEDPROC glIsEnabled;
|
NAZARA_RENDERER_API extern PFNGLISENABLEDPROC glIsEnabled;
|
||||||
|
|
|
||||||
|
|
@ -969,6 +969,8 @@ namespace Nz
|
||||||
glGetTexLevelParameteriv = reinterpret_cast<PFNGLGETTEXLEVELPARAMETERIVPROC>(LoadEntry("glGetTexLevelParameteriv"));
|
glGetTexLevelParameteriv = reinterpret_cast<PFNGLGETTEXLEVELPARAMETERIVPROC>(LoadEntry("glGetTexLevelParameteriv"));
|
||||||
glGetTexParameterfv = reinterpret_cast<PFNGLGETTEXPARAMETERFVPROC>(LoadEntry("glGetTexParameterfv"));
|
glGetTexParameterfv = reinterpret_cast<PFNGLGETTEXPARAMETERFVPROC>(LoadEntry("glGetTexParameterfv"));
|
||||||
glGetTexParameteriv = reinterpret_cast<PFNGLGETTEXPARAMETERIVPROC>(LoadEntry("glGetTexParameteriv"));
|
glGetTexParameteriv = reinterpret_cast<PFNGLGETTEXPARAMETERIVPROC>(LoadEntry("glGetTexParameteriv"));
|
||||||
|
glGetUniformfv = reinterpret_cast<PFNGLGETUNIFORMFVPROC>(LoadEntry("glGetUniformfv"));
|
||||||
|
glGetUniformiv = reinterpret_cast<PFNGLGETUNIFORMIVPROC>(LoadEntry("glGetUniformiv"));
|
||||||
glGetUniformLocation = reinterpret_cast<PFNGLGETUNIFORMLOCATIONPROC>(LoadEntry("glGetUniformLocation"));
|
glGetUniformLocation = reinterpret_cast<PFNGLGETUNIFORMLOCATIONPROC>(LoadEntry("glGetUniformLocation"));
|
||||||
glIsEnabled = reinterpret_cast<PFNGLISENABLEDPROC>(LoadEntry("glIsEnabled"));
|
glIsEnabled = reinterpret_cast<PFNGLISENABLEDPROC>(LoadEntry("glIsEnabled"));
|
||||||
glLineWidth = reinterpret_cast<PFNGLLINEWIDTHPROC>(LoadEntry("glLineWidth"));
|
glLineWidth = reinterpret_cast<PFNGLLINEWIDTHPROC>(LoadEntry("glLineWidth"));
|
||||||
|
|
@ -2203,6 +2205,8 @@ PFNGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParameterfv = nullptr;
|
||||||
PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv = nullptr;
|
PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv = nullptr;
|
||||||
PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv = nullptr;
|
PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv = nullptr;
|
||||||
PFNGLGETTEXPARAMETERIVPROC glGetTexParameteriv = nullptr;
|
PFNGLGETTEXPARAMETERIVPROC glGetTexParameteriv = nullptr;
|
||||||
|
PFNGLGETUNIFORMFVPROC glGetUniformfv = nullptr;
|
||||||
|
PFNGLGETUNIFORMIVPROC glGetUniformiv = nullptr;
|
||||||
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = nullptr;
|
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = nullptr;
|
||||||
PFNGLINVALIDATEBUFFERDATAPROC glInvalidateBufferData = nullptr;
|
PFNGLINVALIDATEBUFFERDATAPROC glInvalidateBufferData = nullptr;
|
||||||
PFNGLISENABLEDPROC glIsEnabled = nullptr;
|
PFNGLISENABLEDPROC glIsEnabled = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
#include <Nazara/Core/ErrorFlags.hpp>
|
#include <Nazara/Core/ErrorFlags.hpp>
|
||||||
#include <Nazara/Core/Log.hpp>
|
#include <Nazara/Core/Log.hpp>
|
||||||
|
#include <Nazara/Core/MemoryHelper.hpp>
|
||||||
#include <Nazara/Core/Signal.hpp>
|
#include <Nazara/Core/Signal.hpp>
|
||||||
#include <Nazara/Renderer/Config.hpp>
|
#include <Nazara/Renderer/Config.hpp>
|
||||||
#include <Nazara/Renderer/Context.hpp>
|
#include <Nazara/Renderer/Context.hpp>
|
||||||
|
|
@ -1775,6 +1776,92 @@ namespace Nz
|
||||||
if (!s_shader->Validate())
|
if (!s_shader->Validate())
|
||||||
{
|
{
|
||||||
NazaraError(Error::GetLastError());
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue