FastEngine 0.9.3
A multiplayer oriented 2D engine made with Vulkan.
Loading...
Searching...
No Matches
C_renderStates.hpp
1/*
2 * Copyright 2024 Guillaume Guillet
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _FGE_GRAPHIC_C_RENDERSTATES_HPP_INCLUDED
18#define _FGE_GRAPHIC_C_RENDERSTATES_HPP_INCLUDED
19
20#include "FastEngine/C_vector.hpp"
21#include "FastEngine/accessor/C_texture.hpp"
22#include "FastEngine/textureType.hpp"
24#include "FastEngine/vulkan/C_descriptorSet.hpp"
25
26namespace fge
27{
28
29namespace vulkan
30{
31
32class Shader;
33class VertexBuffer;
34class IndexBuffer;
35
36} // namespace vulkan
37
38class Transform;
39struct TransformUboData;
40
54{
55public:
56 enum class Configs
57 {
58 GLOBAL_TRANSFORMS_INDEX_IS_ADDED_TO_FIRST_INSTANCE,
59 GLOBAL_TRANSFORMS_INDEX_OVERWRITE_FIRST_INSTANCE,
60 GLOBAL_TRANSFORMS_INDEX_IS_IGNORED,
61
62 DEFAULT = GLOBAL_TRANSFORMS_INDEX_OVERWRITE_FIRST_INSTANCE
63 };
64
65 constexpr RenderResourceTransform() = default;
66
67 void set(fge::TransformUboData const& data) { this->g_transform = &data; }
68 void set(uint32_t globalTransformsIndex, Configs config = Configs::DEFAULT)
69 {
70 this->g_transform = globalTransformsIndex;
71 this->g_config = config;
72 }
73 [[nodiscard]] fge::TransformUboData const* getTransformData() const
74 {
75 return std::holds_alternative<fge::TransformUboData const*>(this->g_transform)
76 ? std::get<fge::TransformUboData const*>(this->g_transform)
77 : nullptr;
78 }
79 [[nodiscard]] std::optional<uint32_t> getGlobalTransformsIndex() const
80 {
81 return std::holds_alternative<uint32_t>(this->g_transform)
82 ? std::make_optional(std::get<uint32_t>(this->g_transform))
83 : std::nullopt;
84 }
85 [[nodiscard]] Configs getConfig() const { return this->g_config; }
86
87private:
88 std::variant<fge::TransformUboData const*, uint32_t> g_transform{nullptr};
89 Configs g_config{Configs::DEFAULT};
90};
107{
108public:
109 constexpr RenderResourceInstances() = default;
110
111 constexpr void setInstancesCount(uint32_t count, bool uniqueDrawCall)
112 {
113 this->g_count = count;
114 this->g_uniqueDrawCall = uniqueDrawCall || (this->g_indirectBuffer != VK_NULL_HANDLE);
115 }
116 constexpr void setIndirectBuffer(VkBuffer buffer)
117 {
118 this->g_indirectBuffer = buffer;
119 this->g_uniqueDrawCall = (buffer != VK_NULL_HANDLE);
120 }
121
122 constexpr void setTextureIndices(uint32_t const* textureIndices) { this->g_textureIndices = textureIndices; }
123
124 constexpr void setDynamicDescriptors(fge::vulkan::DescriptorSet const* dynamicDescriptors,
125 uint32_t const* dynamicBufferSizes,
126 uint32_t const* dynamicBufferOffsets,
127 uint32_t const* dynamicSets,
128 uint32_t count)
129 {
130 this->g_dynamicDescriptors = dynamicDescriptors;
131 this->g_dynamicBufferSizes = dynamicBufferSizes;
132 this->g_dynamicBufferOffsets = dynamicBufferOffsets;
133 this->g_dynamicSets = dynamicSets;
134 this->g_dynamicCount = count;
135
136 assert(count == 0 || dynamicDescriptors != nullptr);
137 assert(count == 0 || dynamicBufferSizes != nullptr);
138 assert(count == 0 || dynamicBufferOffsets != nullptr);
139 assert(count == 0 || dynamicSets != nullptr);
140 }
141
142 constexpr void setVertexCount(uint32_t count) { this->g_vertexCount = count; }
143 constexpr void setVertexOffset(uint32_t offset) { this->g_vertexOffset = offset; }
144
153 constexpr void setFirstInstance(uint32_t firstInstance) { this->g_firstInstance = firstInstance; }
154
155 [[nodiscard]] constexpr uint32_t getInstancesCount() const { return this->g_count; }
156 [[nodiscard]] constexpr bool hasUniqueDrawCall() const { return this->g_uniqueDrawCall; }
157 [[nodiscard]] constexpr VkBuffer getIndirectBuffer() const { return this->g_indirectBuffer; }
158
159 [[nodiscard]] constexpr uint32_t const* getTextureIndices() const { return this->g_textureIndices; }
160 [[nodiscard]] constexpr uint32_t getTextureIndices(uint32_t index) const { return this->g_textureIndices[index]; }
161
162 [[nodiscard]] constexpr fge::vulkan::DescriptorSet const* getDynamicDescriptors(uint32_t index = 0) const
163 {
164 return this->g_dynamicDescriptors + index;
165 }
166
167 [[nodiscard]] constexpr uint32_t const* getDynamicBufferSizes() const { return this->g_dynamicBufferSizes; }
168 [[nodiscard]] constexpr uint32_t getDynamicBufferSizes(uint32_t index) const
169 {
170 return this->g_dynamicBufferSizes[index];
171 }
172
173 [[nodiscard]] constexpr uint32_t const* getDynamicBufferOffsets() const { return this->g_dynamicBufferOffsets; }
174 [[nodiscard]] constexpr uint32_t getDynamicBufferOffsets(uint32_t index) const
175 {
176 return this->g_dynamicBufferOffsets[index];
177 }
178
179 [[nodiscard]] constexpr uint32_t const* getDynamicSets() const { return this->g_dynamicSets; }
180 [[nodiscard]] constexpr uint32_t getDynamicSets(uint32_t index) const { return this->g_dynamicSets[index]; }
181
182 [[nodiscard]] constexpr uint32_t getDynamicCount() const { return this->g_dynamicCount; }
183
184 [[nodiscard]] constexpr uint32_t getVertexCount() const { return this->g_vertexCount; }
185 [[nodiscard]] constexpr uint32_t getVertexOffset() const { return this->g_vertexOffset; }
186
187 [[nodiscard]] constexpr uint32_t getFirstInstance() const { return this->g_firstInstance; }
188
189private:
190 uint32_t g_count{1};
191 uint32_t const* g_textureIndices{nullptr};
192
193 fge::vulkan::DescriptorSet const* g_dynamicDescriptors{nullptr};
194 uint32_t g_dynamicCount{0};
195 uint32_t const* g_dynamicBufferSizes{nullptr};
196 uint32_t const* g_dynamicBufferOffsets{nullptr};
197 uint32_t const* g_dynamicSets{nullptr};
198
199 uint32_t g_vertexCount{0};
200 uint32_t g_vertexOffset{0};
201 uint32_t g_firstInstance{0};
202 bool g_uniqueDrawCall{false};
203 VkBuffer g_indirectBuffer{VK_NULL_HANDLE};
204};
214{
215public:
224 enum class PtrTypes
225 {
226 TEXTURE,
227 TEXTURE_IMAGE
228 };
229
230 template<class...>
231 static constexpr std::false_type always_false{};
232
233 constexpr RenderResourceTextures() = default;
234 template<class TTexture>
235 constexpr RenderResourceTextures(TTexture const* textures, uint32_t count) :
236 g_textures(textures),
237 g_count(textures == nullptr ? 0 : count)
238 {
239 if constexpr (std::is_same_v<TTexture, fge::TextureType> || std::is_same_v<TTexture, std::nullptr_t>)
240 {
241 this->g_ptrType = PtrTypes::TEXTURE_IMAGE;
242 }
243 else if constexpr (std::is_same_v<TTexture, fge::Texture>)
244 {
245 this->g_ptrType = PtrTypes::TEXTURE;
246 }
247 else
248 {
249 static_assert(always_false<TTexture>, "Can't set this type of texture pointer !");
250 }
251 }
252
253 template<class TTexture>
254 constexpr void set(TTexture const* textures, uint32_t count)
255 {
256 this->g_textures = textures;
257 this->g_count = textures == nullptr ? 0 : count;
258
259 if constexpr (std::is_same_v<TTexture, fge::TextureType> || std::is_same_v<TTexture, std::nullptr_t>)
260 {
261 this->g_ptrType = PtrTypes::TEXTURE_IMAGE;
262 }
263 else if constexpr (std::is_same_v<TTexture, fge::Texture>)
264 {
265 this->g_ptrType = PtrTypes::TEXTURE;
266 }
267 else
268 {
269 static_assert(always_false<TTexture>, "Can't set this type of texture pointer !");
270 }
271 }
272 [[nodiscard]] constexpr uint32_t getCount() const { return this->g_count; }
273 [[nodiscard]] constexpr PtrTypes getPointerType() const { return this->g_ptrType; }
274
275 template<PtrTypes TTextureType>
276 constexpr auto const* get(uint32_t index) const
277 {
278 if constexpr (TTextureType == PtrTypes::TEXTURE_IMAGE)
279 {
280 return static_cast<fge::TextureType const*>(this->g_textures) + index;
281 }
282 else
283 {
284 return static_cast<fge::Texture const*>(this->g_textures) + index;
285 }
286 }
287
288 template<PtrTypes TTextureType>
289 [[nodiscard]] constexpr fge::TextureType const* getTextureImage(uint32_t index) const
290 {
291 if constexpr (TTextureType == PtrTypes::TEXTURE_IMAGE)
292 {
293 return static_cast<fge::TextureType const*>(this->g_textures) + index;
294 }
295 else
296 {
297#ifndef FGE_DEF_SERVER
298 return static_cast<fge::Texture const*>(this->g_textures)[index].getSharedData().get();
299#else
300 return nullptr;
301#endif
302 }
303 }
304
305private:
306 void const* g_textures{nullptr};
307 PtrTypes g_ptrType{PtrTypes::TEXTURE_IMAGE};
308 uint32_t g_count{0};
309};
322{
323public:
324 using ArrayOfDescriptorSet = fge::vulkan::DescriptorSet const*;
325 using ArrayOfDescriptorSetPointer = fge::vulkan::DescriptorSet const**;
326 using ArrayVariant = std::variant<ArrayOfDescriptorSet, ArrayOfDescriptorSetPointer>;
327
328 constexpr RenderResourceDescriptors() = default;
329
330 constexpr RenderResourceDescriptors(ArrayVariant const& descriptors, uint32_t const* sets, uint32_t count) :
331 g_descriptors(descriptors),
332 g_sets(sets),
333 g_count(count)
334 {
335 assert(count == 0 || sets != nullptr);
336 }
337
338 constexpr void set(ArrayVariant const& descriptors, uint32_t const* sets, uint32_t count)
339 {
340 this->g_descriptors = descriptors;
341 this->g_sets = sets;
342 this->g_count = count;
343
344 assert(count == 0 || sets != nullptr);
345 }
346
347 [[nodiscard]] constexpr uint32_t getCount() const { return this->g_count; }
348
349 [[nodiscard]] constexpr fge::vulkan::DescriptorSet const* getDescriptorSet(uint32_t index) const
350 {
351 if (std::holds_alternative<ArrayOfDescriptorSet>(this->g_descriptors))
352 {
353 return &std::get<ArrayOfDescriptorSet>(this->g_descriptors)[index];
354 }
355 return std::get<ArrayOfDescriptorSetPointer>(this->g_descriptors)[index];
356 }
357 [[nodiscard]] constexpr uint32_t getSet(uint32_t index) const { return this->g_sets[index]; }
358
359private:
360 ArrayVariant g_descriptors{ArrayOfDescriptorSet{nullptr}};
361 uint32_t const* g_sets{nullptr};
362 uint32_t g_count{0};
363};
364
373{
374public:
376 {
377 VkShaderStageFlags g_stages{VK_SHADER_STAGE_ALL};
378 uint32_t g_offset{0};
379 uint32_t g_size{0};
380 void const* g_data{nullptr};
381 };
382
383 constexpr RenderResourcePushConstants() = default;
384
385 constexpr void set(PushConstantData const* data, uint32_t count)
386 {
387 assert(count == 0 || data != nullptr);
388
389 this->g_pushConstants = data;
390 this->count = count;
391 }
392
393 [[nodiscard]] constexpr PushConstantData const* getPushConstants(uint32_t index) const
394 {
395 return this->g_pushConstants + index;
396 }
397 [[nodiscard]] constexpr uint32_t getCount() const { return this->count; }
398
399private:
400 PushConstantData const* g_pushConstants{nullptr};
401 uint32_t count{0};
402};
403
412{
413public:
414 RenderStates(RenderStates const& r) = delete;
415 RenderStates(RenderStates&& r) noexcept = default;
416 explicit RenderStates(fge::TextureType const* textureImage = nullptr) :
417 _resTextures{textureImage, 1}
418 {}
419 explicit RenderStates(fge::vulkan::VertexBuffer const* vertexBuffer,
420 fge::TextureType const* textureImage = nullptr,
421 fge::vulkan::BlendMode const& blendMode = {}) :
422 _resTextures{textureImage, 1},
423 _vertexBuffer(vertexBuffer),
424 _blendMode(blendMode)
425 {}
426
427 [[nodiscard]] RenderStates copy(fge::TextureType const* textureImage = nullptr) const
428 {
429 return RenderStates{nullptr, textureImage, this->_blendMode};
430 }
431
432 RenderStates& operator=(RenderStates const& r) = delete;
433 RenderStates& operator=(RenderStates&& r) noexcept = default;
434
435 RenderResourceTransform _resTransform{};
436 RenderResourceTextures _resTextures{};
437 RenderResourceInstances _resInstances{};
438 RenderResourceDescriptors _resDescriptors{};
439 RenderResourcePushConstants _resPushConstants{};
440
441 fge::vulkan::VertexBuffer const* _vertexBuffer{nullptr};
442 fge::vulkan::IndexBuffer const* _indexBuffer{nullptr};
443 fge::vulkan::BlendMode _blendMode{};
444 VkPrimitiveTopology _topology{VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST};
445 fge::vulkan::Shader const* _shaderVertex{nullptr};
446 fge::vulkan::Shader const* _shaderGeometry{nullptr};
447 fge::vulkan::Shader const* _shaderFragment{nullptr};
448};
449
450} // namespace fge
451
452#endif // _FGE_GRAPHIC_C_RENDERSTATES_HPP_INCLUDED
Resource containing descriptor sets information for rendering.
Definition C_renderStates.hpp:322
Resource containing instances information for rendering.
Definition C_renderStates.hpp:107
constexpr void setFirstInstance(uint32_t firstInstance)
Set the first instance value for the draw call.
Definition C_renderStates.hpp:153
Resource containing push constants information for rendering.
Definition C_renderStates.hpp:373
Resource containing textures information for rendering.
Definition C_renderStates.hpp:214
PtrTypes
The type of pointer used to store the textures.
Definition C_renderStates.hpp:225
Resource containing transform information for rendering.
Definition C_renderStates.hpp:54
The RenderStates class contains all the information needed to render something.
Definition C_renderStates.hpp:412
This class is a wrapper for the texture manager to allow easy manipulation.
Definition C_texture.hpp:36
This class abstract the vulkan descriptor set for easier use.
Definition C_descriptorSet.hpp:41
Definition C_vertexBuffer.hpp:104
Definition C_shader.hpp:36
Definition C_textureImage.hpp:34
Definition C_vertexBuffer.hpp:45
Definition C_transform.hpp:26
This is a simple abstraction class for VkBlendFactor, VkBlendOp.
Definition C_blendMode.hpp:37