/**************************************************************************** ** ** 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:COMM$ ** ** 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. ** ** $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 { ShaderUniformBlock block; QVector members; }; RHIShader(); bool isLoaded() const { return m_isLoaded; } void setLoaded(bool loaded) { m_isLoaded = loaded; } void prepareUniforms(ShaderParameterPack &pack); void setFragOutputs(const QHash &fragOutputs); const QHash fragOutputs() const; inline QVector uniformsNamesIds() const { return m_uniformsNamesIds; } inline QVector standardUniformNameIds() const { return m_standardUniformNamesIds; } inline QVector uniformBlockNamesIds() const { return m_uniformBlockNamesIds; } inline QVector storageBlockNamesIds() const { return m_shaderStorageBlockNamesIds; } inline QVector attributeNamesIds() const { return m_attributeNamesIds; } QVector uniformsNames() const; QVector attributesNames() const; QVector uniformBlockNames() const; QVector storageBlockNames() const; QVector samplerNames() const; QVector imagesNames() const; inline QVector uniforms() const { return m_uniforms; } inline QVector attributes() const { return m_attributes; } inline QVector uniformBlocks() const { return m_uniformBlocks; } inline QVector storageBlocks() const { return m_shaderStorageBlocks; } inline QVector samplers() const { return m_samplers; } inline QVector 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; 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 QVector shaderCode) { m_shaderCode = shaderCode; } QVector shaderCode() const; const QShader &shaderStage(QShader::Stage stage) const noexcept { return m_stages[stage]; } QVector uboMembers() const { return m_uboMembers; } const QSet &unqualifiedUniformNames() const noexcept { return m_unqualifiedUniformNames; } void introspect(); private: bool m_isLoaded; QShader m_stages[6]; QVector m_uniformsNames; QVector m_uniformsNamesIds; QVector m_standardUniformNamesIds; QVector m_uniforms; QVector m_attributesNames; QVector m_attributeNamesIds; QVector m_attributes; QVector m_uniformBlockNames; QVector m_uniformBlockNamesIds; QVector m_uniformBlocks; QHash> m_uniformBlockIndexToShaderUniforms; QSet m_unqualifiedUniformNames; QVector m_shaderStorageBlockNames; QVector m_shaderStorageBlockNamesIds; QVector m_shaderStorageBlocks; QVector m_samplerNames; QVector m_samplerIds; QVector m_samplers; QVector m_imageNames; QVector m_imageIds; QVector m_images; QVector m_structNames; QVector m_structNamesIds; QHash m_fragOutputs; QVector m_shaderCode; // Private so that only SubmissionContext can call it friend class SubmissionContext; void initializeAttributes(const QVector &attributesDescription); void initializeUniformBlocks(const QVector &uniformBlockDescription); void initializeShaderStorageBlocks(const QVector &shaderStorageBlockDescription); void initializeSamplers(const QVector &samplerDescription); void initializeImages(const QVector &imageDescription); void recordAllUniforms(const QShaderDescription::BlockVariable &ubo, QString parentName); QVector m_uboMembers; mutable QMutex m_mutex; QMetaObject::Connection m_contextConnection; }; } // Rhi } // Render } // Qt3DRender QT_END_NAMESPACE #endif // QT3DRENDER_RENDER_RHI_GLSHADER_P_H