From 37b47f148c1fa133b859d5f1b564dfca482293f1 Mon Sep 17 00:00:00 2001 From: Vladislav Oleshko Date: Mon, 25 Jul 2022 16:29:33 +0300 Subject: [PATCH] Refactor FlatGL::CompileState --- src/Magnum/GL/AbstractShaderProgram.cpp | 4 -- src/Magnum/GL/AbstractShaderProgram.h | 19 +++----- src/Magnum/Shaders/FlatGL.cpp | 25 +++++----- src/Magnum/Shaders/FlatGL.h | 64 ++++++++++++------------- 4 files changed, 52 insertions(+), 60 deletions(-) diff --git a/src/Magnum/GL/AbstractShaderProgram.cpp b/src/Magnum/GL/AbstractShaderProgram.cpp index 298da4d4a..3714f7b24 100644 --- a/src/Magnum/GL/AbstractShaderProgram.cpp +++ b/src/Magnum/GL/AbstractShaderProgram.cpp @@ -649,10 +649,6 @@ bool AbstractShaderProgram::isLinkFinished() { return success == GL_TRUE; } -bool AbstractShaderProgram::CompileState::isLinkFinished() { - return AbstractShaderProgram::isLinkFinished(); -} - void AbstractShaderProgram::cleanLogImplementationNoOp(std::string&) {} #if defined(CORRADE_TARGET_WINDOWS) && !defined(MAGNUM_TARGET_GLES) diff --git a/src/Magnum/GL/AbstractShaderProgram.h b/src/Magnum/GL/AbstractShaderProgram.h index 89b42ea0e..54db33c86 100644 --- a/src/Magnum/GL/AbstractShaderProgram.h +++ b/src/Magnum/GL/AbstractShaderProgram.h @@ -449,8 +449,6 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject { friend Implementation::ShaderProgramState; public: - struct CompileState; - #ifndef MAGNUM_TARGET_GLES2 /** * @brief Buffer mode for transform feedback @@ -1260,6 +1258,12 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject { AbstractShaderProgram& dispatchCompute(const Vector3ui& workgroupCount); #endif + /** + * @brief Non-blocking linking status check + * + */ + bool isLinkFinished(); + protected: /** * @brief Link the shaders @@ -1487,12 +1491,6 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject { */ bool checkLink(); - /** - * @brief Non-blocking linking status check - * - */ - bool isLinkFinished(); - /** * @brief Get uniform location * @param name Uniform name @@ -1769,11 +1767,6 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject { #endif }; -struct AbstractShaderProgram::CompileState : public AbstractShaderProgram { - using AbstractShaderProgram::AbstractShaderProgram; - bool isLinkFinished(); -}; - }} #endif diff --git a/src/Magnum/Shaders/FlatGL.cpp b/src/Magnum/Shaders/FlatGL.cpp index 984546024..152104c07 100644 --- a/src/Magnum/Shaders/FlatGL.cpp +++ b/src/Magnum/Shaders/FlatGL.cpp @@ -191,8 +191,8 @@ template typename FlatGL::CompileState FlatG GL::Shader::submitCompile({vert, frag}); - CompileState cs{std::move(frag), std::move(vert), flags - #ifndef MAGNUM_TARGET_GLES2 + CompileState cs{std::move(frag), std::move(vert), version, flags + #ifndef MAGNUM_TARGET_GLES , materialCount, drawCount #endif }; @@ -235,19 +235,12 @@ template typename FlatGL::CompileState FlatG } template FlatGL::FlatGL(CompileState&& cs) -: AbstractShaderProgram{static_cast(std::move(cs))}, - _flags(cs._flags), _materialCount{cs._materialCount}, _drawCount(cs._drawCount) { - +: FlatGL{static_cast(std::move(cs))} { CORRADE_INTERNAL_ASSERT_OUTPUT(GL::Shader::checkCompile({cs._vert, cs._frag})); CORRADE_INTERNAL_ASSERT_OUTPUT(checkLink()); const GL::Context& context = GL::Context::current(); - - #ifndef MAGNUM_TARGET_GLES - const GL::Version version = context.supportedVersion({GL::Version::GL320, GL::Version::GL310, GL::Version::GL300, GL::Version::GL210}); - #else - const GL::Version version = context.supportedVersion({GL::Version::GLES300, GL::Version::GLES200}); - #endif + const GL::Version version = cs._version; #ifndef MAGNUM_TARGET_GLES if(!context.isExtensionSupported(version)) @@ -322,6 +315,16 @@ template FlatGL::FlatGL(Flags flags #endif {} +template FlatGL::FlatGL(NoInitT, Flags flags + #ifndef MAGNUM_TARGET_GLES2 + , UnsignedInt materialCount, UnsignedInt drawCount + #endif +) : GL::AbstractShaderProgram{}, _flags(flags), + #ifndef MAGNUM_TARGET_GLES2 + _materialCount(materialCount), _drawCount(drawCount) + #endif +{} + #ifndef MAGNUM_TARGET_GLES2 template FlatGL::FlatGL(const Flags flags): FlatGL{flags, 1, 1} {} #endif diff --git a/src/Magnum/Shaders/FlatGL.h b/src/Magnum/Shaders/FlatGL.h index 535b80cd3..38070f079 100644 --- a/src/Magnum/Shaders/FlatGL.h +++ b/src/Magnum/Shaders/FlatGL.h @@ -613,38 +613,6 @@ template class MAGNUM_SHADERS_EXPORT FlatGL: public GL:: #endif ); - struct CompileState : public GL::AbstractShaderProgram::CompileState { - friend CompileState FlatGL::compile(Flags - #ifndef MAGNUM_TARGET_GLES2 - , UnsignedInt, UnsignedInt - #endif - ); - friend FlatGL::FlatGL(CompileState&&); - - explicit CompileState(NoCreateT) noexcept: GL::AbstractShaderProgram::CompileState({NoCreate}), - _vert(NoCreate), _frag(NoCreate) {} - - CompileState(GL::Shader&& vert, GL::Shader&& frag, Flags flags - #ifndef MAGNUM_TARGET_GLES2 - , UnsignedInt materialCount, UnsignedInt drawCount - #endif - ) - : _vert(std::move(vert)), _frag(std::move(frag)), _flags(flags) - #ifndef MAGNUM_TARGET_GLES2 - ,_materialCount(materialCount), _drawCount(drawCount) - #endif - {} - - private: - GL::Shader _vert, _frag; - Flags _flags; - - #ifndef MAGNUM_TARGET_GLES2 - UnsignedInt _materialCount; - UnsignedInt _drawCount; - #endif - }; - /** @brief Copying is not allowed */ FlatGL(const FlatGL&) = delete; @@ -1053,6 +1021,17 @@ template class MAGNUM_SHADERS_EXPORT FlatGL: public GL:: } #endif + protected: + /** + * @brief Construct without running shader compilation and linking + * + */ + FlatGL(NoInitT, Flags flags + #ifndef MAGNUM_TARGET_GLES2 + , UnsignedInt materialCount, UnsignedInt drawCount + #endif + ); + private: /* Prevent accidentally calling irrelevant functions */ #ifndef MAGNUM_TARGET_GLES @@ -1081,6 +1060,27 @@ template class MAGNUM_SHADERS_EXPORT FlatGL: public GL:: #endif }; +template class FlatGL::CompileState : public FlatGL { +private: + friend class FlatGL; + using FlatGL::FlatGL; + + CompileState(NoCreateT) : FlatGL(NoCreate), _vert{NoCreate}, _frag{NoCreate} {} + + CompileState(GL::Shader&& vert, GL::Shader&& frag, GL::Version version, Flags flags + #ifndef MAGNUM_TARGET_GLES2 + , UnsignedInt materialCount, UnsignedInt drawCount + #endif + ) : FlatGL(NoInit, flags + #ifndef MAGNUM_TARGET_GLES2 + , materialCount, drawCount + #endif + ), _vert(std::move(vert)), _frag(std::move(frag)), _version(version) {} + + GL::Shader _vert, _frag; + GL::Version _version; +}; + /** @brief 2D flat OpenGL shader @m_since_latest