/**************************************************************************** ** ** Copyright (C) 2020 Klaralvdalens Datakonsult AB (KDAB). ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt3D module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QT3DRENDER_RENDER_RHI_GLSHADER_P_H #define QT3DRENDER_RENDER_RHI_GLSHADER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { namespace Rhi { class Q_AUTOTEST_EXPORT RHIShader { public: struct UBO_Member { int nameId; QShaderDescription::BlockVariable blockVariable; std::vector structMembers; }; struct UBO_Block { ShaderUniformBlock block; std::vector members; }; RHIShader(); bool isLoaded() const { return m_isLoaded; } void setLoaded(bool loaded) { m_isLoaded = loaded; } void setFragOutputs(const QHash &fragOutputs); const QHash fragOutputs() const; inline const std::vector &uniformsNamesIds() const { return m_uniformsNamesIds; } inline const std::vector &standardUniformNameIds() const { return m_standardUniformNamesIds; } inline const std::vector &uniformBlockNamesIds() const { return m_uniformBlockNamesIds; } inline const std::vector &storageBlockNamesIds() const { return m_shaderStorageBlockNamesIds; } inline const std::vector &attributeNamesIds() const { return m_attributeNamesIds; } const std::vector &uniformsNames() const; const std::vector &attributesNames() const; const std::vector &uniformBlockNames() const; const std::vector &storageBlockNames() const; const std::vector &samplerNames() const; const std::vector &imagesNames() const; inline const std::vector &uniforms() const { return m_uniforms; } inline const std::vector &attributes() const { return m_attributes; } inline const std::vector &uniformBlocks() const { return m_uniformBlocks; } inline const std::vector &storageBlocks() const { return m_shaderStorageBlocks; } inline const std::vector &samplers() const { return m_samplers; } inline const std::vector &images() const { return m_images; } QHash activeUniformsForUniformBlock(int blockIndex) const; ShaderUniformBlock uniformBlockForBlockIndex(int blockNameId) const noexcept; ShaderUniformBlock uniformBlockForBlockNameId(int blockIndex) const noexcept; ShaderUniformBlock uniformBlockForBlockName(const QString &blockName) const noexcept; ShaderUniformBlock uniformBlockForInstanceName(const QString &instanceName) const noexcept; ShaderUniformBlock uniformBlockForInstanceNameId(int instanceNameId) const noexcept; ShaderStorageBlock storageBlockForBlockIndex(int blockIndex) const noexcept; ShaderStorageBlock storageBlockForBlockNameId(int blockNameId) const noexcept; ShaderStorageBlock storageBlockForBlockName(const QString &blockName) const noexcept; enum ParameterKind { Uniform, UBO, SSBO, Struct }; ParameterKind categorizeVariable(int nameId) const noexcept; bool hasUniform(int nameId) const noexcept; bool hasActiveVariables() const noexcept; void setShaderCode(const std::vector &shaderCode); const std::vector &shaderCode() const; const QShader &shaderStage(QShader::Stage stage) const noexcept { return m_stages[stage]; } const std::vector &uboBlocks() const { return m_uboBlocks; } const QSet &unqualifiedUniformNames() const noexcept { return m_unqualifiedUniformNames; } void introspect(); private: bool m_isLoaded; QShader m_stages[6]; std::vector m_uniformsNames; std::vector m_uniformsNamesIds; std::vector m_standardUniformNamesIds; std::vector m_uniforms; std::vector m_attributesNames; std::vector m_attributeNamesIds; std::vector m_attributes; std::vector m_uniformBlockNames; std::vector m_uniformBlockNamesIds; std::vector m_uniformBlocks; QHash> m_uniformBlockIndexToShaderUniforms; QSet m_unqualifiedUniformNames; std::vector m_shaderStorageBlockNames; std::vector m_shaderStorageBlockNamesIds; std::vector m_shaderStorageBlocks; std::vector m_samplerNames; std::vector m_samplerIds; std::vector m_samplers; std::vector m_imageNames; std::vector m_imageIds; std::vector m_images; std::vector m_structNames; std::vector m_structNamesIds; QHash m_fragOutputs; std::vector m_shaderCode; // Private so that only SubmissionContext can call it friend class SubmissionContext; void initializeAttributes(const std::vector &attributesDescription); void initializeUniformBlocks(const std::vector &uniformBlockDescription); void initializeShaderStorageBlocks(const std::vector &shaderStorageBlockDescription); void initializeSamplers(const std::vector &samplerDescription); void initializeImages(const std::vector &imageDescription); void recordAllUniforms(UBO_Member &uboMember, QString parentName); std::vector m_uboBlocks; mutable QMutex m_mutex; QMetaObject::Connection m_contextConnection; }; } // Rhi } // Render } // Qt3DRender QT_END_NAMESPACE #endif // QT3DRENDER_RENDER_RHI_GLSHADER_P_H