// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "shaderparameterpack_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { namespace OpenGL { ShaderParameterPack::~ShaderParameterPack() { } void ShaderParameterPack::reserve(int uniformCount) { m_uniforms.reserve(uniformCount); m_submissionUniformIndices.reserve(uniformCount); } void ShaderParameterPack::setUniform(const int glslNameId, const UniformValue &val) { m_uniforms.insert(glslNameId, val); } void ShaderParameterPack::setTexture(const int glslNameId, int uniformArrayIndex, Qt3DCore::QNodeId texId) { for (size_t t = 0; t < m_textures.size(); ++t) { if (m_textures[t].glslNameId != glslNameId || m_textures[t].uniformArrayIndex != uniformArrayIndex) continue; m_textures[t].nodeId = texId; return; } m_textures.push_back(NamedResource(glslNameId, texId, uniformArrayIndex, NamedResource::Texture)); } void ShaderParameterPack::setImage(const int glslNameId, int uniformArrayIndex, Qt3DCore::QNodeId id) { for (qsizetype i=0, m = m_images.size(); i < m; ++i) { if (m_images[i].glslNameId != glslNameId || m_images[i].uniformArrayIndex != uniformArrayIndex) continue; m_images[i].nodeId = id; return; } m_images.push_back(NamedResource(glslNameId, id, uniformArrayIndex, NamedResource::Image)); } // Contains Uniform Block Index and QNodeId of the ShaderData (UBO) void ShaderParameterPack::setUniformBuffer(BlockToUBO blockToUBO) { const auto uEnd = m_uniformBuffers.end(); auto it = std::find_if(m_uniformBuffers.begin(), uEnd, [&] (const BlockToUBO &block) { return blockToUBO.m_blockIndex == block.m_blockIndex; }); if (it == uEnd) m_uniformBuffers.push_back(std::move(blockToUBO)); else *it = std::move(blockToUBO); } void ShaderParameterPack::setShaderStorageBuffer(BlockToSSBO blockToSSBO) { const auto uEnd = m_shaderStorageBuffers.end(); auto it = std::find_if(m_shaderStorageBuffers.begin(), uEnd, [&] (const BlockToSSBO &block) { return blockToSSBO.m_blockIndex == block.m_blockIndex; }); if (it == uEnd) m_shaderStorageBuffers.push_back(std::move(blockToSSBO)); else *it = std::move(blockToSSBO); } void ShaderParameterPack::setSubmissionUniformIndex(const int uniformIdx) { m_submissionUniformIndices.push_back(uniformIdx); } } // namespace OpenGL } // namespace Render } // namespace Qt3DRender QT_END_NAMESPACE