diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-12-08 11:42:25 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-01-13 10:55:14 +0000 |
commit | 5c89a2c7e43f930758b207acb0e89cd7477c4f60 (patch) | |
tree | fd5be7ec340fd085be1beb24fdeba987a4bbef52 /src/render/materialsystem | |
parent | 7f308fe0a9ec54d30c886203876d765e284f3826 (diff) |
Shaders: retrieve SSBO block
Change-Id: I62065d30b197367c8e5e03099c3af034892c4038
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/materialsystem')
-rw-r--r-- | src/render/materialsystem/shader.cpp | 54 | ||||
-rw-r--r-- | src/render/materialsystem/shader_p.h | 13 |
2 files changed, 55 insertions, 12 deletions
diff --git a/src/render/materialsystem/shader.cpp b/src/render/materialsystem/shader.cpp index f2e7bce78..47bb0f05d 100644 --- a/src/render/materialsystem/shader.cpp +++ b/src/render/materialsystem/shader.cpp @@ -117,6 +117,11 @@ QVector<QString> Shader::uniformBlockNames() const return m_uniformBlockNames; } +QVector<QString> Shader::storageBlockNames() const +{ + return m_shaderStorageBlockNames; +} + QVector<QByteArray> Shader::shaderCode() const { return m_shaderCode; @@ -177,14 +182,14 @@ QVector<ShaderUniformBlock> Shader::uniformBlocks() const return m_uniformBlocks; } -QHash<QString, ShaderUniform> Shader::activeUniformsForBlock(int blockIndex) const +QHash<QString, ShaderUniform> Shader::activeUniformsForUniformBlock(int blockIndex) const { - return m_blockIndexToShaderUniforms.value(blockIndex); + return m_uniformBlockIndexToShaderUniforms.value(blockIndex); } ShaderUniformBlock Shader::uniformBlock(int blockIndex) { - for (int i = 0; i < m_uniformBlocks.size(); ++i) { + for (int i = 0, m = m_uniformBlocks.size(); i < m; ++i) { if (m_uniformBlocks[i].m_index == blockIndex) { return m_uniformBlocks[i]; } @@ -194,7 +199,7 @@ ShaderUniformBlock Shader::uniformBlock(int blockIndex) ShaderUniformBlock Shader::uniformBlock(const QString &blockName) { - for (int i = 0; i < m_uniformBlocks.size(); ++i) { + for (int i = 0, m = m_uniformBlocks.size(); i < m; ++i) { if (m_uniformBlocks[i].m_name == blockName) { return m_uniformBlocks[i]; } @@ -202,6 +207,24 @@ ShaderUniformBlock Shader::uniformBlock(const QString &blockName) return ShaderUniformBlock(); } +ShaderStorageBlock Shader::storageBlock(int blockIndex) +{ + for (int i = 0, m = m_shaderStorageBlockNames.size(); i < m; ++i) { + if (m_shaderStorageBlocks[i].m_index == blockIndex) + return m_shaderStorageBlocks[i]; + } + return ShaderStorageBlock(); +} + +ShaderStorageBlock Shader::storageBlock(const QString &blockName) +{ + for (int i = 0, m = m_shaderStorageBlockNames.size(); i < m; ++i) { + if (m_shaderStorageBlocks[i].m_name == blockName) + return m_shaderStorageBlocks[i]; + } + return ShaderStorageBlock(); +} + /*! * Must be called with a valid, current QOpenGLContext */ @@ -325,21 +348,21 @@ void Shader::initializeUniforms(const QVector<ShaderUniform> &uniformsDescriptio m_uniformsNames.resize(uniformsDescription.size()); QHash<QString, ShaderUniform> activeUniformsInDefaultBlock; - for (int i = 0; i < uniformsDescription.size(); i++) { + for (int i = 0, m = uniformsDescription.size(); i < m; i++) { m_uniformsNames[i] = uniformsDescription[i].m_name; if (uniformsDescription[i].m_blockIndex == -1) { // Uniform is in default block qCDebug(Shaders) << "Active Uniform in Default Block " << uniformsDescription[i].m_name << uniformsDescription[i].m_blockIndex; activeUniformsInDefaultBlock.insert(uniformsDescription[i].m_name, uniformsDescription[i]); } } - m_blockIndexToShaderUniforms.insert(-1, activeUniformsInDefaultBlock); + m_uniformBlockIndexToShaderUniforms.insert(-1, activeUniformsInDefaultBlock); } void Shader::initializeAttributes(const QVector<ShaderAttribute> &attributesDescription) { m_attributes = attributesDescription; m_attributesNames.resize(attributesDescription.size()); - for (int i = 0; i < attributesDescription.size(); i++) { + for (int i = 0, m = attributesDescription.size(); i < m; i++) { m_attributesNames[i] = attributesDescription[i].m_name; qCDebug(Shaders) << "Active Attribute " << attributesDescription[i].m_name; } @@ -349,7 +372,7 @@ void Shader::initializeUniformBlocks(const QVector<ShaderUniformBlock> &uniformB { m_uniformBlocks = uniformBlockDescription; m_uniformBlockNames.resize(uniformBlockDescription.size()); - for (int i = 0; i < uniformBlockDescription.size(); ++i) { + for (int i = 0, m = uniformBlockDescription.size(); i < m; ++i) { m_uniformBlockNames[i] = uniformBlockDescription[i].m_name; qCDebug(Shaders) << "Initializing Uniform Block {" << m_uniformBlockNames[i] << "}"; @@ -373,7 +396,18 @@ void Shader::initializeUniformBlocks(const QVector<ShaderUniformBlock> &uniformB ++uniformsIt; ++uniformNamesIt; } - m_blockIndexToShaderUniforms.insert(uniformBlockDescription[i].m_index, activeUniformsInBlock); + m_uniformBlockIndexToShaderUniforms.insert(uniformBlockDescription[i].m_index, activeUniformsInBlock); + } +} + +void Shader::initializeShaderStorageBlocks(const QVector<ShaderStorageBlock> &shaderStorageBlockDescription) +{ + m_shaderStorageBlocks = shaderStorageBlockDescription; + m_shaderStorageBlockNames.resize(shaderStorageBlockDescription.size()); + + for (int i = 0, m = shaderStorageBlockDescription.size(); i < m; ++i) { + m_shaderStorageBlockNames[i] = shaderStorageBlockDescription[i].m_name; + qCDebug(Shaders) << "Initializing Shader Storage Block {" << m_shaderStorageBlockNames[i] << "}"; } } @@ -392,7 +426,7 @@ void Shader::initialize(const Shader &other) m_attributes = other.m_attributes; m_uniformBlockNames = other.m_uniformBlockNames; m_uniformBlocks = other.m_uniformBlocks; - m_blockIndexToShaderUniforms = other.m_blockIndexToShaderUniforms; + m_uniformBlockIndexToShaderUniforms = other.m_uniformBlockIndexToShaderUniforms; m_fragOutputs = other.m_fragOutputs; m_isLoaded = other.m_isLoaded; } diff --git a/src/render/materialsystem/shader_p.h b/src/render/materialsystem/shader_p.h index cc38f8c4a..d4839dba4 100644 --- a/src/render/materialsystem/shader_p.h +++ b/src/render/materialsystem/shader_p.h @@ -84,6 +84,7 @@ public: QVector<QString> uniformsNames() const; QVector<QString> attributesNames() const; QVector<QString> uniformBlockNames() const; + QVector<QString> storageBlockNames() const; QVector<QByteArray> shaderCode() const; void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE; @@ -93,11 +94,15 @@ public: QVector<ShaderUniform> uniforms() const; QVector<ShaderAttribute> attributes() const; QVector<ShaderUniformBlock> uniformBlocks() const; + QVector<ShaderStorageBlock> storageBlocks() const; - QHash<QString, ShaderUniform> activeUniformsForBlock(int blockIndex) const; + QHash<QString, ShaderUniform> activeUniformsForUniformBlock(int blockIndex) const; ShaderUniformBlock uniformBlock(int blockIndex); ShaderUniformBlock uniformBlock(const QString &blockName); + ShaderStorageBlock storageBlock(int blockIndex); + ShaderStorageBlock storageBlock(const QString &blockName); + private: QOpenGLShaderProgram *m_program; @@ -112,7 +117,10 @@ private: QVector<QString> m_uniformBlockNames; QVector<ShaderUniformBlock> m_uniformBlocks; - QHash<int, QHash<QString, ShaderUniform> > m_blockIndexToShaderUniforms; + QHash<int, QHash<QString, ShaderUniform> > m_uniformBlockIndexToShaderUniforms; + + QVector<QString> m_shaderStorageBlockNames; + QVector<ShaderStorageBlock> m_shaderStorageBlocks; QHash<QString, int> m_fragOutputs; @@ -128,6 +136,7 @@ private: void initializeUniforms(const QVector<ShaderUniform> &uniformsDescription); void initializeAttributes(const QVector<ShaderAttribute> &attributesDescription); void initializeUniformBlocks(const QVector<ShaderUniformBlock> &uniformBlockDescription); + void initializeShaderStorageBlocks(const QVector<ShaderStorageBlock> &shaderStorageBlockDescription); void initialize(const Shader &other); |