Pyrogenesis HEAD
Pyrogenesis, a RTS Engine
ShaderProgram.h
Go to the documentation of this file.
1/* Copyright (C) 2024 Wildfire Games.
2 * This file is part of 0 A.D.
3 *
4 * 0 A.D. is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * 0 A.D. is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef INCLUDED_RENDERER_BACKEND_VULKAN_SHADERPROGRAM
19#define INCLUDED_RENDERER_BACKEND_VULKAN_SHADERPROGRAM
20
25
26#include <array>
27#include <cstddef>
28#include <glad/vulkan.h>
29#include <memory>
30#include <optional>
31#include <unordered_map>
32#include <vector>
33
34class CShaderDefines;
35class CStr;
36
37namespace Renderer
38{
39
40namespace Backend
41{
42
43namespace Vulkan
44{
45
46class CDevice;
47class CRingCommandContext;
48
50{
51public:
53 : m_Device(device), m_Attributes(attributes.begin(), attributes.end())
54 {
55 static uint32_t m_LastAvailableUID = 1;
56 m_UID = m_LastAvailableUID++;
57 for (const SVertexAttributeFormat& attribute : m_Attributes)
58 {
59 ENSURE(attribute.format != Format::UNDEFINED);
60 ENSURE(attribute.stride > 0);
61 }
62 }
63
64 ~CVertexInputLayout() override = default;
65
66 IDevice* GetDevice() override;
67
68 const std::vector<SVertexAttributeFormat>& GetAttributes() const noexcept { return m_Attributes; }
69
70 using UID = uint32_t;
71 UID GetUID() const { return m_UID; }
72
73private:
74 CDevice* m_Device = nullptr;
75
77
78 std::vector<SVertexAttributeFormat> m_Attributes;
79};
80
81class CShaderProgram final : public IShaderProgram
82{
83public:
84 ~CShaderProgram() override;
85
86 IDevice* GetDevice() override;
87
88 int32_t GetBindingSlot(const CStrIntern name) const override;
89
90 std::vector<VfsPath> GetFileDependencies() const override;
91
93
94 const std::vector<VkPipelineShaderStageCreateInfo>& GetStages() const { return m_Stages; }
95
96 void Bind();
97 void Unbind();
98
99 void PreDraw(CRingCommandContext& commandContext);
100 void PreDispatch(CRingCommandContext& commandContext);
101 void PostDispatch(CRingCommandContext& commandContext);
102
103 VkPipelineLayout GetPipelineLayout() const { return m_PipelineLayout; }
104 VkPipelineBindPoint GetPipelineBindPoint() const { return m_PipelineBindPoint; }
105
106 void SetUniform(
107 const int32_t bindingSlot,
108 const float value);
109 void SetUniform(
110 const int32_t bindingSlot,
111 const float valueX, const float valueY);
112 void SetUniform(
113 const int32_t bindingSlot,
114 const float valueX, const float valueY,
115 const float valueZ);
116 void SetUniform(
117 const int32_t bindingSlot,
118 const float valueX, const float valueY,
119 const float valueZ, const float valueW);
120 void SetUniform(
121 const int32_t bindingSlot, PS::span<const float> values);
122
123 void SetTexture(const int32_t bindingSlot, CTexture* texture);
124 void SetStorageTexture(const int32_t bindingSlot, CTexture* texture);
125
126 // TODO: rename to something related to buffer.
129 std::byte* GetMaterialConstantsData() const { return m_MaterialConstantsData.get(); }
131
132private:
133 friend class CDevice;
134
136
137 std::pair<std::byte*, uint32_t> GetUniformData(
138 const int32_t bindingSlot, const uint32_t dataSize);
139
140 static std::unique_ptr<CShaderProgram> Create(
141 CDevice* device, const CStr& name, const CShaderDefines& defines);
142
144 CRingCommandContext& commandContext);
145
146 CDevice* m_Device = nullptr;
147
148 std::vector<VkShaderModule> m_ShaderModules;
149 std::vector<VkPipelineShaderStageCreateInfo> m_Stages;
150 VkPipelineLayout m_PipelineLayout = VK_NULL_HANDLE;
151 VkPipelineBindPoint m_PipelineBindPoint = VK_PIPELINE_BIND_POINT_MAX_ENUM;
152
153 std::vector<VfsPath> m_FileDependencies;
154
156 {
160 VkShaderStageFlags stageFlags;
161 };
162 struct Uniform
163 {
167 };
168 std::unique_ptr<std::byte[]> m_MaterialConstantsData;
171 std::array<std::byte, 128> m_PushConstantData;
173 std::array<VkShaderStageFlags, 32> m_PushConstantDataFlags;
174 std::vector<PushConstant> m_PushConstants;
175 std::vector<Uniform> m_Uniforms;
176 std::unordered_map<CStrIntern, uint32_t> m_UniformMapping;
177 std::unordered_map<CStrIntern, uint32_t> m_PushConstantMapping;
178
179 std::optional<CSingleTypeDescriptorSetBinding<CTexture>> m_TextureBinding;
180 std::optional<CSingleTypeDescriptorSetBinding<CTexture>> m_StorageImageBinding;
181
182 std::unordered_map<VertexAttributeStream, uint32_t> m_StreamLocations;
183};
184
185} // namespace Vulkan
186
187} // namespace Backend
188
189} // namespace Renderer
190
191#endif // INCLUDED_RENDERER_BACKEND_VULKAN_SHADERPROGRAM
Represents a mapping of name strings to value strings, for use with #if and #ifdef and similar condit...
Definition: ShaderDefines.h:147
Interned 8-bit strings.
Definition: CStrIntern.h:38
Simplifed version of std::span (C++20) as we don't support the original one yet.
Definition: Span.h:37
Definition: IDevice.h:48
IShaderProgram is a container for multiple shaders of different types.
Definition: IShaderProgram.h:81
IVertexInputLayout stores precompiled list of vertex attributes.
Definition: IShaderProgram.h:74
Definition: Device.h:60
A simple helper class to decouple command buffers rotation from frames presenting.
Definition: RingCommandContext.h:48
Definition: ShaderProgram.h:82
std::array< std::byte, 128 > m_PushConstantData
Definition: ShaderProgram.h:171
std::unordered_map< CStrIntern, uint32_t > m_UniformMapping
Definition: ShaderProgram.h:176
CDevice * m_Device
Definition: ShaderProgram.h:146
IDevice * GetDevice() override
Definition: ShaderProgram.cpp:597
uint32_t GetMaterialConstantsDataSize() const
Definition: ShaderProgram.h:130
VkPipelineLayout m_PipelineLayout
Definition: ShaderProgram.h:150
void PreDispatch(CRingCommandContext &commandContext)
Definition: ShaderProgram.cpp:665
std::unordered_map< CStrIntern, uint32_t > m_PushConstantMapping
Definition: ShaderProgram.h:177
std::vector< Uniform > m_Uniforms
Definition: ShaderProgram.h:175
std::array< VkShaderStageFlags, 32 > m_PushConstantDataFlags
Definition: ShaderProgram.h:173
void SetUniform(const int32_t bindingSlot, const float value)
Definition: ShaderProgram.cpp:731
~CShaderProgram() override
Definition: ShaderProgram.cpp:588
std::pair< std::byte *, uint32_t > GetUniformData(const int32_t bindingSlot, const uint32_t dataSize)
Definition: ShaderProgram.cpp:773
std::vector< VfsPath > m_FileDependencies
Definition: ShaderProgram.h:153
uint32_t GetStreamLocation(const VertexAttributeStream stream) const
Definition: ShaderProgram.cpp:620
std::optional< CSingleTypeDescriptorSetBinding< CTexture > > m_StorageImageBinding
Definition: ShaderProgram.h:180
std::byte * GetMaterialConstantsData() const
Definition: ShaderProgram.h:129
void SetStorageTexture(const int32_t bindingSlot, CTexture *texture)
Definition: ShaderProgram.cpp:821
std::unordered_map< VertexAttributeStream, uint32_t > m_StreamLocations
Definition: ShaderProgram.h:182
void Bind()
Definition: ShaderProgram.cpp:626
uint32_t m_PushConstantDataMask
Definition: ShaderProgram.h:172
void SetTexture(const int32_t bindingSlot, CTexture *texture)
Definition: ShaderProgram.cpp:796
bool IsMaterialConstantsDataOutdated() const
Definition: ShaderProgram.h:127
void PreDraw(CRingCommandContext &commandContext)
Definition: ShaderProgram.cpp:640
bool m_MaterialConstantsDataOutdated
Definition: ShaderProgram.h:170
std::vector< VfsPath > GetFileDependencies() const override
Definition: ShaderProgram.cpp:615
const std::vector< VkPipelineShaderStageCreateInfo > & GetStages() const
Definition: ShaderProgram.h:94
int32_t GetBindingSlot(const CStrIntern name) const override
Definition: ShaderProgram.cpp:602
uint32_t m_MaterialConstantsDataSize
Definition: ShaderProgram.h:169
void Unbind()
Definition: ShaderProgram.cpp:632
std::vector< VkPipelineShaderStageCreateInfo > m_Stages
Definition: ShaderProgram.h:149
void BindOutdatedDescriptorSets(CRingCommandContext &commandContext)
Definition: ShaderProgram.cpp:707
std::vector< VkShaderModule > m_ShaderModules
Definition: ShaderProgram.h:148
static std::unique_ptr< CShaderProgram > Create(CDevice *device, const CStr &name, const CShaderDefines &defines)
Definition: ShaderProgram.cpp:143
VkPipelineBindPoint m_PipelineBindPoint
Definition: ShaderProgram.h:151
VkPipelineBindPoint GetPipelineBindPoint() const
Definition: ShaderProgram.h:104
void UpdateMaterialConstantsData()
Definition: ShaderProgram.h:128
VkPipelineLayout GetPipelineLayout() const
Definition: ShaderProgram.h:103
void PostDispatch(CRingCommandContext &commandContext)
Definition: ShaderProgram.cpp:689
std::unique_ptr< std::byte[]> m_MaterialConstantsData
Definition: ShaderProgram.h:168
std::vector< PushConstant > m_PushConstants
Definition: ShaderProgram.h:174
std::optional< CSingleTypeDescriptorSetBinding< CTexture > > m_TextureBinding
Definition: ShaderProgram.h:179
Definition: Texture.h:41
Definition: ShaderProgram.h:50
UID GetUID() const
Definition: ShaderProgram.h:71
std::vector< SVertexAttributeFormat > m_Attributes
Definition: ShaderProgram.h:78
IDevice * GetDevice() override
Definition: ShaderProgram.cpp:137
UID m_UID
Definition: ShaderProgram.h:76
uint32_t UID
Definition: ShaderProgram.h:70
CVertexInputLayout(CDevice *device, const PS::span< const SVertexAttributeFormat > attributes)
Definition: ShaderProgram.h:52
const std::vector< SVertexAttributeFormat > & GetAttributes() const noexcept
Definition: ShaderProgram.h:68
CDevice * m_Device
Definition: ShaderProgram.h:74
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
Definition: debug.h:277
VertexAttributeStream
Definition: IShaderProgram.h:33
Backend
Definition: Backend.h:28
Definition: VideoMode.h:29
Definition: IShaderProgram.h:54
uint32_t size
Definition: ShaderProgram.h:159
VkShaderStageFlags stageFlags
Definition: ShaderProgram.h:160
uint32_t offset
Definition: ShaderProgram.h:158
CStrIntern name
Definition: ShaderProgram.h:157
CStrIntern name
Definition: ShaderProgram.h:164
uint32_t size
Definition: ShaderProgram.h:166
uint32_t offset
Definition: ShaderProgram.h:165
unsigned int uint32_t
Definition: wposix_types.h:53