Renderer: Add shader validation
Former-commit-id: fa9225b87e6ec2217c3838535531075dfcaaf433
This commit is contained in:
parent
5556c38901
commit
6870148314
|
|
@ -318,6 +318,7 @@ NAZARA_RENDERER_API extern PFNGLUNIFORMMATRIX4DVPROC glUniformMatrix4dv;
|
||||||
NAZARA_RENDERER_API extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
|
NAZARA_RENDERER_API extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
|
||||||
NAZARA_RENDERER_API extern PFNGLUNMAPBUFFERPROC glUnmapBuffer;
|
NAZARA_RENDERER_API extern PFNGLUNMAPBUFFERPROC glUnmapBuffer;
|
||||||
NAZARA_RENDERER_API extern PFNGLUSEPROGRAMPROC glUseProgram;
|
NAZARA_RENDERER_API extern PFNGLUSEPROGRAMPROC glUseProgram;
|
||||||
|
NAZARA_RENDERER_API extern PFNGLVALIDATEPROGRAMPROC glValidateProgram;
|
||||||
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f;
|
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f;
|
||||||
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor;
|
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor;
|
||||||
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
|
NAZARA_RENDERER_API extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
|
||||||
|
|
|
||||||
|
|
@ -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 NzVector4f* vectors, unsigned int count) const;
|
||||||
void SendVectorArray(int location, const NzVector4i* vectors, unsigned int count) const;
|
void SendVectorArray(int location, const NzVector4i* vectors, unsigned int count) const;
|
||||||
|
|
||||||
|
bool Validate() const;
|
||||||
|
|
||||||
// Fonctions OpenGL
|
// Fonctions OpenGL
|
||||||
unsigned int GetOpenGLID() const;
|
unsigned int GetOpenGLID() const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -945,6 +945,7 @@ bool NzOpenGL::Initialize()
|
||||||
glUniformMatrix4fv = reinterpret_cast<PFNGLUNIFORMMATRIX4FVPROC>(LoadEntry("glUniformMatrix4fv"));
|
glUniformMatrix4fv = reinterpret_cast<PFNGLUNIFORMMATRIX4FVPROC>(LoadEntry("glUniformMatrix4fv"));
|
||||||
glUnmapBuffer = reinterpret_cast<PFNGLUNMAPBUFFERPROC>(LoadEntry("glUnmapBuffer"));
|
glUnmapBuffer = reinterpret_cast<PFNGLUNMAPBUFFERPROC>(LoadEntry("glUnmapBuffer"));
|
||||||
glUseProgram = reinterpret_cast<PFNGLUSEPROGRAMPROC>(LoadEntry("glUseProgram"));
|
glUseProgram = reinterpret_cast<PFNGLUSEPROGRAMPROC>(LoadEntry("glUseProgram"));
|
||||||
|
glValidateProgram = reinterpret_cast<PFNGLVALIDATEPROGRAMPROC>(LoadEntry("glValidateProgram"));
|
||||||
glVertexAttrib4f = reinterpret_cast<PFNGLVERTEXATTRIB4FPROC>(LoadEntry("glVertexAttrib4f"));
|
glVertexAttrib4f = reinterpret_cast<PFNGLVERTEXATTRIB4FPROC>(LoadEntry("glVertexAttrib4f"));
|
||||||
glVertexAttribPointer = reinterpret_cast<PFNGLVERTEXATTRIBPOINTERPROC>(LoadEntry("glVertexAttribPointer"));
|
glVertexAttribPointer = reinterpret_cast<PFNGLVERTEXATTRIBPOINTERPROC>(LoadEntry("glVertexAttribPointer"));
|
||||||
glViewport = reinterpret_cast<PFNGLVIEWPORTPROC>(LoadEntry("glViewport"));
|
glViewport = reinterpret_cast<PFNGLVIEWPORTPROC>(LoadEntry("glViewport"));
|
||||||
|
|
@ -2384,6 +2385,7 @@ PFNGLUNIFORMMATRIX4DVPROC glUniformMatrix4dv = nullptr;
|
||||||
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = nullptr;
|
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = nullptr;
|
||||||
PFNGLUNMAPBUFFERPROC glUnmapBuffer = nullptr;
|
PFNGLUNMAPBUFFERPROC glUnmapBuffer = nullptr;
|
||||||
PFNGLUSEPROGRAMPROC glUseProgram = nullptr;
|
PFNGLUSEPROGRAMPROC glUseProgram = nullptr;
|
||||||
|
PFNGLVALIDATEPROGRAMPROC glValidateProgram = nullptr;
|
||||||
PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = nullptr;
|
PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = nullptr;
|
||||||
PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor = nullptr;
|
PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor = nullptr;
|
||||||
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = nullptr;
|
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -1857,6 +1857,14 @@ bool NzRenderer::EnsureStateUpdate()
|
||||||
// Et on termine par envoyer nos états au driver
|
// Et on termine par envoyer nos états au driver
|
||||||
NzOpenGL::ApplyStates(s_states);
|
NzOpenGL::ApplyStates(s_states);
|
||||||
|
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_shader->Validate())
|
||||||
|
{
|
||||||
|
NazaraError(NzError::GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
unsigned int NzShader::GetOpenGLID() const
|
||||||
{
|
{
|
||||||
return m_program;
|
return m_program;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue