LiteFX 0.4.1.2025
Computer Graphics Engine
Loading...
Searching...
No Matches
dx12_builders.hpp
1#pragma once
2
3#include <litefx/rendering_builders.hpp>
4#include "dx12_api.hpp"
5#include "dx12.hpp"
6
7#if defined(LITEFX_BUILD_DEFINE_BUILDERS)
9 using namespace LiteFX::Math;
10 using namespace LiteFX::Rendering;
11
16 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12BarrierBuilder final : public BarrierBuilder<DirectX12Barrier> {
17 public:
21 explicit DirectX12BarrierBuilder();
22 ~DirectX12BarrierBuilder() noexcept override;
23
24 DirectX12BarrierBuilder(const DirectX12BarrierBuilder&) = delete;
25 DirectX12BarrierBuilder(DirectX12BarrierBuilder&&) noexcept = default;
26 DirectX12BarrierBuilder& operator=(const DirectX12BarrierBuilder&) = delete;
27 DirectX12BarrierBuilder& operator=(DirectX12BarrierBuilder&&) noexcept = 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_DIRECTX12_API [[nodiscard]] DirectX12ShaderProgramBuilder final : public ShaderProgramBuilder<DirectX12ShaderProgram> {
49 public:
54 explicit DirectX12ShaderProgramBuilder(const DirectX12Device& device);
55 ~DirectX12ShaderProgramBuilder() noexcept override;
56
57 DirectX12ShaderProgramBuilder(const DirectX12ShaderProgramBuilder&) = delete;
58 DirectX12ShaderProgramBuilder(DirectX12ShaderProgramBuilder&&) noexcept = delete;
59 auto operator=(const DirectX12ShaderProgramBuilder&) = delete;
60 auto operator=(DirectX12ShaderProgramBuilder&&) noexcept = delete;
61
62 // Builder interface.
63 protected:
65 void build() override;
66
67 // ShaderProgramBuilder interface.
68 protected:
70 UniquePtr<DirectX12ShaderModule> makeShaderModule(ShaderStage type, const String& fileName, const String& entryPoint, const Optional<DescriptorBindingPoint>& shaderLocalDescriptor) override;
71
73 UniquePtr<DirectX12ShaderModule> makeShaderModule(ShaderStage type, std::istream& stream, const String& name, const String& entryPoint, const Optional<DescriptorBindingPoint>& shaderLocalDescriptor) override;
74 };
75
80 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12RasterizerBuilder final : public RasterizerBuilder<DirectX12Rasterizer> {
81 public:
85 explicit DirectX12RasterizerBuilder();
86 ~DirectX12RasterizerBuilder() noexcept override;
87
88 DirectX12RasterizerBuilder(const DirectX12RasterizerBuilder&) = delete;
89 DirectX12RasterizerBuilder(DirectX12RasterizerBuilder&&) noexcept = delete;
90 auto operator=(const DirectX12RasterizerBuilder&) = delete;
91 auto operator=(DirectX12RasterizerBuilder&&) noexcept = delete;
92
93 // Builder interface.
94 protected:
96 void build() override;
97 };
98
103 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12InputAssemblerBuilder final : public InputAssemblerBuilder<DirectX12InputAssembler> {
104 LITEFX_IMPLEMENTATION(DirectX12InputAssemblerBuilderImpl);
105
106 public:
110 explicit DirectX12InputAssemblerBuilder();
111 ~DirectX12InputAssemblerBuilder() noexcept override;
112
113 DirectX12InputAssemblerBuilder(const DirectX12InputAssemblerBuilder&) = delete;
114 DirectX12InputAssemblerBuilder(DirectX12InputAssemblerBuilder&&) noexcept = delete;
115 auto operator=(const DirectX12InputAssemblerBuilder&) = delete;
116 auto operator=(DirectX12InputAssemblerBuilder&&) noexcept = delete;
117
118 // Builder interface.
119 protected:
121 void build() override;
122
123 public:
129 DirectX12VertexBufferLayoutBuilder vertexBuffer(size_t elementSize, UInt32 binding = 0);
130
135 template <typename TSelf>
136 inline auto indexType(this TSelf&& self, IndexType type) -> TSelf&& {
137 self.use(DirectX12IndexBufferLayout::create(type));
138 return std::forward<TSelf>(self);
139 }
140 };
141
147 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12VertexBufferLayoutBuilder final : public VertexBufferLayoutBuilder<DirectX12VertexBufferLayout, DirectX12InputAssemblerBuilder> {
148 public:
149 using VertexBufferLayoutBuilder<DirectX12VertexBufferLayout, DirectX12InputAssemblerBuilder>::VertexBufferLayoutBuilder;
150
151 // Builder interface.
152 protected:
154 void build() override;
155 };
156
163 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12PipelineLayoutBuilder final : public PipelineLayoutBuilder<DirectX12PipelineLayout> {
164 LITEFX_IMPLEMENTATION(DirectX12PipelineLayoutBuilderImpl);
165 friend class DirectX12DescriptorSetLayoutBuilder;
166
167 public:
171 DirectX12PipelineLayoutBuilder(const DirectX12Device& device);
172 ~DirectX12PipelineLayoutBuilder() noexcept override;
173
174 DirectX12PipelineLayoutBuilder(DirectX12PipelineLayoutBuilder&&) noexcept = delete;
175 DirectX12PipelineLayoutBuilder(const DirectX12PipelineLayoutBuilder&) = delete;
176 auto operator=(DirectX12PipelineLayoutBuilder&&) noexcept = delete;
177 auto operator=(const DirectX12PipelineLayoutBuilder&) = delete;
178
179 // Builder interface.
180 protected:
182 void build() override;
183
184 // DirectX12PipelineLayoutBuilder.
185 public:
191 DirectX12DescriptorSetLayoutBuilder descriptorSet(UInt32 space = 0, ShaderStage stages = ShaderStage::Any);
192
197 DirectX12PushConstantsLayoutBuilder pushConstants(UInt32 size);
198
199 private:
204 SharedPtr<const DirectX12Device> device() const noexcept;
205 };
206
213 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12DescriptorSetLayoutBuilder final : public DescriptorSetLayoutBuilder<DirectX12DescriptorSetLayout, DirectX12PipelineLayoutBuilder> {
214 public:
221 explicit DirectX12DescriptorSetLayoutBuilder(DirectX12PipelineLayoutBuilder& parent, UInt32 space = 0, ShaderStage stages = ShaderStage::Any);
222 ~DirectX12DescriptorSetLayoutBuilder() noexcept override;
223
224 DirectX12DescriptorSetLayoutBuilder(const DirectX12DescriptorSetLayoutBuilder&) = delete;
225 DirectX12DescriptorSetLayoutBuilder(DirectX12DescriptorSetLayoutBuilder&&) noexcept = delete;
226 auto operator=(const DirectX12DescriptorSetLayoutBuilder&) = delete;
227 auto operator=(DirectX12DescriptorSetLayoutBuilder&&) noexcept = delete;
228
229 // Builder interface.
230 protected:
232 void build() override;
233
234 // DescriptorSetLayoutBuilder interface.
235 protected:
237 DirectX12DescriptorLayout makeDescriptor(DescriptorType type, UInt32 binding, UInt32 descriptorSize, UInt32 descriptors) override;
238
240 DirectX12DescriptorLayout makeDescriptor(UInt32 binding, FilterMode magFilter, FilterMode minFilter, BorderMode borderU, BorderMode borderV, BorderMode borderW, MipMapMode mipMapMode, Float mipMapBias, Float minLod, Float maxLod, Float anisotropy) override;
241 };
242
247 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12PushConstantsLayoutBuilder final : public PushConstantsLayoutBuilder<DirectX12PushConstantsLayout, DirectX12PipelineLayoutBuilder> {
248 public:
254 explicit DirectX12PushConstantsLayoutBuilder(DirectX12PipelineLayoutBuilder& parent, UInt32 size);
255 ~DirectX12PushConstantsLayoutBuilder() noexcept override;
256
257 DirectX12PushConstantsLayoutBuilder(const DirectX12PushConstantsLayoutBuilder&) = delete;
258 DirectX12PushConstantsLayoutBuilder(DirectX12PushConstantsLayoutBuilder&&) noexcept = delete;
259 auto operator=(const DirectX12PushConstantsLayoutBuilder&) = delete;
260 auto operator=(DirectX12PushConstantsLayoutBuilder&&) noexcept = delete;
261
262 // Builder interface.
263 protected:
265 void build() override;
266
267 // PushConstantsLayoutBuilder interface.
268 protected:
270 UniquePtr<DirectX12PushConstantsRange> makeRange(ShaderStage shaderStages, UInt32 offset, UInt32 size, UInt32 space, UInt32 binding) override;
271 };
272
277 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12RenderPipelineBuilder final : public RenderPipelineBuilder<DirectX12RenderPipeline> {
278 public:
284 explicit DirectX12RenderPipelineBuilder(const DirectX12RenderPass& renderPass, const String& name = "");
285 ~DirectX12RenderPipelineBuilder() noexcept override;
286
287 DirectX12RenderPipelineBuilder(DirectX12RenderPipelineBuilder&&) noexcept = delete;
288 DirectX12RenderPipelineBuilder(const DirectX12RenderPipelineBuilder&) = delete;
289 auto operator=(DirectX12RenderPipelineBuilder&&) noexcept = delete;
290 auto operator=(const DirectX12RenderPipelineBuilder&) = delete;
291
292 // Builder interface.
293 public:
295 void build() override;
296 };
297
302 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12ComputePipelineBuilder final : public ComputePipelineBuilder<DirectX12ComputePipeline> {
303 public:
309 explicit DirectX12ComputePipelineBuilder(const DirectX12Device& device, const String& name = "");
310 ~DirectX12ComputePipelineBuilder() noexcept override;
311
312 DirectX12ComputePipelineBuilder(DirectX12ComputePipelineBuilder&&) noexcept = delete;
313 DirectX12ComputePipelineBuilder(const DirectX12ComputePipelineBuilder&) = delete;
314 auto operator=(DirectX12ComputePipelineBuilder&&) noexcept = delete;
315 auto operator=(const DirectX12ComputePipelineBuilder&) = delete;
316
317 // Builder interface.
318 public:
320 void build() override;
321 };
322
327 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12RayTracingPipelineBuilder final : public RayTracingPipelineBuilder<DirectX12RayTracingPipeline> {
328 public:
335 explicit DirectX12RayTracingPipelineBuilder(const DirectX12Device& device, ShaderRecordCollection&& shaderRecords, const String& name = "");
336 ~DirectX12RayTracingPipelineBuilder() noexcept override;
337
338 DirectX12RayTracingPipelineBuilder(DirectX12RayTracingPipelineBuilder&&) noexcept = delete;
339 DirectX12RayTracingPipelineBuilder(const DirectX12RayTracingPipelineBuilder&) = delete;
340 auto operator=(DirectX12RayTracingPipelineBuilder&&) noexcept = delete;
341 auto operator=(const DirectX12RayTracingPipelineBuilder&) = delete;
342
343 // Builder interface.
344 public:
346 void build() override;
347 };
348
353 class LITEFX_DIRECTX12_API [[nodiscard]] DirectX12RenderPassBuilder final : public RenderPassBuilder<DirectX12RenderPass> {
354 public:
360 explicit DirectX12RenderPassBuilder(const DirectX12Device& device, const String& name = "");
361
368 explicit DirectX12RenderPassBuilder(const DirectX12Device& device, UInt32 commandBuffers, const String& name = "");
369
370 ~DirectX12RenderPassBuilder() noexcept override;
371
372 DirectX12RenderPassBuilder(const DirectX12RenderPassBuilder&) = delete;
373 DirectX12RenderPassBuilder(DirectX12RenderPassBuilder&&) noexcept = delete;
374 auto operator=(const DirectX12RenderPassBuilder&) = delete;
375 auto operator=(DirectX12RenderPassBuilder&&) noexcept = delete;
376
377 // Builder interface.
378 protected:
380 void build() override;
381
382 // RenderPassBuilder interface.
383 protected:
385 RenderPassDependency makeInputAttachment(DescriptorBindingPoint binding, const RenderTarget& renderTarget) override;
386 };
387
388}
389#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::shared_ptr< T > SharedPtr
Represents a shared pointer, that expresses non-exclusive ownership.
Definition containers.hpp:109
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