LiteFX 0.4.1.2025
Computer Graphics Engine
Loading...
Searching...
No Matches
vulkan_builders.hpp
1#pragma once
2
3#include <litefx/rendering_builders.hpp>
4#include "vulkan_api.hpp"
5#include "vulkan.hpp"
6
7#if defined(LITEFX_BUILD_DEFINE_BUILDERS)
9 using namespace LiteFX::Math;
10 using namespace LiteFX::Rendering;
11
16 class LITEFX_VULKAN_API [[nodiscard]] VulkanBarrierBuilder final : public BarrierBuilder<VulkanBarrier> {
17 public:
21 explicit VulkanBarrierBuilder();
22 ~VulkanBarrierBuilder() noexcept override;
23
24 VulkanBarrierBuilder(VulkanBarrierBuilder&&) noexcept = default;
25 VulkanBarrierBuilder(const VulkanBarrierBuilder&) = delete;
26 VulkanBarrierBuilder& operator=(VulkanBarrierBuilder&&) noexcept = delete;
27 VulkanBarrierBuilder& operator=(const VulkanBarrierBuilder&) = delete;
28
29 // BarrierBuilder interface.
30 public:
32 void setupStages(PipelineStage waitFor, PipelineStage continueWith) override;
33
35 void setupGlobalBarrier(ResourceAccess before, ResourceAccess after) override;
36
38 void setupBufferBarrier(IBuffer& buffer, ResourceAccess before, ResourceAccess after) override;
39
41 void setupImageBarrier(IImage& image, ResourceAccess before, ResourceAccess after, ImageLayout layout, UInt32 level, UInt32 levels, UInt32 layer, UInt32 layers, UInt32 plane) override;
42 };
43
48 class LITEFX_VULKAN_API [[nodiscard]] VulkanShaderProgramBuilder final : public ShaderProgramBuilder<VulkanShaderProgram> {
49 public:
54 explicit VulkanShaderProgramBuilder(const VulkanDevice& device);
55 ~VulkanShaderProgramBuilder() noexcept override;
56
57 VulkanShaderProgramBuilder(VulkanShaderProgramBuilder&&) noexcept = delete;
58 VulkanShaderProgramBuilder(const VulkanShaderProgramBuilder&) = delete;
59 VulkanShaderProgramBuilder& operator=(VulkanShaderProgramBuilder&&) noexcept = delete;
60 VulkanShaderProgramBuilder& operator=(const VulkanShaderProgramBuilder&) = delete;
61
62 // Builder interface.
63 protected:
65 void build() override;
66
67 // ShaderProgramBuilder interface.
68 protected:
70 UniquePtr<VulkanShaderModule> makeShaderModule(ShaderStage type, const String& fileName, const String& entryPoint, const Optional<DescriptorBindingPoint>& shaderLocalDescriptor) override;
71
73 UniquePtr<VulkanShaderModule> makeShaderModule(ShaderStage type, std::istream& stream, const String& name, const String& entryPoint, const Optional<DescriptorBindingPoint>& shaderLocalDescriptor) override;
74 };
75
80 class LITEFX_VULKAN_API [[nodiscard]] VulkanRasterizerBuilder final : public RasterizerBuilder<VulkanRasterizer> {
81 public:
85 explicit VulkanRasterizerBuilder();
86 ~VulkanRasterizerBuilder() noexcept override;
87
88 VulkanRasterizerBuilder(VulkanRasterizerBuilder&&) noexcept = delete;
89 VulkanRasterizerBuilder(const VulkanRasterizerBuilder&) = delete;
90 VulkanRasterizerBuilder& operator=(VulkanRasterizerBuilder&&) noexcept = delete;
91 VulkanRasterizerBuilder& operator=(const VulkanRasterizerBuilder&) = delete;
92
93 // Builder interface.
94 public:
96 void build() override;
97 };
98
103 class LITEFX_VULKAN_API [[nodiscard]] VulkanInputAssemblerBuilder final : public InputAssemblerBuilder<VulkanInputAssembler> {
104 LITEFX_IMPLEMENTATION(VulkanInputAssemblerBuilderImpl);
105
106 public:
110 explicit VulkanInputAssemblerBuilder();
111 ~VulkanInputAssemblerBuilder() noexcept override;
112
113 VulkanInputAssemblerBuilder(VulkanInputAssemblerBuilder&&) noexcept = delete;
114 VulkanInputAssemblerBuilder(const VulkanInputAssemblerBuilder&) = delete;
115 VulkanInputAssemblerBuilder& operator=(VulkanInputAssemblerBuilder&&) noexcept = delete;
116 VulkanInputAssemblerBuilder& operator=(const VulkanInputAssemblerBuilder&) = delete;
117
118 // Builder interface.
119 protected:
121 void build() override;
122
123 public:
129 VulkanVertexBufferLayoutBuilder vertexBuffer(size_t elementSize, UInt32 binding = 0);
130
135 template <typename TSelf>
136 auto indexType(this TSelf&& self, IndexType type) -> TSelf&& {
137 self.use(VulkanIndexBufferLayout::create(type));
138 return std::forward<TSelf>(self);
139 }
140 };
141
147 class LITEFX_VULKAN_API [[nodiscard]] VulkanVertexBufferLayoutBuilder final : public VertexBufferLayoutBuilder<VulkanVertexBufferLayout, VulkanInputAssemblerBuilder> {
148 public:
149 using VertexBufferLayoutBuilder<VulkanVertexBufferLayout, VulkanInputAssemblerBuilder>::VertexBufferLayoutBuilder;
150
151 // Builder interface.
152 protected:
154 void build() override;
155 };
156
163 class LITEFX_VULKAN_API [[nodiscard]] VulkanPipelineLayoutBuilder final : public PipelineLayoutBuilder<VulkanPipelineLayout> {
164 friend class VulkanDescriptorSetLayoutBuilder;
165
166 public:
170 explicit VulkanPipelineLayoutBuilder(const VulkanDevice& device);
171 ~VulkanPipelineLayoutBuilder() noexcept override;
172
173 VulkanPipelineLayoutBuilder(VulkanPipelineLayoutBuilder&&) noexcept = delete;
174 VulkanPipelineLayoutBuilder(const VulkanPipelineLayoutBuilder&) = delete;
175 VulkanPipelineLayoutBuilder& operator=(VulkanPipelineLayoutBuilder&&) noexcept = delete;
176 VulkanPipelineLayoutBuilder& operator=(const VulkanPipelineLayoutBuilder&) = delete;
177
178 // Builder interface.
179 protected:
181 void build() override;
182
183 // VulkanPipelineLayoutBuilder.
184 public:
190 VulkanDescriptorSetLayoutBuilder descriptorSet(UInt32 space = 0, ShaderStage stages = ShaderStage::Any);
191
196 VulkanPushConstantsLayoutBuilder pushConstants(UInt32 size);
197 };
198
205 class LITEFX_VULKAN_API [[nodiscard]] VulkanDescriptorSetLayoutBuilder final : public DescriptorSetLayoutBuilder<VulkanDescriptorSetLayout, VulkanPipelineLayoutBuilder> {
206 public:
213 explicit VulkanDescriptorSetLayoutBuilder(VulkanPipelineLayoutBuilder& parent, UInt32 space = 0, ShaderStage stages = ShaderStage::Any);
214 ~VulkanDescriptorSetLayoutBuilder() noexcept override;
215
216 VulkanDescriptorSetLayoutBuilder(VulkanDescriptorSetLayoutBuilder&&) noexcept = delete;
217 VulkanDescriptorSetLayoutBuilder(const VulkanDescriptorSetLayoutBuilder&) = delete;
218 VulkanDescriptorSetLayoutBuilder& operator=(VulkanDescriptorSetLayoutBuilder&&) noexcept = delete;
219 VulkanDescriptorSetLayoutBuilder& operator=(const VulkanDescriptorSetLayoutBuilder&) = delete;
220
221 // Builder interface.
222 protected:
224 void build() override;
225
226 // DescriptorSetLayoutBuilder interface.
227 protected:
229 VulkanDescriptorLayout makeDescriptor(DescriptorType type, UInt32 binding, UInt32 descriptorSize, UInt32 descriptors) override;
230
232 VulkanDescriptorLayout makeDescriptor(UInt32 binding, FilterMode magFilter, FilterMode minFilter, BorderMode borderU, BorderMode borderV, BorderMode borderW, MipMapMode mipMapMode, Float mipMapBias, Float minLod, Float maxLod, Float anisotropy) override;
233 };
234
239 class LITEFX_VULKAN_API [[nodiscard]] VulkanPushConstantsLayoutBuilder final : public PushConstantsLayoutBuilder<VulkanPushConstantsLayout, VulkanPipelineLayoutBuilder> {
240 public:
246 explicit VulkanPushConstantsLayoutBuilder(VulkanPipelineLayoutBuilder& parent, UInt32 size);
247 ~VulkanPushConstantsLayoutBuilder() noexcept override;
248
249 VulkanPushConstantsLayoutBuilder(VulkanPushConstantsLayoutBuilder&&) noexcept = delete;
250 VulkanPushConstantsLayoutBuilder(const VulkanPushConstantsLayoutBuilder&) = delete;
251 VulkanPushConstantsLayoutBuilder& operator=(VulkanPushConstantsLayoutBuilder&&) noexcept = delete;
252 VulkanPushConstantsLayoutBuilder& operator=(const VulkanPushConstantsLayoutBuilder&) = delete;
253
254 // Builder interface.
255 protected:
257 void build() override;
258
259 // PushConstantsLayoutBuilder interface.
260 protected:
262 UniquePtr<VulkanPushConstantsRange> makeRange(ShaderStage shaderStages, UInt32 offset, UInt32 size, UInt32 space, UInt32 binding) override;
263 };
264
269 class LITEFX_VULKAN_API [[nodiscard]] VulkanRenderPipelineBuilder final : public RenderPipelineBuilder<VulkanRenderPipeline> {
270 public:
276 explicit VulkanRenderPipelineBuilder(const VulkanRenderPass& renderPass, const String& name = "");
277 ~VulkanRenderPipelineBuilder() noexcept override;
278
279 VulkanRenderPipelineBuilder(VulkanRenderPipelineBuilder&&) noexcept = delete;
280 VulkanRenderPipelineBuilder(const VulkanRenderPipelineBuilder&) = delete;
281 VulkanRenderPipelineBuilder& operator=(VulkanRenderPipelineBuilder&&) noexcept = delete;
282 VulkanRenderPipelineBuilder& operator=(const VulkanRenderPipelineBuilder&) = delete;
283
284 // Builder interface.
285 public:
287 void build() override;
288 };
289
294 class LITEFX_VULKAN_API [[nodiscard]] VulkanComputePipelineBuilder final : public ComputePipelineBuilder<VulkanComputePipeline> {
295 public:
301 explicit VulkanComputePipelineBuilder(const VulkanDevice& device, const String& name = "");
302 ~VulkanComputePipelineBuilder() noexcept override;
303
304 VulkanComputePipelineBuilder(VulkanComputePipelineBuilder&&) noexcept = delete;
305 VulkanComputePipelineBuilder(const VulkanComputePipelineBuilder&) = delete;
306 VulkanComputePipelineBuilder& operator=(VulkanComputePipelineBuilder&&) noexcept = delete;
307 VulkanComputePipelineBuilder& operator=(const VulkanComputePipelineBuilder&) = delete;
308
309 // Builder interface.
310 public:
312 void build() override;
313 };
314
319 class LITEFX_VULKAN_API [[nodiscard]] VulkanRayTracingPipelineBuilder final : public RayTracingPipelineBuilder<VulkanRayTracingPipeline> {
320 public:
327 explicit VulkanRayTracingPipelineBuilder(const VulkanDevice& device, ShaderRecordCollection&& shaderRecords, const String& name = "");
328 ~VulkanRayTracingPipelineBuilder() noexcept override;
329
330 VulkanRayTracingPipelineBuilder(VulkanRayTracingPipelineBuilder&&) noexcept = delete;
331 VulkanRayTracingPipelineBuilder(const VulkanRayTracingPipelineBuilder&) = delete;
332 VulkanRayTracingPipelineBuilder& operator=(VulkanRayTracingPipelineBuilder&&) noexcept = delete;
333 VulkanRayTracingPipelineBuilder& operator=(const VulkanRayTracingPipelineBuilder&) = delete;
334
335 // Builder interface.
336 public:
338 void build() override;
339 };
340
345 class LITEFX_VULKAN_API [[nodiscard]] VulkanRenderPassBuilder final : public RenderPassBuilder<VulkanRenderPass> {
346 public:
352 explicit VulkanRenderPassBuilder(const VulkanDevice& device, const String& name = "");
353
360 explicit VulkanRenderPassBuilder(const VulkanDevice& device, UInt32 commandBuffers, const String& name = "");
361
363 ~VulkanRenderPassBuilder() noexcept override;
364
365 VulkanRenderPassBuilder(VulkanRenderPassBuilder&&) noexcept = delete;
366 VulkanRenderPassBuilder(const VulkanRenderPassBuilder&) = delete;
367 VulkanRenderPassBuilder& operator=(VulkanRenderPassBuilder&&) noexcept = delete;
368 VulkanRenderPassBuilder& operator=(const VulkanRenderPassBuilder&) = delete;
369
370 // Builder interface.
371 protected:
373 void build() override;
374
375 // RenderPassBuilder interface.
376 protected:
378 RenderPassDependency makeInputAttachment(DescriptorBindingPoint binding, const RenderTarget& renderTarget) override;
379 };
380
381}
382#endif // defined(LITEFX_BUILD_DEFINE_BUILDERS)
Base interface for buffer objects.
Definition rendering_api.hpp:4186
Describes a generic image.
Definition rendering_api.hpp:4208
Represents a mapping between a set of RenderTarget instances and the input attachments of a IRenderPa...
Definition rendering_api.hpp:3076
Implements a render target.
Definition rendering_api.hpp:2976
Stores a set of IShaderRecords in that later form a shader binding table used for ray-tracing.
Definition rendering_api.hpp:6007
Definition math.hpp:30
float_t Float
A type for a floating point value with single precision.
Definition math.hpp:71
uint32_t UInt32
A type for an unsigned 32 bit integer.
Definition math.hpp:56
Definition dx12.hpp:11
Definition dx12.hpp:11
BorderMode
Describes how to treat texture coordinates that are outside the domain [0..1].
Definition rendering_api.hpp:1184
ImageLayout
Specifies the layout of an IImage resource.
Definition rendering_api.hpp:1686
MipMapMode
Describes the filter operation between two mip-map levels.
Definition rendering_api.hpp:1169
ShaderStage
Describes the valid shader stages of a graphics pipeline.
Definition rendering_api.hpp:799
@ Any
Enables all supported shader stages.
IndexType
Describes the element type of an index buffer.
Definition rendering_api.hpp:750
DescriptorType
Describes the type of a IDescriptor.
Definition rendering_api.hpp:436
FilterMode
Describes the filter operation when accessing a pixel from a texture coordinate.
Definition rendering_api.hpp:1152
PipelineStage
Defines pipeline stages as points where synchronization may occur.
Definition rendering_api.hpp:1373
ResourceAccess
Defines how a IBuffer or IImage resource is accessed.
Definition rendering_api.hpp:1537
std::optional< T > Optional
Represents an optional value.
Definition containers.hpp:94
std::unique_ptr< T, TDeleter > UniquePtr
Represents a unique pointer, that expresses exclusive ownership.
Definition containers.hpp:102
std::string String
Definition string.hpp:24
Describes a single descriptor binding point within a IShaderModule.
Definition rendering_api.hpp:2735