summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-03-09 14:40:47 +0100
committerPaul Lemire <paul.lemire@kdab.com>2015-03-09 16:12:01 +0000
commita21a41759f4fc115f34ce0891fedb255c4d32937 (patch)
tree240fe5694d7a03585203165ba796a22bead2ee50 /src
parent770beab2ee3c9fc41502e0b0bbc35e2cdc595ce7 (diff)
Fix for ShaderData
Wasn't using the right index to retrieve the ShaderUniformBlock. Combined with the use of resize instead of reserve this lead to an unexpected behavior. Task-number: QTBUG-44874 Change-Id: If66554cf0ea133df33a72a63b256d80a4c4ce823 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/render/backend/qgraphicshelpergl3.cpp2
-rw-r--r--src/render/backend/rendershader.cpp19
-rw-r--r--src/render/backend/rendershader_p.h1
-rw-r--r--src/render/backend/renderview.cpp5
4 files changed, 20 insertions, 7 deletions
diff --git a/src/render/backend/qgraphicshelpergl3.cpp b/src/render/backend/qgraphicshelpergl3.cpp
index 24c2d9d64..cd2a5033b 100644
--- a/src/render/backend/qgraphicshelpergl3.cpp
+++ b/src/render/backend/qgraphicshelpergl3.cpp
@@ -182,7 +182,7 @@ QVector<ShaderUniformBlock> QGraphicsHelperGL3::programUniformBlocks(GLuint prog
QVector<ShaderUniformBlock> blocks;
GLint nbrActiveUniformsBlocks = 0;
m_funcs->glGetProgramiv(programId, GL_ACTIVE_UNIFORM_BLOCKS, &nbrActiveUniformsBlocks);
- blocks.resize(nbrActiveUniformsBlocks);
+ blocks.reserve(nbrActiveUniformsBlocks);
for (GLint i = 0; i < nbrActiveUniformsBlocks; i++) {
QByteArray uniformBlockName(256, '\0');
ShaderUniformBlock uniformBlock;
diff --git a/src/render/backend/rendershader.cpp b/src/render/backend/rendershader.cpp
index 8d11443da..d4a3cbd70 100644
--- a/src/render/backend/rendershader.cpp
+++ b/src/render/backend/rendershader.cpp
@@ -180,8 +180,19 @@ QHash<QString, ShaderUniform> RenderShader::activeUniformsForBlock(int blockInde
ShaderUniformBlock RenderShader::uniformBlock(int blockIndex)
{
for (int i = 0; i < m_uniformBlocks.size(); ++i) {
- if (m_uniformBlocks[i].m_index == blockIndex)
+ if (m_uniformBlocks[i].m_index == blockIndex) {
return m_uniformBlocks[i];
+ }
+ }
+ return ShaderUniformBlock();
+}
+
+ShaderUniformBlock RenderShader::uniformBlock(const QString &blockName)
+{
+ for (int i = 0; i < m_uniformBlocks.size(); ++i) {
+ if (m_uniformBlocks[i].m_name == blockName) {
+ return m_uniformBlocks[i];
+ }
}
return ShaderUniformBlock();
}
@@ -298,7 +309,7 @@ void RenderShader::initializeUniforms(const QVector<ShaderUniform> &uniformsDesc
for (int i = 0; i < uniformsDescription.size(); 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;
+ qCDebug(Shaders) << "Active Uniform in Default Block " << uniformsDescription[i].m_name << uniformsDescription[i].m_blockIndex;
activeUniformsInDefaultBlock.insert(uniformsDescription[i].m_name, uniformsDescription[i]);
}
}
@@ -321,7 +332,7 @@ void RenderShader::initializeUniformBlocks(const QVector<ShaderUniformBlock> &un
m_uniformBlockNames.resize(uniformBlockDescription.size());
for (int i = 0; i < uniformBlockDescription.size(); ++i) {
m_uniformBlockNames[i] = uniformBlockDescription[i].m_name;
- qCDebug(Shaders) << "Initializing Uniform Block " << m_uniformBlockNames[i];
+ qCDebug(Shaders) << "Initializing Uniform Block {" << m_uniformBlockNames[i] << "}";
// Find all active uniforms for the shader block
QVector<ShaderUniform>::const_iterator uniformsIt = m_uniforms.begin();
@@ -338,7 +349,7 @@ void RenderShader::initializeUniformBlocks(const QVector<ShaderUniformBlock> &un
if (!m_uniformBlockNames[i].isEmpty() && !uniformName.startsWith(m_uniformBlockNames[i]))
uniformName = m_uniformBlockNames[i] + QStringLiteral(".") + *uniformNamesIt;
activeUniformsInBlock.insert(uniformName, *uniformsIt);
- qCDebug(Shaders) << "Active Uniform Block " << uniformName << " in block " << m_uniformBlockNames[i];
+ qCDebug(Shaders) << "Active Uniform Block " << uniformName << " in block " << m_uniformBlockNames[i] << " at index " << uniformsIt->m_blockIndex;
}
++uniformsIt;
++uniformNamesIt;
diff --git a/src/render/backend/rendershader_p.h b/src/render/backend/rendershader_p.h
index d0a4d1e0e..23d5a8672 100644
--- a/src/render/backend/rendershader_p.h
+++ b/src/render/backend/rendershader_p.h
@@ -84,6 +84,7 @@ public:
QHash<QString, ShaderUniform> activeUniformsForBlock(int blockIndex) const;
ShaderUniformBlock uniformBlock(int blockIndex);
+ ShaderUniformBlock uniformBlock(const QString &blockName);
private:
QOpenGLShaderProgram *m_program;
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 36664515c..6ed9761b8 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -616,8 +616,9 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, RenderRenderPass *
if (uniformNames.contains(it->name)) { // Parameter is a regular uniform
setUniformValue(command->m_uniforms, it->name, it->value);
it = parameters.erase(it);
- } else if (int idx = uniformBlockNames.indexOf(it->name) != -1) { // Parameter is a uniform block
- setUniformBlockValue(command->m_uniforms, shader, shader->uniformBlocks().at(idx), it->value);
+ } else if (uniformBlockNames.indexOf(it->name) != -1) { // Parameter is a uniform block
+ const ShaderUniformBlock &block = shader->uniformBlock(it->name);
+ setUniformBlockValue(command->m_uniforms, shader, block, it->value);
it = parameters.erase(it);
} else {
const QVariant &v = it->value;