Renderer: Add shader validation

Former-commit-id: fa9225b87e6ec2217c3838535531075dfcaaf433
This commit is contained in:
Lynix 2015-07-05 23:26:09 +02:00
parent 5556c38901
commit 6870148314
5 changed files with 37 additions and 0 deletions

View File

@ -318,6 +318,7 @@ NAZARA_RENDERER_API extern PFNGLUNIFORMMATRIX4DVPROC glUniformMatrix4dv;
NAZARA_RENDERER_API extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
NAZARA_RENDERER_API extern PFNGLUNMAPBUFFERPROC glUnmapBuffer;
NAZARA_RENDERER_API extern PFNGLUSEPROGRAMPROC glUseProgram;
NAZARA_RENDERER_API extern PFNGLVALIDATEPROGRAMPROC glValidateProgram;
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f;
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor;
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;

View File

@ -95,6 +95,8 @@ class NAZARA_RENDERER_API NzShader : public NzRefCounted, NzNonCopyable
void SendVectorArray(int location, const NzVector4f* vectors, unsigned int count) const;
void SendVectorArray(int location, const NzVector4i* vectors, unsigned int count) const;
bool Validate() const;
// Fonctions OpenGL
unsigned int GetOpenGLID() const;

View File

@ -945,6 +945,7 @@ bool NzOpenGL::Initialize()
glUniformMatrix4fv = reinterpret_cast<PFNGLUNIFORMMATRIX4FVPROC>(LoadEntry("glUniformMatrix4fv"));
glUnmapBuffer = reinterpret_cast<PFNGLUNMAPBUFFERPROC>(LoadEntry("glUnmapBuffer"));
glUseProgram = reinterpret_cast<PFNGLUSEPROGRAMPROC>(LoadEntry("glUseProgram"));
glValidateProgram = reinterpret_cast<PFNGLVALIDATEPROGRAMPROC>(LoadEntry("glValidateProgram"));
glVertexAttrib4f = reinterpret_cast<PFNGLVERTEXATTRIB4FPROC>(LoadEntry("glVertexAttrib4f"));
glVertexAttribPointer = reinterpret_cast<PFNGLVERTEXATTRIBPOINTERPROC>(LoadEntry("glVertexAttribPointer"));
glViewport = reinterpret_cast<PFNGLVIEWPORTPROC>(LoadEntry("glViewport"));
@ -2384,6 +2385,7 @@ PFNGLUNIFORMMATRIX4DVPROC glUniformMatrix4dv = nullptr;
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = nullptr;
PFNGLUNMAPBUFFERPROC glUnmapBuffer = nullptr;
PFNGLUSEPROGRAMPROC glUseProgram = nullptr;
PFNGLVALIDATEPROGRAMPROC glValidateProgram = nullptr;
PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = nullptr;
PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor = nullptr;
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = nullptr;

View File

@ -1857,6 +1857,14 @@ bool NzRenderer::EnsureStateUpdate()
// Et on termine par envoyer nos états au driver
NzOpenGL::ApplyStates(s_states);
#ifdef NAZARA_DEBUG
if (!s_shader->Validate())
{
NazaraError(NzError::GetLastError());
return false;
}
#endif
return true;
}

View File

@ -748,6 +748,30 @@ void NzShader::SendVectorArray(int location, const NzVector4i* vectors, unsigned
}
}
bool NzShader::Validate() const
{
#if NAZARA_RENDERER_SAFE
if (!m_program)
{
NazaraError("Shader is not initialized");
return false;
}
#endif
glValidateProgram(m_program);
GLint success;
glGetProgramiv(m_program, GL_VALIDATE_STATUS, &success);
if (success == GL_TRUE)
return true;
else
{
NazaraError("Failed to validate shader: " + GetLog());
return false;
}
}
unsigned int NzShader::GetOpenGLID() const
{
return m_program;