diff --git a/include/ACGL/OpenGL/EXT_direct_state_access.hh b/include/ACGL/OpenGL/EXT_direct_state_access.hh index b1a48c5c9fe63a259d8943c3296ac0dd6e776bf8..1fe0b2e6887920eb20ae9850c84eedc5244a8102 100644 --- a/include/ACGL/OpenGL/EXT_direct_state_access.hh +++ b/include/ACGL/OpenGL/EXT_direct_state_access.hh @@ -22,6 +22,9 @@ #include <ACGL/ACGL.hh> #include <ACGL/OpenGL/GL.hh> +namespace ACGL{ +namespace OpenGL{ + /* * This should get called AFTER glewInit but BEFORE any ACGL or DSA *EXT functions get called. * Normally this gets called by acglInit! @@ -31,6 +34,8 @@ */ void initDirectStateAccessFunctions(); +} // OpenGL +} // ACGL // // On some windows configurations ACGLAPIENTRYcan be defined wrong which leads to compile @@ -489,6 +494,9 @@ extern PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC glVertexArrayVertexOffsetEXT; #endif +namespace ACGL{ +namespace OpenGL{ + // // Emulation functions // @@ -706,7 +714,8 @@ void ACGLAPIENTRY glVertexArrayVertexAttribIOffsetEMULATION (GLuint vaobj, GLuin void ACGLAPIENTRY glVertexArrayVertexAttribOffsetEMULATION (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); void ACGLAPIENTRY glVertexArrayVertexOffsetEMULATION (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); - +} // OpenGL +} // ACGL #endif // ACGL_OPENGL_EXT_DIRECT_STATE_ACCESS_HH diff --git a/include/ACGL/OpenGL/Objects/ShaderProgram.hh b/include/ACGL/OpenGL/Objects/ShaderProgram.hh index f5600880df9ff910a0412af5018cec7a41e84011..351a3dfc38afecc800c6aba1c250c099a6347b41 100644 --- a/include/ACGL/OpenGL/Objects/ShaderProgram.hh +++ b/include/ACGL/OpenGL/Objects/ShaderProgram.hh @@ -125,18 +125,18 @@ public: //DSA versions: - inline void setProgramUniform (GLint _location, GLint _v) const { glProgramUniform1iEXT (mContext, _location, _v); } - inline void setProgramUniform (GLint _location, GLfloat _v) const { glProgramUniform1fEXT (mContext, _location, _v); } + inline void setProgramUniform (GLint _location, GLint _v) const { glProgramUniform1i (mContext, _location, _v); } + inline void setProgramUniform (GLint _location, GLfloat _v) const { glProgramUniform1f (mContext, _location, _v); } - inline void setProgramUniform (GLint _location, const glm::vec2& _v) const { glProgramUniform2fvEXT(mContext, _location, 1, glm::value_ptr(_v)); } - inline void setProgramUniform (GLint _location, const glm::vec3& _v) const { glProgramUniform3fvEXT(mContext, _location, 1, glm::value_ptr(_v)); } - inline void setProgramUniform (GLint _location, const glm::vec4& _v) const { glProgramUniform4fvEXT(mContext, _location, 1, glm::value_ptr(_v)); } + inline void setProgramUniform (GLint _location, const glm::vec2& _v) const { glProgramUniform2fv(mContext, _location, 1, glm::value_ptr(_v)); } + inline void setProgramUniform (GLint _location, const glm::vec3& _v) const { glProgramUniform3fv(mContext, _location, 1, glm::value_ptr(_v)); } + inline void setProgramUniform (GLint _location, const glm::vec4& _v) const { glProgramUniform4fv(mContext, _location, 1, glm::value_ptr(_v)); } - inline void setProgramUniform (GLint _location, const glm::mat2& _v, GLboolean _transpose = GL_FALSE) const { glProgramUniformMatrix2fvEXT(mContext, _location, 1, _transpose, glm::value_ptr(_v)); } - inline void setProgramUniform (GLint _location, const glm::mat3& _v, GLboolean _transpose = GL_FALSE) const { glProgramUniformMatrix3fvEXT(mContext, _location, 1, _transpose, glm::value_ptr(_v)); } - inline void setProgramUniform (GLint _location, const glm::mat4& _v, GLboolean _transpose = GL_FALSE) const { glProgramUniformMatrix4fvEXT(mContext, _location, 1, _transpose, glm::value_ptr(_v)); } + inline void setProgramUniform (GLint _location, const glm::mat2& _v, GLboolean _transpose = GL_FALSE) const { glProgramUniformMatrix2fv(mContext, _location, 1, _transpose, glm::value_ptr(_v)); } + inline void setProgramUniform (GLint _location, const glm::mat3& _v, GLboolean _transpose = GL_FALSE) const { glProgramUniformMatrix3fv(mContext, _location, 1, _transpose, glm::value_ptr(_v)); } + inline void setProgramUniform (GLint _location, const glm::mat4& _v, GLboolean _transpose = GL_FALSE) const { glProgramUniformMatrix4fv(mContext, _location, 1, _transpose, glm::value_ptr(_v)); } - inline void setTextureDSA (GLint _location, const ConstSharedTexture& _texture, GLenum _unit = 0) const { glProgramUniform1iEXT(mContext, _location, _unit); _texture->bind(_unit); } + inline void setProgramTexture (GLint _location, const ConstSharedTexture& _texture, GLenum _unit = 0) const { glProgramUniform1i(mContext, _location, _unit); _texture->bind(_unit); } // =================================================================================================== \/ // ============================================================================== HIGH LEVEL FUNCTIONS \/ @@ -168,7 +168,7 @@ public: inline void setProgramUniform (const std::string& _nameInShader, const glm::mat3& _v, GLboolean _transpose = GL_FALSE) const { setProgramUniform( getUniformLocation(_nameInShader), _v); } inline void setProgramUniform (const std::string& _nameInShader, const glm::mat4& _v, GLboolean _transpose = GL_FALSE) const { setProgramUniform( getUniformLocation(_nameInShader), _v); } - inline void setTextureDSA (const std::string& _nameInShader, const ConstSharedTexture& _texture, GLenum _unit = 0) const { setProgramUniform( getUniformLocation(_nameInShader), (GLint) _unit); _texture->bind(_unit); } + inline void setProgramTexture (const std::string& _nameInShader, const ConstSharedTexture& _texture, GLenum _unit = 0) const { setProgramUniform( getUniformLocation(_nameInShader), (GLint) _unit); _texture->bind(_unit); } // =================================================================================================== \/ diff --git a/include/ACGL/OpenGL/Tools.hh b/include/ACGL/OpenGL/Tools.hh index 4e17a0cdbaa3a72aa73bf55ceb8184cf391d73f0..05ce6247648f0853bbb265d0ad26ec5828a12fdf 100644 --- a/include/ACGL/OpenGL/Tools.hh +++ b/include/ACGL/OpenGL/Tools.hh @@ -7,7 +7,7 @@ #define ACGL_OPENGL_TOOLS_HH /* - * Some OpeGL related helper functions. + * Some OpenGL related helper functions. * All the error checking functions are in here. */ @@ -33,6 +33,12 @@ inline GLint getGLTypeSize ( GLenum _type ) return 0; } +uint32_t getOpenGLMinorVersionNumber(); +uint32_t getOpenGLMajorVersionNumber(); + +// returns the combined version number as 10*major + minor for easy comparing +uint32_t getOpenGLVersionNumber(); + // for every OpenGL error enum this will return a human readable version of it // similar to gluErrorString, but that function is not available on all plattforms // (read: iOS) diff --git a/src/ACGL/ACGL.cc b/src/ACGL/ACGL.cc index db9820aa8892795262fd22cfba54a5ac9ca350a8..d2b710c9c300f6bee302d21283778bb3ab830300 100644 --- a/src/ACGL/ACGL.cc +++ b/src/ACGL/ACGL.cc @@ -7,7 +7,6 @@ #include <ACGL/OpenGL/GL.hh> #include <ACGL/OpenGL/Tools.hh> -#include <stdlib.h> namespace ACGL { @@ -20,7 +19,7 @@ bool init(void) #ifdef USE_GLEW glewInit(); if (openGLCriticalErrorOccured()) { - ACGL::Utils::error() << "could not init GLEW!" << std::endl; + Utils::error() << "could not init GLEW!" << std::endl; return false; } #endif @@ -28,46 +27,21 @@ bool init(void) // // check OpenGL version // + Utils::debug() << "OpenGL Version: " << OpenGL::getOpenGLMajorVersionNumber() << "." << OpenGL::getOpenGLMinorVersionNumber() << std::endl; - float openGLVersionF = atof( (const char*) glGetString(GL_VERSION) ); - GLint openGLmajorVersion; - GLint openGLminorVersion; - - if (openGLVersionF < 3.0) { - if (openGLVersionF >= 2.1) { - openGLmajorVersion = 2; - openGLminorVersion = 1; - } else { - ACGL::Utils::error() << "OpenGL version " << openGLVersionF << " not supported!" << std::endl; - return false; - } - } else { - // OpenGL 3.0 is needed for this (saves us float/ascii to int conversion) - glGetIntegerv(GL_MAJOR_VERSION, &openGLmajorVersion); - glGetIntegerv(GL_MINOR_VERSION, &openGLminorVersion); - } - if (openGLRareErrorOccured()) { - ACGL::Utils::error() << "could not query OpenGL version!" << std::endl; - return false; - } - - ACGL::Utils::debug() << "OpenGL Version: " << openGLmajorVersion << "." << openGLminorVersion << std::endl; - - uint32_t openGLVersion = (openGLmajorVersion*10 + openGLminorVersion); - if (openGLVersion < ACGL_OPENGL_VERSION) { - ACGL::Utils::error() << "At compile time an OpenGL context of version " << ACGL_OPENGL_VERSION - << " was requested, but the current context only supports " << openGLVersion << std::endl; - //return false; + if (OpenGL::getOpenGLVersionNumber() < ACGL_OPENGL_VERSION) { + Utils::error() << "At compile time an OpenGL context of version " << ACGL_OPENGL_VERSION + << " was requested, but the current context only supports " << OpenGL::getOpenGLVersionNumber() << std::endl; + return false; } // // Init DirectStateAccess functions: // (using the extension versions or our own (slower) emulation) // - initDirectStateAccessFunctions(); - + OpenGL::initDirectStateAccessFunctions(); return true; } -}; +} diff --git a/src/ACGL/OpenGL/EXT_direct_state_access.cc b/src/ACGL/OpenGL/EXT_direct_state_access.cc index 68c0fbfb27e6ed8e0dc43a2e09002eaeaa33fe25..a92a2772d3a866f15b0987292c1f144257d0eb71 100644 --- a/src/ACGL/OpenGL/EXT_direct_state_access.cc +++ b/src/ACGL/OpenGL/EXT_direct_state_access.cc @@ -1,19 +1,205 @@ #include "ACGL/OpenGL/EXT_direct_state_access.hh" #include <ACGL/OpenGL/Tools.hh> -void mapEmulationToEXTPointers(); +namespace ACGL{ +namespace OpenGL{ + +#if (defined(OPENGL_ES) && defined(PLATFORM_IOS)) +void mapProgramUniformFromEXTiOS(); +#endif +void mapProgramUniformFromEXT(); +void mapProgramUniformFromEMULATION(); +void mapDSAFromEMULATION(); void initDirectStateAccessFunctions() { - if (GLEW_EXT_direct_state_access) { - ACGL::Utils::debug() << "native EXT_direct_state_access detected" << std::endl; - } else { - ACGL::Utils::message() << "EXT_direct_state_access has to be emulated - some of the functions could be missing..." << std::endl; - mapEmulationToEXTPointers(); - } + // + // Handle glProgramUniform*() calls + // +# if defined(OPENGL_ES) +# if ( defined(PLATFORM_IOS) && defined(GL_EXT_separate_shader_objects) ) + // iOS >= 5.0 with 2011 hardware should implement the seperate_shader_objects + // extension which provides glProgramUniform*EXT calls + mapProgramUniformFromEXTiOS(); +# else + // old iOS versions and other OpenGL ES implementations have to emulate the + // calls to glProgramUniform*() + mapProgramUniformFromEMULATION(); +# endif + // other OpenGL ES targets: + mapProgramUniformFromEMULATION(); +# else + // desktop: + if (getOpenGLVersionNumber() < 41) { + // glUniformProgram*() is part of GL 4.1, so there's nothing to do from 4.1 on +# ifdef USE_GLEW + if (GLEW_ARB_separate_shader_objects || GLEW_EXT_direct_state_access) { + mapProgramUniformFromEXT(); + } else { + mapProgramUniformFromEMULATION(); + } +# else + mapProgramUniformFromEMULATION(); +# endif + } +# endif + + // + // other DSA functions: + // +# ifdef USE_GLEW + if (GLEW_EXT_direct_state_access) { + ACGL::Utils::debug() << "native EXT_direct_state_access detected" << std::endl; + } else { + ACGL::Utils::message() << "EXT_direct_state_access has to be emulated - some of the functions could be missing..." << std::endl; + mapDSAFromEMULATION(); + } +# else + mapDSAFromEMULATION(); +# endif +} + +#if (defined(OPENGL_ES) && defined(PLATFORM_IOS)) +// TODO: testing +void mapProgramUniformFromEXTiOS() +{ + glProgramUniform1f = glProgramUniform1fEXT; + glProgramUniform1fv = glProgramUniform1fvEXT; + glProgramUniform1i = glProgramUniform1iEXT; + glProgramUniform1iv = glProgramUniform1ivEXT; + glProgramUniform2f = glProgramUniform2fEXT; + glProgramUniform2fv = glProgramUniform2fvEXT; + glProgramUniform2i = glProgramUniform2iEXT; + glProgramUniform2iv = glProgramUniform2ivEXT; + glProgramUniform3f = glProgramUniform3fEXT; + glProgramUniform3fv = glProgramUniform3fvEXT; + glProgramUniform3i = glProgramUniform3iEXT; + glProgramUniform3iv = glProgramUniform3ivEXT; + glProgramUniform4f = glProgramUniform4fEXT; + glProgramUniform4fv = glProgramUniform4fvEXT; + glProgramUniform4i = glProgramUniform4iEXT; + glProgramUniform4iv = glProgramUniform4ivEXT; + glProgramUniformMatrix2fv = glProgramUniformMatrix2fvEXT; + glProgramUniformMatrix3fv = glProgramUniformMatrix3fvEXT; + glProgramUniformMatrix4fv = glProgramUniformMatrix4fvEXT; +} +#endif + + +void mapProgramUniformFromEXT() +{ + glProgramUniform1f = glProgramUniform1fEXT; + glProgramUniform1fv = glProgramUniform1fvEXT; + glProgramUniform1i = glProgramUniform1iEXT; + glProgramUniform1iv = glProgramUniform1ivEXT; + glProgramUniform1ui = glProgramUniform1uiEXT; + glProgramUniform1uiv = glProgramUniform1uivEXT; + glProgramUniform2f = glProgramUniform2fEXT; + glProgramUniform2fv = glProgramUniform2fvEXT; + glProgramUniform2i = glProgramUniform2iEXT; + glProgramUniform2iv = glProgramUniform2ivEXT; + glProgramUniform2ui = glProgramUniform2uiEXT; + glProgramUniform2uiv = glProgramUniform2uivEXT; + glProgramUniform3f = glProgramUniform3fEXT; + glProgramUniform3fv = glProgramUniform3fvEXT; + glProgramUniform3i = glProgramUniform3iEXT; + glProgramUniform3iv = glProgramUniform3ivEXT; + glProgramUniform3ui = glProgramUniform3uiEXT; + glProgramUniform3uiv = glProgramUniform3uivEXT; + glProgramUniform4f = glProgramUniform4fEXT; + glProgramUniform4fv = glProgramUniform4fvEXT; + glProgramUniform4i = glProgramUniform4iEXT; + glProgramUniform4iv = glProgramUniform4ivEXT; + glProgramUniform4ui = glProgramUniform4uiEXT; + glProgramUniform4uiv = glProgramUniform4uivEXT; + glProgramUniformMatrix2fv = glProgramUniformMatrix2fvEXT; + glProgramUniformMatrix2x3fv = glProgramUniformMatrix2x3fvEXT; + glProgramUniformMatrix2x4fv = glProgramUniformMatrix2x4fvEXT; + glProgramUniformMatrix3fv = glProgramUniformMatrix3fvEXT; + glProgramUniformMatrix3x2fv = glProgramUniformMatrix3x2fvEXT; + glProgramUniformMatrix3x4fv = glProgramUniformMatrix3x4fvEXT; + glProgramUniformMatrix4fv = glProgramUniformMatrix4fvEXT; + glProgramUniformMatrix4x2fv = glProgramUniformMatrix4x2fvEXT; + glProgramUniformMatrix4x3fv = glProgramUniformMatrix4x3fvEXT; +} + +void mapProgramUniformFromEMULATION() +{ + glProgramUniform1f = glProgramUniform1fEMULATION; + glProgramUniform1fv = glProgramUniform1fvEMULATION; + glProgramUniform1i = glProgramUniform1iEMULATION; + glProgramUniform1iv = glProgramUniform1ivEMULATION; + glProgramUniform1ui = glProgramUniform1uiEMULATION; + glProgramUniform1uiv = glProgramUniform1uivEMULATION; + glProgramUniform2f = glProgramUniform2fEMULATION; + glProgramUniform2fv = glProgramUniform2fvEMULATION; + glProgramUniform2i = glProgramUniform2iEMULATION; + glProgramUniform2iv = glProgramUniform2ivEMULATION; + glProgramUniform2ui = glProgramUniform2uiEMULATION; + glProgramUniform2uiv = glProgramUniform2uivEMULATION; + glProgramUniform3f = glProgramUniform3fEMULATION; + glProgramUniform3fv = glProgramUniform3fvEMULATION; + glProgramUniform3i = glProgramUniform3iEMULATION; + glProgramUniform3iv = glProgramUniform3ivEMULATION; + glProgramUniform3ui = glProgramUniform3uiEMULATION; + glProgramUniform3uiv = glProgramUniform3uivEMULATION; + glProgramUniform4f = glProgramUniform4fEMULATION; + glProgramUniform4fv = glProgramUniform4fvEMULATION; + glProgramUniform4i = glProgramUniform4iEMULATION; + glProgramUniform4iv = glProgramUniform4ivEMULATION; + glProgramUniform4ui = glProgramUniform4uiEMULATION; + glProgramUniform4uiv = glProgramUniform4uivEMULATION; + glProgramUniformMatrix2fv = glProgramUniformMatrix2fvEMULATION; + glProgramUniformMatrix2x3fv = glProgramUniformMatrix2x3fvEMULATION; + glProgramUniformMatrix2x4fv = glProgramUniformMatrix2x4fvEMULATION; + glProgramUniformMatrix3fv = glProgramUniformMatrix3fvEMULATION; + glProgramUniformMatrix3x2fv = glProgramUniformMatrix3x2fvEMULATION; + glProgramUniformMatrix3x4fv = glProgramUniformMatrix3x4fvEMULATION; + glProgramUniformMatrix4fv = glProgramUniformMatrix4fvEMULATION; + glProgramUniformMatrix4x2fv = glProgramUniformMatrix4x2fvEMULATION; + glProgramUniformMatrix4x3fv = glProgramUniformMatrix4x3fvEMULATION; + + // + // just to be sure the EXT versions are also defined + // (we can't put them in mapDSAFromEMULATION in case they are defined + // from the GLEW_ARB_separate_shader_objects extension!) + // + glProgramUniform1fEXT = glProgramUniform1fEMULATION; + glProgramUniform1fvEXT = glProgramUniform1fvEMULATION; + glProgramUniform1iEXT = glProgramUniform1iEMULATION; + glProgramUniform1ivEXT = glProgramUniform1ivEMULATION; + glProgramUniform1uiEXT = glProgramUniform1uiEMULATION; + glProgramUniform1uivEXT = glProgramUniform1uivEMULATION; + glProgramUniform2fEXT = glProgramUniform2fEMULATION; + glProgramUniform2fvEXT = glProgramUniform2fvEMULATION; + glProgramUniform2iEXT = glProgramUniform2iEMULATION; + glProgramUniform2ivEXT = glProgramUniform2ivEMULATION; + glProgramUniform2uiEXT = glProgramUniform2uiEMULATION; + glProgramUniform2uivEXT = glProgramUniform2uivEMULATION; + glProgramUniform3fEXT = glProgramUniform3fEMULATION; + glProgramUniform3fvEXT = glProgramUniform3fvEMULATION; + glProgramUniform3iEXT = glProgramUniform3iEMULATION; + glProgramUniform3ivEXT = glProgramUniform3ivEMULATION; + glProgramUniform3uiEXT = glProgramUniform3uiEMULATION; + glProgramUniform3uivEXT = glProgramUniform3uivEMULATION; + glProgramUniform4fEXT = glProgramUniform4fEMULATION; + glProgramUniform4fvEXT = glProgramUniform4fvEMULATION; + glProgramUniform4iEXT = glProgramUniform4iEMULATION; + glProgramUniform4ivEXT = glProgramUniform4ivEMULATION; + glProgramUniform4uiEXT = glProgramUniform4uiEMULATION; + glProgramUniform4uivEXT = glProgramUniform4uivEMULATION; + glProgramUniformMatrix2fvEXT = glProgramUniformMatrix2fvEMULATION; + glProgramUniformMatrix2x3fvEXT = glProgramUniformMatrix2x3fvEMULATION; + glProgramUniformMatrix2x4fvEXT = glProgramUniformMatrix2x4fvEMULATION; + glProgramUniformMatrix3fvEXT = glProgramUniformMatrix3fvEMULATION; + glProgramUniformMatrix3x2fvEXT = glProgramUniformMatrix3x2fvEMULATION; + glProgramUniformMatrix3x4fvEXT = glProgramUniformMatrix3x4fvEMULATION; + glProgramUniformMatrix4fvEXT = glProgramUniformMatrix4fvEMULATION; + glProgramUniformMatrix4x2fvEXT = glProgramUniformMatrix4x2fvEMULATION; + glProgramUniformMatrix4x3fvEXT = glProgramUniformMatrix4x3fvEMULATION; } -void mapEmulationToEXTPointers() +void mapDSAFromEMULATION() { glBindMultiTextureEXT = glBindMultiTextureEMULATION; glCheckNamedFramebufferStatusEXT = glCheckNamedFramebufferStatusEMULATION; @@ -168,39 +354,7 @@ void mapEmulationToEXTPointers() glNamedRenderbufferStorageEXT = glNamedRenderbufferStorageEMULATION; glNamedRenderbufferStorageMultisampleCoverageEXT = glNamedRenderbufferStorageMultisampleCoverageEMULATION; glNamedRenderbufferStorageMultisampleEXT = glNamedRenderbufferStorageMultisampleEMULATION; - glProgramUniform1fEXT = glProgramUniform1fEMULATION; - glProgramUniform1fvEXT = glProgramUniform1fvEMULATION; - glProgramUniform1iEXT = glProgramUniform1iEMULATION; - glProgramUniform1ivEXT = glProgramUniform1ivEMULATION; - glProgramUniform1uiEXT = glProgramUniform1uiEMULATION; - glProgramUniform1uivEXT = glProgramUniform1uivEMULATION; - glProgramUniform2fEXT = glProgramUniform2fEMULATION; - glProgramUniform2fvEXT = glProgramUniform2fvEMULATION; - glProgramUniform2iEXT = glProgramUniform2iEMULATION; - glProgramUniform2ivEXT = glProgramUniform2ivEMULATION; - glProgramUniform2uiEXT = glProgramUniform2uiEMULATION; - glProgramUniform2uivEXT = glProgramUniform2uivEMULATION; - glProgramUniform3fEXT = glProgramUniform3fEMULATION; - glProgramUniform3fvEXT = glProgramUniform3fvEMULATION; - glProgramUniform3iEXT = glProgramUniform3iEMULATION; - glProgramUniform3ivEXT = glProgramUniform3ivEMULATION; - glProgramUniform3uiEXT = glProgramUniform3uiEMULATION; - glProgramUniform3uivEXT = glProgramUniform3uivEMULATION; - glProgramUniform4fEXT = glProgramUniform4fEMULATION; - glProgramUniform4fvEXT = glProgramUniform4fvEMULATION; - glProgramUniform4iEXT = glProgramUniform4iEMULATION; - glProgramUniform4ivEXT = glProgramUniform4ivEMULATION; - glProgramUniform4uiEXT = glProgramUniform4uiEMULATION; - glProgramUniform4uivEXT = glProgramUniform4uivEMULATION; - glProgramUniformMatrix2fvEXT = glProgramUniformMatrix2fvEMULATION; - glProgramUniformMatrix2x3fvEXT = glProgramUniformMatrix2x3fvEMULATION; - glProgramUniformMatrix2x4fvEXT = glProgramUniformMatrix2x4fvEMULATION; - glProgramUniformMatrix3fvEXT = glProgramUniformMatrix3fvEMULATION; - glProgramUniformMatrix3x2fvEXT = glProgramUniformMatrix3x2fvEMULATION; - glProgramUniformMatrix3x4fvEXT = glProgramUniformMatrix3x4fvEMULATION; - glProgramUniformMatrix4fvEXT = glProgramUniformMatrix4fvEMULATION; - glProgramUniformMatrix4x2fvEXT = glProgramUniformMatrix4x2fvEMULATION; - glProgramUniformMatrix4x3fvEXT = glProgramUniformMatrix4x3fvEMULATION; + glPushClientAttribDefaultEXT = glPushClientAttribDefaultEMULATION; glTextureBufferEXT = glTextureBufferEMULATION; glTextureImage1DEXT = glTextureImage1DEMULATION; @@ -230,6 +384,9 @@ void mapEmulationToEXTPointers() glVertexArrayVertexOffsetEXT = glVertexArrayVertexOffsetEMULATION; } +} // OpenGL +} // ACGL + #ifndef USE_GLEW // // Without GLEW we use our own pointers: @@ -452,6 +609,8 @@ PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC glVertexArrayVertexOffsetEXT; +namespace ACGL{ +namespace OpenGL{ //////////////////////////////////////////////////////////////////////////////////////////////////// // The emulation functions: // Note: not all are implemented yet ;-) @@ -1366,6 +1525,9 @@ void glVertexArrayVertexAttribOffsetEMULATION (GLuint vaobj, GLuint buffer, GLui void glVertexArrayVertexOffsetEMULATION (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { ACGL::Utils::error() << "NOT IMPLEMENTED YET" << std::endl; } +} // OpenGL +} // ACGL + diff --git a/src/ACGL/OpenGL/Tools.cc b/src/ACGL/OpenGL/Tools.cc index 7bd669a8f9b28f5e1fbd1c859d39b24b0c822f2f..9fa12d48f20f57f5f4f82fbfa4211e938da6081f 100644 --- a/src/ACGL/OpenGL/Tools.cc +++ b/src/ACGL/OpenGL/Tools.cc @@ -9,6 +9,74 @@ namespace ACGL{ namespace OpenGL{ +// +// This is a "private" function that should not be called from outside of this file. +// +// glGetIntegerv(GL_MAJOR_VERSION... and glGetIntegerv(GL_MINOR_VERSION... are great, but +// require OpenGL 3.0 and are not supported on ES :-( so the VERSION string has to get parsed... +// +// OpenGL spec: +// The VERSION ... strings are laid out as follows: +// <version number><space><vendor-specific information> +// +// OpenGL ES spec: +// The VERSION string is laid out as follows: +// "OpenGL ES N.M vendor-specific information" +// +// both specs: +// The version number is either of the form major_number.minor_number or +// major_number.minor_number.release_number, where the numbers all have one or more digits. +// +uint32_t privateGetOpenGLVersion( int _type ) +{ + static uint32_t OGLminor = 0; + static uint32_t OGLmajor = 0; + static uint32_t OGLversion = 0; + + if (OGLversion == 0) { + // calculate the version numbers once: + // NOTE: similar to GLEW we assume here, that the minor and major numbers + // only have one digit. We also ignore release numbers. This will fail e.g. for OpenGL 10.0 + const GLubyte* versionString; + versionString = glGetString(GL_VERSION); + if (openGLRareErrorOccured()) { + ACGL::Utils::error() << "could not query OpenGL version!" << std::endl; + return false; + } + + int positionOfFirstDot = 0; + while ((versionString[positionOfFirstDot] != '\0') && (versionString[positionOfFirstDot] != '.')) ++positionOfFirstDot; + + OGLmajor = versionString[positionOfFirstDot-1] - '0'; + OGLminor = versionString[positionOfFirstDot+1] - '0'; + + if (OGLmajor < 0 || OGLmajor > 9) OGLmajor = 0; + if (OGLminor < 0 || OGLminor > 9) OGLminor = 0; + + OGLversion = OGLmajor*10 + OGLminor; + } + switch (_type) { + case 0: return OGLminor; + case 1: return OGLmajor; + default: return OGLversion; + }; +} + +uint32_t getOpenGLMinorVersionNumber() +{ + return privateGetOpenGLVersion( 0 ); +} + +uint32_t getOpenGLMajorVersionNumber() +{ + return privateGetOpenGLVersion( 1 ); +} + +uint32_t getOpenGLVersionNumber() +{ + return privateGetOpenGLVersion( 2 ); +} + const GLubyte* acglErrorString( GLenum _errorCode ) { #ifdef PLATFORM_IOS