From a21a41759f4fc115f34ce0891fedb255c4d32937 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Mon, 9 Mar 2015 14:40:47 +0100 Subject: 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 --- src/render/backend/qgraphicshelpergl3.cpp | 2 +- src/render/backend/rendershader.cpp | 19 +++++++++++++++---- src/render/backend/rendershader_p.h | 1 + src/render/backend/renderview.cpp | 5 +++-- 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 QGraphicsHelperGL3::programUniformBlocks(GLuint prog QVector 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 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 &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 &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::const_iterator uniformsIt = m_uniforms.begin(); @@ -338,7 +349,7 @@ void RenderShader::initializeUniformBlocks(const QVector &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 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; -- cgit v1.2.3