From 020e406cd33ce1929a948abea17844125e645309 Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Thu, 27 Jul 2017 22:41:33 +0200 Subject: [PATCH 1/9] GL3Plus: VAO implementation was completely broken VAOs represent VertexDeclarations not a ShaderPrograms. Even though they are still disabled, PlayPen_BillboardAccurateFacing Test now matches legacy GL. --- .../GL3Plus/include/GLSL/OgreGLSLProgram.h | 3 - .../OgreGL3PlusHardwareBufferManager.h | 2 + .../GL3Plus/include/OgreGL3PlusRenderSystem.h | 1 - .../include/OgreGL3PlusVertexArrayObject.h | 2 +- .../src/GLSL/OgreGLSLMonolithicProgram.cpp | 3 - .../GL3Plus/src/GLSL/OgreGLSLProgram.cpp | 4 -- .../src/GLSL/OgreGLSLSeparableProgram.cpp | 3 - .../src/OgreGL3PlusHardwareBufferManager.cpp | 11 ++++ .../GL3Plus/src/OgreGL3PlusRenderSystem.cpp | 56 ++++++------------- .../src/OgreGL3PlusRenderToVertexBuffer.cpp | 6 -- 10 files changed, 32 insertions(+), 59 deletions(-) diff --git a/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgram.h b/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgram.h index a0b7f7ef346..bcfae34f21a 100644 --- a/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgram.h +++ b/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgram.h @@ -85,7 +85,6 @@ namespace Ogre { GLSLShader* getGeometryShader() const { return mGeometryShader; } GLSLShader* getFragmentShader() const { return mFragmentShader; } GLSLShader* getComputeShader() const { return mComputeShader; } - GL3PlusVertexArrayObject* getVertexArrayObject() { return mVertexArrayObject; } protected: /// Container of atomic counter uniform references that are active in the program object @@ -105,8 +104,6 @@ namespace Ogre { GLSLShader* mFragmentShader; /// Linked compute shader. GLSLShader* mComputeShader; - /// GL handle for the vertex array object - GL3PlusVertexArrayObject* mVertexArrayObject; Ogre::String getCombinedName(void); /// Get the the binary data of a program from the microcode cache diff --git a/RenderSystems/GL3Plus/include/OgreGL3PlusHardwareBufferManager.h b/RenderSystems/GL3Plus/include/OgreGL3PlusHardwareBufferManager.h index 3e8a7b3f936..58e96b0f70b 100644 --- a/RenderSystems/GL3Plus/include/OgreGL3PlusHardwareBufferManager.h +++ b/RenderSystems/GL3Plus/include/OgreGL3PlusHardwareBufferManager.h @@ -50,6 +50,8 @@ namespace Ogre { UniformBufferList mShaderStorageBuffers; + VertexDeclaration* createVertexDeclarationImpl(void); + void destroyVertexDeclarationImpl(VertexDeclaration* decl); public: GL3PlusHardwareBufferManagerBase(); ~GL3PlusHardwareBufferManagerBase(); diff --git a/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h b/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h index 005aa8b9cc1..9165d1ab444 100644 --- a/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h +++ b/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h @@ -278,7 +278,6 @@ namespace Ogre { void setVertexDeclaration(VertexDeclaration* decl) {} - void setVertexDeclaration(VertexDeclaration* decl, VertexBufferBinding* binding) {} /** See RenderSystem. */ diff --git a/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h b/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h index b8a297f064b..9efc6d2d6fd 100644 --- a/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h +++ b/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h @@ -34,7 +34,7 @@ Copyright (c) 2000-2014 Torus Knot Software Ltd namespace Ogre { /** Specialisation of VertexDeclaration for OpenGL Vertex Array Object usage */ - class GL3PlusVertexArrayObject + class GL3PlusVertexArrayObject : public VertexDeclaration { protected: /// OpenGL id for the vertex array object diff --git a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp index 19a5c045877..7ef50f5c451 100644 --- a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp +++ b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp @@ -96,9 +96,6 @@ namespace Ogre { void GLSLMonolithicProgram::compileAndLink() { - mVertexArrayObject = new GL3PlusVertexArrayObject(); - mVertexArrayObject->bind(); - // Compile and attach Vertex Program if (mVertexShader) { diff --git a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgram.cpp b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgram.cpp index d18fd952030..496c8d592c6 100644 --- a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgram.cpp +++ b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgram.cpp @@ -46,7 +46,6 @@ namespace Ogre { , mGeometryShader(geometryShader) , mFragmentShader(fragmentShader) , mComputeShader(computeShader) - , mVertexArrayObject(0) { } @@ -54,9 +53,6 @@ namespace Ogre { GLSLProgram::~GLSLProgram(void) { OGRE_CHECK_GL_ERROR(glDeleteProgram(mGLProgramHandle)); - - delete mVertexArrayObject; - mVertexArrayObject = 0; } diff --git a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp index 369e68b776a..d3edaea6839 100644 --- a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp +++ b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp @@ -51,7 +51,6 @@ namespace Ogre fragmentShader, computeShader) { - mVertexArrayObject = new GL3PlusVertexArrayObject(); } GLSLSeparableProgram::~GLSLSeparableProgram() @@ -67,8 +66,6 @@ namespace Ogre OGRE_CHECK_GL_ERROR(glGenProgramPipelines(1, &mGLProgramPipelineHandle)); //OGRE_CHECK_GL_ERROR(glBindProgramPipeline(mGLProgramPipelineHandle)); - mVertexArrayObject->bind(); - loadIndividualProgram(getVertexShader()); loadIndividualProgram(mDomainShader); loadIndividualProgram(mHullShader); diff --git a/RenderSystems/GL3Plus/src/OgreGL3PlusHardwareBufferManager.cpp b/RenderSystems/GL3Plus/src/OgreGL3PlusHardwareBufferManager.cpp index 1e0ea6c5eb2..f14a65eee25 100644 --- a/RenderSystems/GL3Plus/src/OgreGL3PlusHardwareBufferManager.cpp +++ b/RenderSystems/GL3Plus/src/OgreGL3PlusHardwareBufferManager.cpp @@ -35,6 +35,7 @@ Copyright (c) 2000-2014 Torus Knot Software Ltd #include "OgreGL3PlusRenderToVertexBuffer.h" #include "OgreGL3PlusRenderSystem.h" #include "OgreRoot.h" +#include "OgreGL3PlusVertexArrayObject.h" namespace Ogre { @@ -148,6 +149,16 @@ namespace Ogre { return RenderToVertexBufferSharedPtr(new GL3PlusRenderToVertexBuffer); } + VertexDeclaration* GL3PlusHardwareBufferManagerBase::createVertexDeclarationImpl(void) + { + return OGRE_NEW GL3PlusVertexArrayObject(); + } + + void GL3PlusHardwareBufferManagerBase::destroyVertexDeclarationImpl(VertexDeclaration* decl) + { + OGRE_DELETE decl; + } + GLenum GL3PlusHardwareBufferManagerBase::getGLUsage(unsigned int usage) { // this is also used with Textures, so unset non HBU related flags diff --git a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp index 02049c3ff7c..0ccec576fff 100644 --- a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp +++ b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp @@ -1512,8 +1512,15 @@ namespace Ogre { VertexDeclaration::VertexElementList::const_iterator elemIter, elemEnd; elemEnd = decl.end(); + GL3PlusVertexArrayObject* vao = + static_cast(op.vertexData->vertexDeclaration); + // Bind VAO (set of per-vertex attributes: position, normal, etc.). - bool updateVAO = true; + vao->bind(); + + // FIXME: this fixes some rendering issues but leaves VAO's useless + bool updateVAO = true; // !vao->isInitialised(); + if (mCurrentCapabilities->hasCapability(RSC_SEPARATE_SHADER_OBJECTS)) { GLSLSeparableProgram* separableProgram = @@ -1524,10 +1531,6 @@ namespace Ogre { { separableProgram->activate(); } - - updateVAO = !separableProgram->getVertexArrayObject()->isInitialised(); - - separableProgram->getVertexArrayObject()->bind(); } else { @@ -1538,13 +1541,7 @@ namespace Ogre { else { GLSLMonolithicProgram* monolithicProgram = GLSLMonolithicProgramManager::getSingleton().getActiveMonolithicProgram(); - if (monolithicProgram) - { - updateVAO = !monolithicProgram->getVertexArrayObject()->isInitialised(); - - monolithicProgram->getVertexArrayObject()->bind(); - } - else + if (!monolithicProgram) { Ogre::LogManager::getSingleton().logMessage( "ERROR: Failed to create monolithic program.", LML_CRITICAL); @@ -1679,7 +1676,8 @@ namespace Ogre { if (op.useIndexes) { - mStateCacheManager->bindGLBuffer(GL_ELEMENT_ARRAY_BUFFER, + if(updateVAO) + mStateCacheManager->bindGLBuffer(GL_ELEMENT_ARRAY_BUFFER, static_cast(op.indexData->indexBuffer.get())->getGLBufferId()); void *pBufferData = GL_BUFFER_OFFSET(op.indexData->indexStart * op.indexData->indexBuffer->getIndexSize()); @@ -1697,7 +1695,8 @@ namespace Ogre { } else if (op.useIndexes) { - mStateCacheManager->bindGLBuffer(GL_ELEMENT_ARRAY_BUFFER, + if(updateVAO) + mStateCacheManager->bindGLBuffer(GL_ELEMENT_ARRAY_BUFFER, static_cast(op.indexData->indexBuffer.get())->getGLBufferId()); void *pBufferData = GL_BUFFER_OFFSET(op.indexData->indexStart * @@ -1749,32 +1748,14 @@ namespace Ogre { } while (updatePassIterationRenderState()); } - // Unbind VAO (if updated). if (updateVAO) { - if (mCurrentCapabilities->hasCapability(RSC_SEPARATE_SHADER_OBJECTS)) - { - GLSLSeparableProgram* separableProgram = - GLSLSeparableProgramManager::getSingleton().getCurrentSeparableProgram(); - if (separableProgram) - { - separableProgram->getVertexArrayObject()->setInitialised(true); - } - } - else - { - GLSLMonolithicProgram* monolithicProgram = GLSLMonolithicProgramManager::getSingleton().getActiveMonolithicProgram(); - if (monolithicProgram) - { - monolithicProgram->getVertexArrayObject()->setInitialised(true); - } - } - - // Unbind the vertex array object. - // Marks the end of what state will be included. - mStateCacheManager->bindGLVertexArray(0); + vao->setInitialised(true); } + // Unbind the vertex array object. + // Marks the end of what state will be included. + mStateCacheManager->bindGLVertexArray(0); mRenderAttribsBound.clear(); mRenderInstanceAttribsBound.clear(); @@ -2514,8 +2495,7 @@ namespace Ogre { { const GL3PlusHardwareVertexBuffer* hwGlBuffer = static_cast(vertexBuffer.get()); - // FIXME: Having this commented out fixes some rendering issues but leaves VAO's useless - // if (updateVAO) + if (updateVAO) { mStateCacheManager->bindGLBuffer(GL_ARRAY_BUFFER, hwGlBuffer->getGLBufferId()); diff --git a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderToVertexBuffer.cpp b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderToVertexBuffer.cpp index 8164e190183..3163298cd9c 100644 --- a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderToVertexBuffer.cpp +++ b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderToVertexBuffer.cpp @@ -288,12 +288,6 @@ namespace Ogre { GLSLSeparableProgram* separableProgram = GLSLSeparableProgramManager::getSingleton().getCurrentSeparableProgram(); separableProgram->activate(); - separableProgram->getVertexArrayObject()->bind(); - } - else - { - GLSLMonolithicProgram* monolithicProgram = GLSLMonolithicProgramManager::getSingleton().getActiveMonolithicProgram(); - monolithicProgram->getVertexArrayObject()->bind(); } // 'Render' data to the transform buffer. From 9ec00d6096c0bc43038568ad866a90893bae0364 Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 00:24:57 +0200 Subject: [PATCH 2/9] GL3PlusVertexArrayObject: we can assume that mVAO is not NULL --- .../GL3Plus/src/OgreGL3PlusVertexArrayObject.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/RenderSystems/GL3Plus/src/OgreGL3PlusVertexArrayObject.cpp b/RenderSystems/GL3Plus/src/OgreGL3PlusVertexArrayObject.cpp index ec7d4496696..f2a93661390 100644 --- a/RenderSystems/GL3Plus/src/OgreGL3PlusVertexArrayObject.cpp +++ b/RenderSystems/GL3Plus/src/OgreGL3PlusVertexArrayObject.cpp @@ -52,24 +52,17 @@ namespace Ogre { GL3PlusVertexArrayObject::~GL3PlusVertexArrayObject() { - if (mVAO) + if (GL3PlusStateCacheManager* stateCacheManager = mRenderSystem->_getStateCacheManager()) { - if (GL3PlusStateCacheManager* stateCacheManager = mRenderSystem->_getStateCacheManager()) - { - OGRE_CHECK_GL_ERROR(glDeleteVertexArrays(1, &mVAO)); - stateCacheManager->bindGLVertexArray(0); - } - mVAO = 0; + OGRE_CHECK_GL_ERROR(glDeleteVertexArrays(1, &mVAO)); + stateCacheManager->bindGLVertexArray(0); } } void GL3PlusVertexArrayObject::bind(void) { - if (mVAO) - { - mRenderSystem->_getStateCacheManager()->bindGLVertexArray(mVAO); - } + mRenderSystem->_getStateCacheManager()->bindGLVertexArray(mVAO); } From 8abfe0da2885663ce207047bde7add034573e97b Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 00:27:16 +0200 Subject: [PATCH 3/9] GL3Plus: bound attributes should be cached per VAO and not at the RS --- .../GL3Plus/include/OgreGL3PlusRenderSystem.h | 10 +--------- .../include/OgreGL3PlusVertexArrayObject.h | 4 +++- .../GL3Plus/src/OgreGL3PlusRenderSystem.cpp | 18 ++++-------------- 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h b/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h index 9165d1ab444..d0391faa77e 100644 --- a/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h +++ b/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h @@ -117,11 +117,6 @@ namespace Ogre { /// Check if the GL system has already been initialised bool mGLInitialised; - // local data members of _render that were moved here to improve performance - // (save allocations) - vector::type mRenderAttribsBound; - vector::type mRenderInstanceAttribsBound; - #if OGRE_NO_QUAD_BUFFER_STEREO == 0 /// @copydoc RenderSystem::setDrawBuffer virtual bool setDrawBuffer(ColourBufferType colourBuffer); @@ -140,10 +135,7 @@ namespace Ogre { GLenum getBlendMode(SceneBlendFactor ogreBlend) const; void bindVertexElementToGpu( const VertexElement &elem, HardwareVertexBufferSharedPtr vertexBuffer, - const size_t vertexStart, - vector::type &attribsBound, - vector::type &instanceAttribsBound, - bool updateVAO); + const size_t vertexStart, bool updateVAO); public: // Default constructor / destructor diff --git a/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h b/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h index 9efc6d2d6fd..c94c0350dfe 100644 --- a/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h +++ b/RenderSystems/GL3Plus/include/OgreGL3PlusVertexArrayObject.h @@ -42,9 +42,11 @@ namespace Ogre { /// Is this VAO initialised? bool mInitialised; - protected: GL3PlusRenderSystem* mRenderSystem; + // TODO: cache used program attributes here and invalidate on change + vector::type mAttribsBound; + vector::type mInstanceAttribsBound; public: GL3PlusVertexArrayObject(); ~GL3PlusVertexArrayObject(); diff --git a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp index 0ccec576fff..449d4eedc36 100644 --- a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp +++ b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp @@ -143,9 +143,6 @@ namespace Ogre { LogManager::getSingleton().logMessage(getName() + " created."); - mRenderAttribsBound.reserve(100); - mRenderInstanceAttribsBound.reserve(100); - // Get our GLSupport mGLSupport = new GL3PlusSupport(getGLSupport()); glsupport = mGLSupport; @@ -1560,8 +1557,7 @@ namespace Ogre { HardwareVertexBufferSharedPtr vertexBuffer = op.vertexData->vertexBufferBinding->getBuffer(source); - bindVertexElementToGpu(elem, vertexBuffer, op.vertexData->vertexStart, - mRenderAttribsBound, mRenderInstanceAttribsBound, updateVAO); + bindVertexElementToGpu(elem, vertexBuffer, op.vertexData->vertexStart, updateVAO); } if ( globalInstanceVertexBuffer && globalVertexDeclaration != NULL ) @@ -1570,8 +1566,7 @@ namespace Ogre { for (elemIter = globalVertexDeclaration->getElements().begin(); elemIter != elemEnd; ++elemIter) { const VertexElement & elem = *elemIter; - bindVertexElementToGpu(elem, globalInstanceVertexBuffer, 0, - mRenderAttribsBound, mRenderInstanceAttribsBound, updateVAO); + bindVertexElementToGpu(elem, globalInstanceVertexBuffer, 0, updateVAO); } } @@ -1756,9 +1751,6 @@ namespace Ogre { // Unbind the vertex array object. // Marks the end of what state will be included. mStateCacheManager->bindGLVertexArray(0); - - mRenderAttribsBound.clear(); - mRenderInstanceAttribsBound.clear(); } void GL3PlusRenderSystem::setScissorTest(bool enabled, size_t left, @@ -2489,8 +2481,6 @@ namespace Ogre { void GL3PlusRenderSystem::bindVertexElementToGpu( const VertexElement &elem, HardwareVertexBufferSharedPtr vertexBuffer, const size_t vertexStart, - vector::type &attribsBound, - vector::type &instanceAttribsBound, bool updateVAO) { const GL3PlusHardwareVertexBuffer* hwGlBuffer = static_cast(vertexBuffer.get()); @@ -2539,7 +2529,7 @@ namespace Ogre { if (hwGlBuffer->getIsInstanceData()) { OGRE_CHECK_GL_ERROR(glVertexAttribDivisor(attrib, hwGlBuffer->getInstanceDataStepRate())); - instanceAttribsBound.push_back(attrib); + //instanceAttribsBound.push_back(attrib); } } @@ -2588,7 +2578,7 @@ namespace Ogre { // If this attribute hasn't been enabled, do so and keep a record of it. OGRE_CHECK_GL_ERROR(glEnableVertexAttribArray(attrib)); - attribsBound.push_back(attrib); + // attribsBound.push_back(attrib); } } #if OGRE_NO_QUAD_BUFFER_STEREO == 0 From c513f0c40b54c7148d79182ba949d6586883ca59 Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 00:34:14 +0200 Subject: [PATCH 4/9] GL3Plus: do not search for GLSLProgram twice --- .../GL3Plus/include/OgreGL3PlusRenderSystem.h | 3 +- .../GL3Plus/src/OgreGL3PlusRenderSystem.cpp | 39 ++++++------------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h b/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h index d0391faa77e..0ae403455e7 100644 --- a/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h +++ b/RenderSystems/GL3Plus/include/OgreGL3PlusRenderSystem.h @@ -47,6 +47,7 @@ namespace Ogre { */ class GLSLShaderManager; class GLSLShaderFactory; + class GLSLProgram; class HardwareBufferManager; /** @@ -135,7 +136,7 @@ namespace Ogre { GLenum getBlendMode(SceneBlendFactor ogreBlend) const; void bindVertexElementToGpu( const VertexElement &elem, HardwareVertexBufferSharedPtr vertexBuffer, - const size_t vertexStart, bool updateVAO); + const size_t vertexStart, GLSLProgram* program, bool updateVAO); public: // Default constructor / destructor diff --git a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp index 449d4eedc36..d23178baaa9 100644 --- a/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp +++ b/RenderSystems/GL3Plus/src/OgreGL3PlusRenderSystem.cpp @@ -1518,15 +1518,15 @@ namespace Ogre { // FIXME: this fixes some rendering issues but leaves VAO's useless bool updateVAO = true; // !vao->isInitialised(); + GLSLProgram* program = NULL; if (mCurrentCapabilities->hasCapability(RSC_SEPARATE_SHADER_OBJECTS)) { - GLSLSeparableProgram* separableProgram = - GLSLSeparableProgramManager::getSingleton().getCurrentSeparableProgram(); - if (separableProgram) + program = GLSLSeparableProgramManager::getSingleton().getCurrentSeparableProgram(); + if (program) { if (!op.renderToVertexBuffer) { - separableProgram->activate(); + program->activate(); } } else @@ -1537,8 +1537,8 @@ namespace Ogre { } else { - GLSLMonolithicProgram* monolithicProgram = GLSLMonolithicProgramManager::getSingleton().getActiveMonolithicProgram(); - if (!monolithicProgram) + program = GLSLMonolithicProgramManager::getSingleton().getActiveMonolithicProgram(); + if (!program) { Ogre::LogManager::getSingleton().logMessage( "ERROR: Failed to create monolithic program.", LML_CRITICAL); @@ -1557,7 +1557,7 @@ namespace Ogre { HardwareVertexBufferSharedPtr vertexBuffer = op.vertexData->vertexBufferBinding->getBuffer(source); - bindVertexElementToGpu(elem, vertexBuffer, op.vertexData->vertexStart, updateVAO); + bindVertexElementToGpu(elem, vertexBuffer, op.vertexData->vertexStart, program, updateVAO); } if ( globalInstanceVertexBuffer && globalVertexDeclaration != NULL ) @@ -1566,7 +1566,7 @@ namespace Ogre { for (elemIter = globalVertexDeclaration->getElements().begin(); elemIter != elemEnd; ++elemIter) { const VertexElement & elem = *elemIter; - bindVertexElementToGpu(elem, globalInstanceVertexBuffer, 0, updateVAO); + bindVertexElementToGpu(elem, globalInstanceVertexBuffer, 0, program, updateVAO); } } @@ -2481,7 +2481,7 @@ namespace Ogre { void GL3PlusRenderSystem::bindVertexElementToGpu( const VertexElement &elem, HardwareVertexBufferSharedPtr vertexBuffer, const size_t vertexStart, - bool updateVAO) + GLSLProgram* program, bool updateVAO) { const GL3PlusHardwareVertexBuffer* hwGlBuffer = static_cast(vertexBuffer.get()); @@ -2502,27 +2502,12 @@ namespace Ogre { GLuint attrib = 0; unsigned short elemIndex = elem.getIndex(); - if (mCurrentCapabilities->hasCapability(RSC_SEPARATE_SHADER_OBJECTS)) + if (!program->isAttributeValid(sem, elemIndex)) { - GLSLSeparableProgram* separableProgram = - GLSLSeparableProgramManager::getSingleton().getCurrentSeparableProgram(); - if (!separableProgram || !separableProgram->isAttributeValid(sem, elemIndex)) - { - return; - } - - attrib = (GLuint)separableProgram->getAttributeIndex(sem, elemIndex); + return; } - else - { - GLSLMonolithicProgram* monolithicProgram = GLSLMonolithicProgramManager::getSingleton().getActiveMonolithicProgram(); - if (!monolithicProgram || !monolithicProgram->isAttributeValid(sem, elemIndex)) - { - return; - } - attrib = (GLuint)monolithicProgram->getAttributeIndex(sem, elemIndex); - } + attrib = (GLuint)program->getAttributeIndex(sem, elemIndex); if (mCurrentVertexShader) { From 87aff137b3e9b4a93964350922fa4395a4b30295 Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 00:58:28 +0200 Subject: [PATCH 5/9] GLES2: use same VAO path like GL3Plus, thus also disable them --- .../GLES2/src/OgreGLES2RenderSystem.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/RenderSystems/GLES2/src/OgreGLES2RenderSystem.cpp b/RenderSystems/GLES2/src/OgreGLES2RenderSystem.cpp index a6ecf7e866c..410e2a684d9 100644 --- a/RenderSystems/GLES2/src/OgreGLES2RenderSystem.cpp +++ b/RenderSystems/GLES2/src/OgreGLES2RenderSystem.cpp @@ -1463,12 +1463,12 @@ namespace Ogre { GLES2VertexDeclaration* gles2decl = static_cast(op.vertexData->vertexDeclaration); - // Use a little shorthand - bool useVAO = (gles2decl && gles2decl->isInitialised()); - - if(useVAO) + if(getCapabilities()->hasCapability(RSC_VAO)) setVertexDeclaration(op.vertexData->vertexDeclaration, op.vertexData->vertexBufferBinding); + // FIXME: this fixes some rendering issues but leaves VAO's useless + bool updateVAO = true; // !gles2decl->isInitialised() && getCapabilities()->hasCapability(RSC_VAO); + for (elemIter = decl.begin(); elemIter != elemEnd; ++elemIter) { const VertexElement & elem = *elemIter; @@ -1480,7 +1480,7 @@ namespace Ogre { HardwareVertexBufferSharedPtr vertexBuffer = op.vertexData->vertexBufferBinding->getBuffer(elemSource); bindVertexElementToGpu(elem, vertexBuffer, op.vertexData->vertexStart, - mRenderAttribsBound, mRenderInstanceAttribsBound, true); + mRenderAttribsBound, mRenderInstanceAttribsBound, updateVAO); } if(getCapabilities()->hasCapability(RSC_VERTEX_BUFFER_INSTANCE_DATA)) @@ -1492,8 +1492,7 @@ namespace Ogre { { const VertexElement & elem = *elemIter; bindVertexElementToGpu(elem, globalInstanceVertexBuffer, 0, - mRenderAttribsBound, mRenderInstanceAttribsBound, true); - continue; + mRenderAttribsBound, mRenderInstanceAttribsBound, updateVAO); } } } @@ -1527,7 +1526,7 @@ namespace Ogre { if (op.useIndexes) { // If we are using VAO's then only bind the buffer the first time through. Otherwise, always bind. - if (!useVAO || (useVAO && gles2decl && !gles2decl->isInitialised())) + if (updateVAO) mStateCacheManager->bindGLBuffer(GL_ELEMENT_ARRAY_BUFFER, static_cast(op.indexData->indexBuffer.get())->getGLBufferId()); @@ -1580,7 +1579,7 @@ namespace Ogre { } while (updatePassIterationRenderState()); } - if (useVAO && gles2decl && !gles2decl->isInitialised()) + if (updateVAO) { gles2decl->setInitialised(true); } From ef961172ccffa8d88773b27d2a3fa7f1a6b41a8e Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 02:04:23 +0200 Subject: [PATCH 6/9] OgreGpuProgram: make numerical values of GpuProgramType explicit --- OgreMain/include/OgreGpuProgram.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OgreMain/include/OgreGpuProgram.h b/OgreMain/include/OgreGpuProgram.h index 0223f876a21..986ae95c507 100644 --- a/OgreMain/include/OgreGpuProgram.h +++ b/OgreMain/include/OgreGpuProgram.h @@ -47,7 +47,7 @@ namespace Ogre { /** Enumerates the types of programs which can run on the GPU. */ enum GpuProgramType { - GPT_VERTEX_PROGRAM, + GPT_VERTEX_PROGRAM = 0, GPT_FRAGMENT_PROGRAM, GPT_GEOMETRY_PROGRAM, GPT_DOMAIN_PROGRAM, From 5652f71201c69432fc43ddff8cef9291951b5464 Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 02:06:07 +0200 Subject: [PATCH 7/9] GL3Plus: GLSLProgramManager - streamline findUniformDataSource API --- .../include/GLSL/OgreGLSLProgramManager.h | 21 +- .../src/GLSL/OgreGLSLMonolithicProgram.cpp | 55 ++---- .../src/GLSL/OgreGLSLProgramManager.cpp | 180 +++--------------- .../src/GLSL/OgreGLSLSeparableProgram.cpp | 77 +++----- 4 files changed, 70 insertions(+), 263 deletions(-) diff --git a/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgramManager.h b/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgramManager.h index d3f86b71269..32e3b425ba1 100644 --- a/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgramManager.h +++ b/RenderSystems/GL3Plus/include/GLSL/OgreGLSLProgramManager.h @@ -58,24 +58,14 @@ namespace Ogre { with its data source. */ static bool findUniformDataSource( const String& paramName, - const GpuConstantDefinitionMap* vertexConstantDefs, - const GpuConstantDefinitionMap* hullConstantDefs, - const GpuConstantDefinitionMap* domainConstantDefs, - const GpuConstantDefinitionMap* geometryConstantDefs, - const GpuConstantDefinitionMap* fragmentConstantDefs, - const GpuConstantDefinitionMap* computeConstantDefs, + const GpuConstantDefinitionMap* (&constantDefs)[6], GLUniformReference& refToUpdate); /** Find the data source definition for a given atomic counter uniform name and reference. Return true if found and pair the reference with its data source. */ static bool findAtomicCounterDataSource( const String& paramName, - const GpuConstantDefinitionMap* vertexConstantDefs, - const GpuConstantDefinitionMap* hullConstantDefs, - const GpuConstantDefinitionMap* domainConstantDefs, - const GpuConstantDefinitionMap* geometryConstantDefs, - const GpuConstantDefinitionMap* fragmentConstantDefs, - const GpuConstantDefinitionMap* computeConstantDefs, + const GpuConstantDefinitionMap* (&constantDefs)[6], GLAtomicCounterReference& refToUpdate); public: @@ -85,12 +75,7 @@ namespace Ogre { */ void extractUniformsFromProgram( GLuint programObject, - const GpuConstantDefinitionMap* vertexConstantDefs, - const GpuConstantDefinitionMap* hullConstantDefs, - const GpuConstantDefinitionMap* domainConstantDefs, - const GpuConstantDefinitionMap* geometryConstantDefs, - const GpuConstantDefinitionMap* fragmentConstantDefs, - const GpuConstantDefinitionMap* computeConstantDefs, + const GpuConstantDefinitionMap* (&constantDefs)[6], GLUniformReferenceList& uniformList, GLAtomicCounterReferenceList& counterList, GLUniformBufferList& uniformBufferList, diff --git a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp index 7ef50f5c451..c11219c2396 100644 --- a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp +++ b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLMonolithicProgram.cpp @@ -205,46 +205,29 @@ namespace Ogre { void GLSLMonolithicProgram::buildGLUniformReferences(void) { - if (!mUniformRefsBuilt) + if (mUniformRefsBuilt) { - const GpuConstantDefinitionMap* vertParams = 0; - const GpuConstantDefinitionMap* hullParams = 0; - const GpuConstantDefinitionMap* domainParams = 0; - const GpuConstantDefinitionMap* fragParams = 0; - const GpuConstantDefinitionMap* geomParams = 0; - const GpuConstantDefinitionMap* computeParams = 0; - if (mVertexShader) - { - vertParams = &(mVertexShader->getConstantDefinitions().map); - } - if (mHullShader) - { - hullParams = &(mHullShader->getConstantDefinitions().map); - } - if (mDomainShader) - { - domainParams = &(mDomainShader->getConstantDefinitions().map); - } - if (mGeometryShader) - { - geomParams = &(mGeometryShader->getConstantDefinitions().map); - } - if (mFragmentShader) - { - fragParams = &(mFragmentShader->getConstantDefinitions().map); - } - if (mComputeShader) - { - computeParams = &(mComputeShader->getConstantDefinitions().map); - } + return; + } - // Do we know how many shared params there are yet? Or if there are any blocks defined? - GLSLMonolithicProgramManager::getSingleton().extractUniformsFromProgram( - mGLProgramHandle, vertParams, geomParams, fragParams, hullParams, domainParams, computeParams, - mGLUniformReferences, mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); + // order must match GpuProgramType + GLSLShader* shaders[6] = {getVertexShader(), mFragmentShader, mGeometryShader, mDomainShader, mHullShader, mComputeShader}; + const GpuConstantDefinitionMap* params[6] = { NULL }; - mUniformRefsBuilt = true; + for (int i = 0; i < 6; i++) + { + if (!shaders[i]) + continue; + + params[i] = &(shaders[i]->getConstantDefinitions().map); } + + // Do we know how many shared params there are yet? Or if there are any blocks defined? + GLSLMonolithicProgramManager::getSingleton().extractUniformsFromProgram( + mGLProgramHandle, params, mGLUniformReferences, mGLAtomicCounterReferences, + mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); + + mUniformRefsBuilt = true; } diff --git a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgramManager.cpp b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgramManager.cpp index 6f0d60ae5c6..282ebd016ba 100644 --- a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgramManager.cpp +++ b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLProgramManager.cpp @@ -367,78 +367,20 @@ namespace Ogre { bool GLSLProgramManager::findUniformDataSource( const String& paramName, - const GpuConstantDefinitionMap* vertexConstantDefs, - const GpuConstantDefinitionMap* hullConstantDefs, - const GpuConstantDefinitionMap* domainConstantDefs, - const GpuConstantDefinitionMap* geometryConstantDefs, - const GpuConstantDefinitionMap* fragmentConstantDefs, - const GpuConstantDefinitionMap* computeConstantDefs, + const GpuConstantDefinitionMap* (&constantDefs)[6], GLUniformReference& refToUpdate) { - if (vertexConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - vertexConstantDefs->find(paramName); - if (parami != vertexConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_VERTEX_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (geometryConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - geometryConstantDefs->find(paramName); - if (parami != geometryConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_GEOMETRY_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (fragmentConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - fragmentConstantDefs->find(paramName); - if (parami != fragmentConstantDefs->end()) + for(int i = 0; i < 6; i++) { + if (constantDefs[i]) { - refToUpdate.mSourceProgType = GPT_FRAGMENT_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (hullConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - hullConstantDefs->find(paramName); - if (parami != hullConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_HULL_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (domainConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - domainConstantDefs->find(paramName); - if (parami != domainConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_DOMAIN_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (computeConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - computeConstantDefs->find(paramName); - if (parami != computeConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_COMPUTE_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; + GpuConstantDefinitionMap::const_iterator parami = + constantDefs[i]->find(paramName); + if (parami != constantDefs[i]->end()) + { + refToUpdate.mSourceProgType = static_cast(i); + refToUpdate.mConstantDef = &(parami->second); + return true; + } } } return false; @@ -449,78 +391,20 @@ namespace Ogre { // and AtomicCounterReference bool GLSLProgramManager::findAtomicCounterDataSource( const String& paramName, - const GpuConstantDefinitionMap* vertexConstantDefs, - const GpuConstantDefinitionMap* hullConstantDefs, - const GpuConstantDefinitionMap* domainConstantDefs, - const GpuConstantDefinitionMap* geometryConstantDefs, - const GpuConstantDefinitionMap* fragmentConstantDefs, - const GpuConstantDefinitionMap* computeConstantDefs, + const GpuConstantDefinitionMap* (&constantDefs)[6], GLAtomicCounterReference& refToUpdate) { - if (vertexConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - vertexConstantDefs->find(paramName); - if (parami != vertexConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_VERTEX_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (geometryConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - geometryConstantDefs->find(paramName); - if (parami != geometryConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_GEOMETRY_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (fragmentConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - fragmentConstantDefs->find(paramName); - if (parami != fragmentConstantDefs->end()) + for(int i = 0; i < 6; i++) { + if (constantDefs[i]) { - refToUpdate.mSourceProgType = GPT_FRAGMENT_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (hullConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - hullConstantDefs->find(paramName); - if (parami != hullConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_HULL_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (domainConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - domainConstantDefs->find(paramName); - if (parami != domainConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_DOMAIN_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; - } - } - if (computeConstantDefs) - { - GpuConstantDefinitionMap::const_iterator parami = - computeConstantDefs->find(paramName); - if (parami != computeConstantDefs->end()) - { - refToUpdate.mSourceProgType = GPT_COMPUTE_PROGRAM; - refToUpdate.mConstantDef = &(parami->second); - return true; + GpuConstantDefinitionMap::const_iterator parami = + constantDefs[i]->find(paramName); + if (parami != constantDefs[i]->end()) + { + refToUpdate.mSourceProgType = static_cast(i); + refToUpdate.mConstantDef = &(parami->second); + return true; + } } } return false; @@ -530,12 +414,7 @@ namespace Ogre { void GLSLProgramManager::extractUniformsFromProgram( GLuint programObject, - const GpuConstantDefinitionMap* vertexConstantDefs, - const GpuConstantDefinitionMap* hullConstantDefs, - const GpuConstantDefinitionMap* domainConstantDefs, - const GpuConstantDefinitionMap* geometryConstantDefs, - const GpuConstantDefinitionMap* fragmentConstantDefs, - const GpuConstantDefinitionMap* computeConstantDefs, + const GpuConstantDefinitionMap* (&constantDefs)[6], GLUniformReferenceList& uniformList, GLAtomicCounterReferenceList& counterList, GLUniformBufferList& uniformBufferList, @@ -593,12 +472,7 @@ namespace Ogre { } // Find out which params object this comes from - bool foundSource = findUniformDataSource( - paramName, - vertexConstantDefs, geometryConstantDefs, - fragmentConstantDefs, hullConstantDefs, - domainConstantDefs, computeConstantDefs, - newGLUniformReference); + bool foundSource = findUniformDataSource(paramName, constantDefs, newGLUniformReference); // Only add this parameter if we found the source if (foundSource) @@ -647,11 +521,7 @@ namespace Ogre { // Find out which params object this comes from bool foundSource = findAtomicCounterDataSource( - paramName, - vertexConstantDefs, geometryConstantDefs, - fragmentConstantDefs, hullConstantDefs, - domainConstantDefs, computeConstantDefs, - newGLAtomicCounterReference); + paramName, constantDefs,newGLAtomicCounterReference); // Only add this parameter if we found the source if (foundSource) diff --git a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp index d3edaea6839..27be5b61c9c 100644 --- a/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp +++ b/RenderSystems/GL3Plus/src/GLSL/OgreGLSLSeparableProgram.cpp @@ -304,69 +304,34 @@ namespace Ogre void GLSLSeparableProgram::buildGLUniformReferences(void) { - if (!mUniformRefsBuilt) + if (mUniformRefsBuilt) { - const GpuConstantDefinitionMap* vertParams = 0; - const GpuConstantDefinitionMap* hullParams = 0; - const GpuConstantDefinitionMap* domainParams = 0; - const GpuConstantDefinitionMap* geomParams = 0; - const GpuConstantDefinitionMap* fragParams = 0; - const GpuConstantDefinitionMap* computeParams = 0; - if (mVertexShader) - { - vertParams = &(mVertexShader->getConstantDefinitions().map); - GLSLSeparableProgramManager::getSingleton().extractUniformsFromProgram(getVertexShader()->getGLProgramHandle(), - vertParams, NULL, NULL, NULL, NULL, NULL, - mGLUniformReferences, mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); - } - if (mHullShader) - { - hullParams = &(mHullShader->getConstantDefinitions().map); - GLSLSeparableProgramManager::getSingleton().extractUniformsFromProgram(mHullShader->getGLProgramHandle(), - NULL, NULL, NULL, hullParams, NULL, NULL, - mGLUniformReferences, mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); - } - if (mDomainShader) - { - domainParams = &(mDomainShader->getConstantDefinitions().map); - GLSLSeparableProgramManager::getSingleton().extractUniformsFromProgram(mDomainShader->getGLProgramHandle(), - NULL, NULL, NULL, NULL, domainParams, NULL, - mGLUniformReferences, mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); - } - if (mGeometryShader) - { - geomParams = &(mGeometryShader->getConstantDefinitions().map); - GLSLSeparableProgramManager::getSingleton().extractUniformsFromProgram(mGeometryShader->getGLProgramHandle(), - NULL, geomParams, NULL, NULL, NULL, NULL, - mGLUniformReferences, mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); - } - if (mFragmentShader) - { - fragParams = &(mFragmentShader->getConstantDefinitions().map); - GLSLSeparableProgramManager::getSingleton().extractUniformsFromProgram(mFragmentShader->getGLProgramHandle(), - NULL, NULL, fragParams, NULL, NULL, NULL, - mGLUniformReferences, mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); - } - if (mComputeShader) - { - computeParams = &(mComputeShader->getConstantDefinitions().map); - GLSLSeparableProgramManager::getSingleton().extractUniformsFromProgram(mComputeShader->getGLProgramHandle(), - NULL, NULL, NULL, NULL, NULL, computeParams, - mGLUniformReferences, mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, mGLCounterBufferReferences); - } + return; + } + + // order must match GpuProgramType + GLSLShader* shaders[6] = {getVertexShader(), mFragmentShader, mGeometryShader, mDomainShader, mHullShader, mComputeShader}; - mUniformRefsBuilt = true; + for (int i = 0; i < 6; i++) + { + if (!shaders[i]) + continue; + + const GpuConstantDefinitionMap* params[6] = {NULL}; + params[i] = &(shaders[i]->getConstantDefinitions().map); + GLSLSeparableProgramManager::getSingleton().extractUniformsFromProgram( + shaders[i]->getGLProgramHandle(), params, mGLUniformReferences, + mGLAtomicCounterReferences, mGLUniformBufferReferences, mSharedParamsBufferMap, + mGLCounterBufferReferences); } + + mUniformRefsBuilt = true; } void GLSLSeparableProgram::updateUniforms(GpuProgramParametersSharedPtr params, uint16 mask, GpuProgramType fromProgType) { - // Iterate through uniform reference list and update uniform values - GLUniformReferenceIterator currentUniform = mGLUniformReferences.begin(); - GLUniformReferenceIterator endUniform = mGLUniformReferences.end(); - // determine if we need to transpose matrices when binding int transpose = GL_TRUE; if ((fromProgType == GPT_FRAGMENT_PROGRAM && mVertexShader && (!getVertexShader()->getColumnMajorMatrices())) || @@ -411,6 +376,10 @@ namespace Ogre progID = mComputeShader->getGLProgramHandle(); uniformCache = mComputeShader->getUniformCache(); } + + // Iterate through uniform reference list and update uniform values + GLUniformReferenceIterator currentUniform = mGLUniformReferences.begin(); + GLUniformReferenceIterator endUniform = mGLUniformReferences.end(); for (; currentUniform != endUniform; ++currentUniform) { // Only pull values from buffer it's supposed to be in (vertex or fragment) From 7aa50870d60ca28ee35921b01049fd404883273b Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 14:51:21 +0200 Subject: [PATCH 8/9] GLSupport: GLXWindow - correctly set mVisible --- RenderSystems/GLSupport/src/GLX/OgreGLXWindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RenderSystems/GLSupport/src/GLX/OgreGLXWindow.cpp b/RenderSystems/GLSupport/src/GLX/OgreGLXWindow.cpp index 4082fb818bf..78d0212b027 100644 --- a/RenderSystems/GLSupport/src/GLX/OgreGLXWindow.cpp +++ b/RenderSystems/GLSupport/src/GLX/OgreGLXWindow.cpp @@ -74,6 +74,7 @@ namespace Ogre mClosed = false; mActive = false; mHidden = false; + mVisible = false; mVSync = false; mVSyncInterval = 1; } @@ -460,7 +461,7 @@ namespace Ogre mTop = top; mActive = true; mClosed = false; - + mVisible = true; } //-------------------------------------------------------------------------------------------------// From f97ba30df9f927cf7bd78b166c136a9b718521ff Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 28 Jul 2017 14:52:02 +0200 Subject: [PATCH 9/9] GLSUpport: EGLWindow - initialize all members --- RenderSystems/GLSupport/src/EGL/OgreEGLWindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RenderSystems/GLSupport/src/EGL/OgreEGLWindow.cpp b/RenderSystems/GLSupport/src/EGL/OgreEGLWindow.cpp index 0afc121a5d4..7cedd61d287 100644 --- a/RenderSystems/GLSupport/src/EGL/OgreEGLWindow.cpp +++ b/RenderSystems/GLSupport/src/EGL/OgreEGLWindow.cpp @@ -53,10 +53,14 @@ namespace Ogre { { mIsTopLevel = false; mIsFullScreen = false; + mIsExternal = false; + mIsExternalGLControl = false; mClosed = false; mActive = true;//todo mIsExternalGLControl = false; mVisible = false; + mVSync = false; + mVSyncInterval = 1; } EGLWindow::~EGLWindow()