summaryrefslogtreecommitdiffstats
path: root/src/render/materialsystem
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-12-08 11:42:25 +0100
committerSean Harmer <sean.harmer@kdab.com>2016-01-13 10:55:14 +0000
commit5c89a2c7e43f930758b207acb0e89cd7477c4f60 (patch)
treefd5be7ec340fd085be1beb24fdeba987a4bbef52 /src/render/materialsystem
parent7f308fe0a9ec54d30c886203876d765e284f3826 (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.cpp54
-rw-r--r--src/render/materialsystem/shader_p.h13
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);