From a5c2efc8c0a29349962e4b3eac5fe490f5f5115d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 7 Sep 2014 21:17:40 +0200 Subject: [PATCH] Support glProgramUniform*() calls from OpenGL ES 3.1. The code both supports new features *and* is shorter, yay! --- src/Magnum/AbstractShaderProgram.cpp | 310 +++++------------- src/Magnum/AbstractShaderProgram.h | 112 ++++--- .../Implementation/ShaderProgramState.cpp | 103 +++--- 3 files changed, 214 insertions(+), 311 deletions(-) diff --git a/src/Magnum/AbstractShaderProgram.cpp b/src/Magnum/AbstractShaderProgram.cpp index 43d636f75..5a5c6e8c5 100644 --- a/src/Magnum/AbstractShaderProgram.cpp +++ b/src/Magnum/AbstractShaderProgram.cpp @@ -394,10 +394,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform1fv(location, count, values); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const GLfloat* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform1fv(_id, location, count, values); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const GLfloat* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform1fvEXT(_id, location, count, values); #else static_cast(location); @@ -407,12 +411,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const GLfloat* const values) { - glProgramUniform1fvEXT(_id, location, count, values); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<2, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniform2fvImplementation)(location, count, values); } @@ -422,10 +420,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform2fv(location, count, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<2, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform2fv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<2, GLfloat>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform2fvEXT(_id, location, count, values[0].data()); #else static_cast(location); @@ -435,12 +437,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<2, GLfloat>* const values) { - glProgramUniform2fvEXT(_id, location, count, values[0].data()); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<3, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniform3fvImplementation)(location, count, values); } @@ -450,10 +446,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform3fv(location, count, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<3, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform3fv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<3, GLfloat>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform3fvEXT(_id, location, count, values[0].data()); #else static_cast(location); @@ -463,12 +463,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<3, GLfloat>* const values) { - glProgramUniform3fvEXT(_id, location, count, values[0].data()); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<4, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniform4fvImplementation)(location, count, values); } @@ -478,10 +472,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform4fv(location, count, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<4, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform4fv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<4, GLfloat>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform4fvEXT(_id, location, count, values[0].data()); #else static_cast(location); @@ -491,12 +489,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<4, GLfloat>* const values) { - glProgramUniform4fvEXT(_id, location, count, values[0].data()); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Int* const values) { (this->*Context::current()->state().shaderProgram->uniform1ivImplementation)(location, count, values); } @@ -506,10 +498,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform1iv(location, count, values); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const GLint* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform1iv(_id, location, count, values); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const GLint* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform1ivEXT(_id, location, count, values); #else static_cast(location); @@ -519,12 +515,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const GLint* const values) { - glProgramUniform1ivEXT(_id, location, count, values); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<2, Int>* const values) { (this->*Context::current()->state().shaderProgram->uniform2ivImplementation)(location, count, values); } @@ -534,10 +524,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform2iv(location, count, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<2, GLint>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform2iv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<2, GLint>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform2ivEXT(_id, location, count, values[0].data()); #else static_cast(location); @@ -547,12 +541,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<2, GLint>* const values) { - glProgramUniform2ivEXT(_id, location, count, values[0].data()); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<3, Int>* const values) { (this->*Context::current()->state().shaderProgram->uniform3ivImplementation)(location, count, values); } @@ -562,10 +550,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform3iv(location, count, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<3, GLint>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform3iv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<3, GLint>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform3ivEXT(_id, location, count, values[0].data()); #else static_cast(location); @@ -575,12 +567,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<3, GLint>* const values) { - glProgramUniform3ivEXT(_id, location, count, values[0].data()); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<4, Int>* const values) { (this->*Context::current()->state().shaderProgram->uniform4ivImplementation)(location, count, values); } @@ -590,10 +576,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniform4iv(location, count, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<4, GLint>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform4iv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<4, GLint>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniform4ivEXT(_id, location, count, values[0].data()); #else static_cast(location); @@ -603,12 +593,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<4, GLint>* const values) { - glProgramUniform4ivEXT(_id, location, count, values[0].data()); -} -#endif - #ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const UnsignedInt* const values) { (this->*Context::current()->state().shaderProgram->uniform1uivImplementation)(location, count, values); @@ -620,23 +604,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const GLuint* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform1uiv(_id, location, count, values); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniform1uivEXT(_id, location, count, values); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const GLuint* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const GLuint* const values) { glProgramUniform1uivEXT(_id, location, count, values); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<2, UnsignedInt>* const values) { (this->*Context::current()->state().shaderProgram->uniform2uivImplementation)(location, count, values); @@ -648,23 +621,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<2, GLuint>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform2uiv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniform2uivEXT(_id, location, count, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<2, GLuint>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<2, GLuint>* const values) { glProgramUniform2uivEXT(_id, location, count, values[0].data()); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<3, UnsignedInt>* const values) { (this->*Context::current()->state().shaderProgram->uniform3uivImplementation)(location, count, values); @@ -676,23 +638,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<3, GLuint>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform3uiv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniform3uivEXT(_id, location, count, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<3, GLuint>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<3, GLuint>* const values) { glProgramUniform3uivEXT(_id, location, count, values[0].data()); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::Vector<4, UnsignedInt>* const values) { (this->*Context::current()->state().shaderProgram->uniform4uivImplementation)(location, count, values); @@ -704,24 +655,13 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::Vector<4, GLuint>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniform4uiv(_id, location, count, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniform4uivEXT(_id, location, count, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<4, GLuint>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::Vector<4, GLuint>* const values) { glProgramUniform4uivEXT(_id, location, count, values[0].data()); } #endif -#endif #ifndef MAGNUM_TARGET_GLES void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Double* const values) { @@ -737,7 +677,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniform1dv(_id, location, count, values); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const GLdouble* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const GLdouble* const values) { glProgramUniform1dvEXT(_id, location, count, values); } @@ -754,7 +694,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniform2dv(_id, location, count, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<2, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::Vector<2, GLdouble>* const values) { glProgramUniform2dvEXT(_id, location, count, values[0].data()); } @@ -771,7 +711,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniform3dv(_id, location, count, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<3, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::Vector<3, GLdouble>* const values) { glProgramUniform3dvEXT(_id, location, count, values[0].data()); } @@ -788,7 +728,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniform4dv(_id, location, count, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::Vector<4, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::Vector<4, GLdouble>* const values) { glProgramUniform4dvEXT(_id, location, count, values[0].data()); } #endif @@ -802,10 +742,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniformMatrix2fv(location, count, GL_FALSE, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 2, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix2fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 2, GLfloat>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniformMatrix2fvEXT(_id, location, count, GL_FALSE, values[0].data()); #else static_cast(location); @@ -815,12 +759,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 2, GLfloat>* const values) { - glProgramUniformMatrix2fvEXT(_id, location, count, GL_FALSE, values[0].data()); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<3, 3, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix3fvImplementation)(location, count, values); } @@ -830,10 +768,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniformMatrix3fv(location, count, GL_FALSE, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 3, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix3fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 3, GLfloat>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniformMatrix3fvEXT(_id, location, count, GL_FALSE, values[0].data()); #else static_cast(location); @@ -843,12 +785,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 3, GLfloat>* const values) { - glProgramUniformMatrix3fvEXT(_id, location, count, GL_FALSE, values[0].data()); -} -#endif - void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<4, 4, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix4fvImplementation)(location, count, values); } @@ -858,10 +794,14 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c glUniformMatrix4fv(location, count, GL_FALSE, values[0].data()); } +#ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 4, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix4fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) +} +#endif + +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 4, GLfloat>* const values) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniformMatrix4fvEXT(_id, location, count, GL_FALSE, values[0].data()); #else static_cast(location); @@ -871,12 +811,6 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 4, GLfloat>* const values) { - glProgramUniformMatrix4fvEXT(_id, location, count, GL_FALSE, values[0].data()); -} -#endif - #ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<2, 3, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix2x3fvImplementation)(location, count, values); @@ -888,23 +822,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 3, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix2x3fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniformMatrix2x3fvEXT(_id, location, count, GL_FALSE, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 3, GLfloat>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 3, GLfloat>* const values) { glProgramUniformMatrix2x3fvEXT(_id, location, count, GL_FALSE, values[0].data()); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<3, 2, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix3x2fvImplementation)(location, count, values); @@ -916,23 +839,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 2, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES - glProgramUniformMatrix3x2fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glProgramUniformMatrix3x2fv(_id, location, count, GL_FALSE, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 2, GLfloat>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 2, GLfloat>* const values) { glProgramUniformMatrix3x2fvEXT(_id, location, count, GL_FALSE, values[0].data()); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<2, 4, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix2x4fvImplementation)(location, count, values); @@ -944,23 +856,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 4, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix2x4fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniformMatrix2x4fvEXT(_id, location, count, GL_FALSE, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 4, GLfloat>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 4, GLfloat>* const values) { glProgramUniformMatrix2x4fvEXT(_id, location, count, GL_FALSE, values[0].data()); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<4, 2, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix4x2fvImplementation)(location, count, values); @@ -972,23 +873,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 2, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix4x2fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniformMatrix4x2fvEXT(_id, location, count, GL_FALSE, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 2, GLfloat>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 2, GLfloat>* const values) { glProgramUniformMatrix4x2fvEXT(_id, location, count, GL_FALSE, values[0].data()); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<3, 4, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix3x4fvImplementation)(location, count, values); @@ -1000,23 +890,12 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 4, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix3x4fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniformMatrix3x4fvEXT(_id, location, count, GL_FALSE, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 4, GLfloat>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 4, GLfloat>* const values) { glProgramUniformMatrix3x4fvEXT(_id, location, count, GL_FALSE, values[0].data()); } -#endif void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<4, 3, Float>* const values) { (this->*Context::current()->state().shaderProgram->uniformMatrix4x3fvImplementation)(location, count, values); @@ -1028,24 +907,13 @@ void AbstractShaderProgram::uniformImplementationDefault(const GLint location, c } void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 3, GLfloat>* const values) { - #ifndef MAGNUM_TARGET_GLES glProgramUniformMatrix4x3fv(_id, location, count, GL_FALSE, values[0].data()); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glProgramUniformMatrix4x3fvEXT(_id, location, count, GL_FALSE, values[0].data()); - #else - static_cast(location); - static_cast(count); - static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); - #endif } -#ifndef MAGNUM_TARGET_GLES -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 3, GLfloat>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 3, GLfloat>* const values) { glProgramUniformMatrix4x3fvEXT(_id, location, count, GL_FALSE, values[0].data()); } #endif -#endif #ifndef MAGNUM_TARGET_GLES void AbstractShaderProgram::setUniform(const Int location, const UnsignedInt count, const Math::RectangularMatrix<2, 2, Double>* const values) { @@ -1061,7 +929,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix2dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 2, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 2, GLdouble>* const values) { glProgramUniformMatrix2dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1078,7 +946,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix3dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 3, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 3, GLdouble>* const values) { glProgramUniformMatrix3dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1095,7 +963,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix4dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 4, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 4, GLdouble>* const values) { glProgramUniformMatrix4dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1112,7 +980,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix2x3dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 3, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 3, GLdouble>* const values) { glProgramUniformMatrix2x3dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1129,7 +997,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix3x2dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 2, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 2, GLdouble>* const values) { glProgramUniformMatrix3x2dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1146,7 +1014,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix2x4dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 4, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<2, 4, GLdouble>* const values) { glProgramUniformMatrix2x4dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1163,7 +1031,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix4x2dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 2, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 2, GLdouble>* const values) { glProgramUniformMatrix4x2dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1180,7 +1048,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix3x4dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 4, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<3, 4, GLdouble>* const values) { glProgramUniformMatrix3x4dvEXT(_id, location, count, GL_FALSE, values[0].data()); } @@ -1197,7 +1065,7 @@ void AbstractShaderProgram::uniformImplementationSSO(const GLint location, const glProgramUniformMatrix4x3dv(_id, location, count, GL_FALSE, values[0].data()); } -void AbstractShaderProgram::uniformImplementationDSA(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 3, GLdouble>* const values) { +void AbstractShaderProgram::uniformImplementationDSAEXT(const GLint location, const GLsizei count, const Math::RectangularMatrix<4, 3, GLdouble>* const values) { glProgramUniformMatrix4x3dvEXT(_id, location, count, GL_FALSE, values[0].data()); } #endif diff --git a/src/Magnum/AbstractShaderProgram.h b/src/Magnum/AbstractShaderProgram.h index bb7c14d4b..b9305c99a 100644 --- a/src/Magnum/AbstractShaderProgram.h +++ b/src/Magnum/AbstractShaderProgram.h @@ -319,10 +319,10 @@ also @ref Attribute::DataType enum for additional type options. queries don't result in repeated @fn_gl{Get} calls. If extension @extension{ARB,separate_shader_objects} (part of OpenGL 4.1), -@extension{EXT,direct_state_access} or @es_extension{EXT,separate_shader_objects} -on OpenGL ES is available, uniform setting functions use DSA functions to avoid -unnecessary calls to @fn_gl{UseProgram}. See @ref setUniform() documentation -for more information. +@extension{EXT,direct_state_access} desktop extension, @es_extension{EXT,separate_shader_objects} +OpenGL ES extension or OpenGL ES 3.1 is available, uniform setting functions +use DSA functions to avoid unnecessary calls to @fn_gl{UseProgram}. See +@ref setUniform() documentation for more information. To achieve least state changes, set all uniforms in one run -- method chaining comes in handy. @@ -779,9 +779,10 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { * @param values Values * * If neither @extension{ARB,separate_shader_objects} (part of OpenGL - * 4.1) nor @extension{EXT,direct_state_access} nor - * @es_extension{EXT,separate_shader_objects} (on OpenGL ES) is - * available, the shader is marked for use before the operation. + * 4.1) nor @extension{EXT,direct_state_access} desktop extension nor + * @es_extension{EXT,separate_shader_objects} OpenGL ES extension nor + * OpenGL ES 3.1 is available, the shader is marked for use before the + * operation. * @see @ref setUniform(Int, const T&), @fn_gl{UseProgram}, @fn_gl{Uniform} * or @fn_gl{ProgramUniform}/@fn_gl_extension{ProgramUniform,EXT,direct_state_access}. */ @@ -866,6 +867,27 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { void use(); #endif + /* + Currently, there are four supported ways to call glProgramUniform(): + + - EXT_direct_state_access (desktop GL only, EXT suffix) + - EXT_separate_shader_objects (OpenGL ES extension, EXT suffix) + - ARB_separate_shader_objects (desktop GL only, no suffix) + - OpenGL ES 3.1, no suffix + + To avoid copypasta and filesize bloat, this is merged to just two + variants of implementation functions: + + - uniformImplementationSSO() - functions without suffix, used if + ARB_separate_shader_objects desktop extension or OpenGL ES 3.1 + is available, completely disabled for ES2 + - uniformImplementationDSAEXT_SSOEXT() / uniformImplementationDSAEXT() -- + functions with EXT suffix, used if EXT_direct_state_access + desktop exttension or EXT_separate_shader_objects ES 2.0 / ES 3.0 + extension is available, functions which don't have equivalents + on ES (double arguments) don't have the _SSOEXT suffix + */ + void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const GLfloat* values); void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const Math::Vector<2, GLfloat>* values); void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const Math::Vector<3, GLfloat>* values); @@ -886,6 +908,7 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const Math::Vector<3, GLdouble>* values); void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const Math::Vector<4, GLdouble>* values); #endif + #ifndef MAGNUM_TARGET_GLES2 void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const GLfloat* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<2, GLfloat>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<3, GLfloat>* values); @@ -894,7 +917,6 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<2, GLint>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<3, GLint>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<4, GLint>* values); - #ifndef MAGNUM_TARGET_GLES2 void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const GLuint* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<2, GLuint>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<3, GLuint>* values); @@ -906,23 +928,25 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<3, GLdouble>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::Vector<4, GLdouble>* values); #endif + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const GLfloat* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<2, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<3, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<4, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const GLint* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<2, GLint>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<3, GLint>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<4, GLint>* values); + #ifndef MAGNUM_TARGET_GLES2 + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const GLuint* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<2, GLuint>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<3, GLuint>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::Vector<4, GLuint>* values); + #endif #ifndef MAGNUM_TARGET_GLES - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const GLfloat* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<2, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<3, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<4, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const GLint* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<2, GLint>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<3, GLint>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<4, GLint>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const GLuint* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<2, GLuint>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<3, GLuint>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<4, GLuint>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const GLdouble* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<2, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<3, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::Vector<4, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const GLdouble* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::Vector<2, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::Vector<3, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::Vector<4, GLdouble>* values); #endif void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const Math::RectangularMatrix<2, 2, GLfloat>* values); @@ -947,10 +971,10 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const Math::RectangularMatrix<3, 4, GLdouble>* values); void MAGNUM_LOCAL uniformImplementationDefault(GLint location, GLsizei count, const Math::RectangularMatrix<4, 3, GLdouble>* values); #endif + #ifndef MAGNUM_TARGET_GLES2 void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<2, 2, GLfloat>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<3, 3, GLfloat>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<4, 4, GLfloat>* values); - #ifndef MAGNUM_TARGET_GLES2 void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<2, 3, GLfloat>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<3, 2, GLfloat>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<2, 4, GLfloat>* values); @@ -969,25 +993,27 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<3, 4, GLdouble>* values); void MAGNUM_LOCAL uniformImplementationSSO(GLint location, GLsizei count, const Math::RectangularMatrix<4, 3, GLdouble>* values); #endif + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<2, 2, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<3, 3, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<4, 4, GLfloat>* values); + #ifndef MAGNUM_TARGET_GLES2 + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<2, 3, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<3, 2, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<2, 4, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<4, 2, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<3, 4, GLfloat>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT_SSOEXT(GLint location, GLsizei count, const Math::RectangularMatrix<4, 3, GLfloat>* values); + #endif #ifndef MAGNUM_TARGET_GLES - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<2, 2, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<3, 3, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<4, 4, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<2, 3, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<3, 2, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<2, 4, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<4, 2, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<3, 4, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<4, 3, GLfloat>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<2, 2, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<3, 3, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<4, 4, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<2, 3, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<3, 2, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<2, 4, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<4, 2, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<3, 4, GLdouble>* values); - void MAGNUM_LOCAL uniformImplementationDSA(GLint location, GLsizei count, const Math::RectangularMatrix<4, 3, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<2, 2, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<3, 3, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<4, 4, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<2, 3, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<3, 2, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<2, 4, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<4, 2, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<3, 4, GLdouble>* values); + void MAGNUM_LOCAL uniformImplementationDSAEXT(GLint location, GLsizei count, const Math::RectangularMatrix<4, 3, GLdouble>* values); #endif GLuint _id; diff --git a/src/Magnum/Implementation/ShaderProgramState.cpp b/src/Magnum/Implementation/ShaderProgramState.cpp index 37fc7aa32..e55a22313 100644 --- a/src/Magnum/Implementation/ShaderProgramState.cpp +++ b/src/Magnum/Implementation/ShaderProgramState.cpp @@ -41,16 +41,15 @@ ShaderProgramState::ShaderProgramState(Context& context, std::vector()) #else - if(context.isExtensionSupported()) + if(context.isVersionSupported(Version::GLES310)) #endif { #ifndef MAGNUM_TARGET_GLES extensions.push_back(Extensions::GL::ARB::separate_shader_objects::string()); - #else - extensions.push_back(Extensions::GL::EXT::separate_shader_objects::string()); #endif uniform1fvImplementation = &AbstractShaderProgram::uniformImplementationSSO; @@ -61,12 +60,10 @@ ShaderProgramState::ShaderProgramState(Context& context, std::vector()) { + if(context.isExtensionSupported()) + #else + if(context.isExtensionSupported()) + #endif + { + #ifndef MAGNUM_TARGET_GLES extensions.push_back(Extensions::GL::EXT::direct_state_access::string()); + #else + extensions.push_back(Extensions::GL::EXT::separate_shader_objects::string()); + #endif - uniform1fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform2fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform3fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform4fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform1ivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform2ivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform3ivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform4ivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform1uivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform2uivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform3uivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform4uivImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform1dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform2dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform3dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniform4dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - - uniformMatrix2fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix3fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix4fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix2x3fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix3x2fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix2x4fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix4x2fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix3x4fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix4x3fvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix2dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix3dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix4dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix2x3dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix3x2dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix2x4dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix4x2dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix3x4dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - uniformMatrix4x3dvImplementation = &AbstractShaderProgram::uniformImplementationDSA; - } - #endif + uniform1fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform2fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform3fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform4fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform1ivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform2ivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform3ivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform4ivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + #ifndef MAGNUM_TARGET_GLES2 + uniform1uivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform2uivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform3uivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniform4uivImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + #endif + #ifndef MAGNUM_TARGET_GLES + uniform1dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniform2dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniform3dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniform4dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + #endif - else { + uniformMatrix2fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniformMatrix3fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniformMatrix4fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + #ifndef MAGNUM_TARGET_GLES2 + uniformMatrix2x3fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniformMatrix3x2fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniformMatrix2x4fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniformMatrix4x2fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniformMatrix3x4fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + uniformMatrix4x3fvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT; + #endif + #ifndef MAGNUM_TARGET_GLES + uniformMatrix2dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix3dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix4dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix2x3dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix3x2dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix2x4dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix4x2dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix3x4dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + uniformMatrix4x3dvImplementation = &AbstractShaderProgram::uniformImplementationDSAEXT; + #endif + } else { uniform1fvImplementation = &AbstractShaderProgram::uniformImplementationDefault; uniform2fvImplementation = &AbstractShaderProgram::uniformImplementationDefault; uniform3fvImplementation = &AbstractShaderProgram::uniformImplementationDefault;