1/****************************************************************************
2**
3** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt3D module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QT3DRENDER_RENDER_SHADERPARAMETERPACK_P_H
41#define QT3DRENDER_RENDER_SHADERPARAMETERPACK_P_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists for the convenience
48// of other Qt classes. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include <QVariant>
55#include <QByteArray>
56#include <QVector>
57#include <QOpenGLShaderProgram>
58#include <Qt3DCore/qnodeid.h>
59#include <Qt3DRender/private/renderlogging_p.h>
60#include <Qt3DRender/private/shadervariables_p.h>
61#include <Qt3DRender/private/uniform_p.h>
62
63QT_BEGIN_NAMESPACE
64
65class QOpenGLShaderProgram;
66
67namespace Qt3DCore {
68class QFrameAllocator;
69}
70
71namespace Qt3DRender {
72namespace Render {
73
74class GraphicsContext;
75
76struct BlockToUBO {
77 int m_blockIndex;
78 Qt3DCore::QNodeId m_bufferID;
79 bool m_needsUpdate;
80 QHash<QString, QVariant> m_updatedProperties;
81};
82QT3D_DECLARE_TYPEINFO_2(Qt3DRender, Render, BlockToUBO, Q_MOVABLE_TYPE)
83
84struct BlockToSSBO {
85 int m_blockIndex;
86 int m_bindingIndex;
87 Qt3DCore::QNodeId m_bufferID;
88};
89QT3D_DECLARE_TYPEINFO_2(Qt3DRender, Render, BlockToSSBO, Q_PRIMITIVE_TYPE)
90
91
92typedef QHash<int, UniformValue> PackUniformHash;
93
94class Q_AUTOTEST_EXPORT ShaderParameterPack
95{
96public:
97 ~ShaderParameterPack();
98
99 void setUniform(const int glslNameId, const UniformValue &val);
100 void setTexture(const int glslNameId, int uniformArrayIndex, Qt3DCore::QNodeId id);
101 void setImage(const int glslNameId, int uniformArrayIndex, Qt3DCore::QNodeId id);
102
103 void setUniformBuffer(BlockToUBO blockToUBO);
104 void setShaderStorageBuffer(BlockToSSBO blockToSSBO);
105 void setSubmissionUniform(const ShaderUniform &uniform);
106
107 inline PackUniformHash &uniforms() { return m_uniforms; }
108 inline const PackUniformHash &uniforms() const { return m_uniforms; }
109 UniformValue uniform(const int glslNameId) const { return m_uniforms.value(glslNameId); }
110
111
112 struct NamedResource
113 {
114 enum Type {
115 Texture = 0,
116 Image
117 };
118
119 NamedResource() {}
120 NamedResource(const int glslNameId, Qt3DCore::QNodeId texId,
121 int uniformArrayIndex, Type type)
122 : glslNameId(glslNameId)
123 , nodeId(texId)
124 , uniformArrayIndex(uniformArrayIndex)
125 , type(type)
126 { }
127
128 int glslNameId;
129 Qt3DCore::QNodeId nodeId;
130 int uniformArrayIndex;
131 Type type;
132
133 bool operator==(const NamedResource &other) const
134 {
135 return glslNameId == other.glslNameId &&
136 nodeId == other.nodeId &&
137 uniformArrayIndex == other.uniformArrayIndex &&
138 type == other.type;
139 }
140
141 bool operator!=(const NamedResource &other) const
142 {
143 return !(*this == other);
144 }
145 };
146
147 inline QVector<NamedResource> textures() const { return m_textures; }
148 inline QVector<NamedResource> images() const { return m_images; }
149 inline QVector<BlockToUBO> uniformBuffers() const { return m_uniformBuffers; }
150 inline QVector<BlockToSSBO> shaderStorageBuffers() const { return m_shaderStorageBuffers; }
151 inline QVector<ShaderUniform> submissionUniforms() const { return m_submissionUniforms; }
152private:
153 PackUniformHash m_uniforms;
154
155 QVector<NamedResource> m_textures;
156 QVector<NamedResource> m_images;
157 QVector<BlockToUBO> m_uniformBuffers;
158 QVector<BlockToSSBO> m_shaderStorageBuffers;
159 QVector<ShaderUniform> m_submissionUniforms;
160
161 friend class RenderView;
162};
163QT3D_DECLARE_TYPEINFO_2(Qt3DRender, Render, ShaderParameterPack::NamedResource, Q_PRIMITIVE_TYPE)
164
165} // namespace Render
166} // namespace Qt3DRender
167
168QT_END_NAMESPACE
169
170Q_DECLARE_METATYPE(Qt3DRender::Render::ShaderParameterPack)
171
172#endif // QT3DRENDER_RENDER_SHADERPARAMETERPACK_P_H
173