diff --git a/src/StdDDraw2.h b/src/StdDDraw2.h index ed2584b14..2f1b41671 100644 --- a/src/StdDDraw2.h +++ b/src/StdDDraw2.h @@ -248,6 +248,7 @@ class CStdShaderProgram bool AddShader(CStdShader *shader); virtual void Link() = 0; + virtual void Validate() = 0; void Select(); static void Deselect(); virtual void Clear(); diff --git a/src/StdGL.cpp b/src/StdGL.cpp index aa7ae2237..ed1740ff3 100644 --- a/src/StdGL.cpp +++ b/src/StdGL.cpp @@ -143,45 +143,9 @@ void CStdGLShader::PrepareSource() void CStdGLShaderProgram::Link() { EnsureProgram(); - glLinkProgram(shaderProgram); - GLint status = 0; - glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status); - if (!status) - { - GLint size = 0; - glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &size); - assert(size); - if (size) - { - std::string errorMessage; - errorMessage.resize(size); - glGetProgramInfoLog(shaderProgram, size, nullptr, errorMessage.data()); - errorMessage = errorMessage.c_str(); - throw Exception{errorMessage}; - } - - throw Exception{"Link failed"}; - } - - glValidateProgram(shaderProgram); - glGetProgramiv(shaderProgram, GL_VALIDATE_STATUS, &status); - if (!status) - { - GLint size = 0; - glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &size); - if (size) - { - std::string errorMessage; - errorMessage.resize(size); - glGetProgramInfoLog(shaderProgram, size, nullptr, errorMessage.data()); - errorMessage = errorMessage.c_str(); - throw Exception{errorMessage}; - } - - throw Exception{"Validation failed"}; - } + CheckStatus(GL_LINK_STATUS); for (const auto &shader : shaders) { @@ -191,6 +155,13 @@ void CStdGLShaderProgram::Link() shaders.clear(); } +void CStdGLShaderProgram::Validate() +{ + EnsureProgram(); + glValidateProgram(shaderProgram); + CheckStatus(GL_VALIDATE_STATUS); +} + void CStdGLShaderProgram::Clear() { for (const auto &shader : shaders) @@ -241,6 +212,27 @@ void CStdGLShaderProgram::OnDeselect() glUseProgram(GL_NONE); } +void CStdGLShaderProgram::CheckStatus(const GLenum type) +{ + GLint status{0}; + glGetProgramiv(shaderProgram, type, &status); + if (!status) + { + GLint size = 0; + glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &size); + if (size) + { + std::string errorMessage; + errorMessage.resize(size); + glGetProgramInfoLog(shaderProgram, size, NULL, errorMessage.data()); + errorMessage = errorMessage.c_str(); + throw Exception{errorMessage}; + } + + throw Exception{"Status error"}; + } +} + template CStdGLTexture::CStdGLTexture(std::array dimensions, const GLenum internalFormat, const GLenum format, const GLenum type) : dimensions{std::move(dimensions)}, internalFormat{internalFormat}, format{format}, type{type} @@ -1238,11 +1230,15 @@ bool CStdGL::RestoreDeviceObjects() }; setUniforms(BlitShader); + BlitShader.Validate(); + setUniforms(BlitShaderMod2); + BlitShaderMod2.Validate(); if (DummyShader) { setUniforms(DummyShader); + DummyShader.Validate(); } setUniforms(LandscapeShader); // Last so that the shader is selected for the subsequent calls @@ -1250,6 +1246,8 @@ bool CStdGL::RestoreDeviceObjects() LandscapeShader.SetUniform("maskSampler", glUniform1i, 1); LandscapeShader.SetUniform("liquidSampler", glUniform1i, 2); + LandscapeShader.Validate(); + CStdShaderProgram::Deselect(); if (!Config.Graphics.DisableGamma) diff --git a/src/StdGL.h b/src/StdGL.h index dc1e1b9fb..8a3a71142 100644 --- a/src/StdGL.h +++ b/src/StdGL.h @@ -60,6 +60,7 @@ class CStdGLShaderProgram : public CStdShaderProgram explicit operator bool() const override { return /*glIsProgram(*/shaderProgram/*)*/; } void Link() override; + void Validate() override; void Clear() override; void EnsureProgram() override; @@ -121,6 +122,9 @@ class CStdGLShaderProgram : public CStdShaderProgram return true; } +private: + void CheckStatus(GLenum type); + protected: GLuint shaderProgram{GL_NONE};