Foundation
Loading...
Searching...
No Matches
Command.hpp
Go to the documentation of this file.
1#pragma once
2#include "Common.hpp"
3#include "Descriptor.hpp"
4#include "PipelineState.hpp"
5#include "Resource.hpp"
6namespace Foundation::RHI
7{
8 class RHIDevice;
9 class RHIDeviceQueue;
10 class RHICommandList;
11 class RHICommandPool;
12 class RHIDeviceQueryPool;
13 template <typename T>
15 template <typename T>
18 {
19 protected:
21
22 public:
23 struct PoolDesc
24 {
25 // Queue this command pool is associated with.
27 // How CommandList should be created by this pool.
29 } const mDesc;
30 RHICommandPool(RHIDevice const& device, PoolDesc desc) : mDevice(device), mDesc(desc) {}
31
33 [[nodiscard]] virtual RHICommandList* GetCommandList(Handle handle) const = 0;
34 virtual void DestroyCommandList(Handle handle) = 0;
35
36 virtual void ResetAllCommandLists(bool freeResources = false) = 0;
37
38 virtual void DebugSetObjectName(const char* name) = 0;
39 };
42 {
43 protected:
45
46 public:
48#pragma region Transition
62 virtual RHICommandList& SetBufferTransition(RHIBuffer* buffer, TransitionDesc const& desc) = 0;
65 TransitionDesc const& desc) = 0;
67#pragma endregion
68#pragma region PSO
74 virtual RHICommandList& SetPipeline(PipelineDesc const& desc) = 0;
82#pragma endregion
83#pragma region Rasterizer
84 virtual RHICommandList& SetViewport(float x, float y, float width, float height, float depth_min = 0.0,
85 float depth_max = 1.0, bool flipY = false) = 0;
86 virtual RHICommandList& SetScissor(uint32_t x, uint32_t y, uint32_t width, uint32_t height) = 0;
88 uint32_t first_instance = 0) = 0;
97 size_t stride) = 0;
101#pragma endregion
103 Span<const char> data) = 0;
104 virtual RHICommandList& UpdateBuffer(RHIBuffer* buffer, size_t offset, Span<const char> data) = 0;
105#pragma region Transfer Queue
107 {
108 size_t srcOffset = 0;
109 size_t dstOffset = 0;
114 size_t size = kFullSize;
115 };
116 virtual RHICommandList& FillBuffer(RHIBuffer* buffer, uint32_t value, size_t offset = 0,
117 size_t size = kFullSize) = 0;
121 {
122 // Offset in the source buffer, used for CopyBufferToImage
124 // Subresource layer of the source image, used for CopyImage
126 // 3D offset of the source image, used for CopyImage
134 };
140#pragma endregion
141#pragma region Graphics Pipeline
143 {
145 {
148 // Clear values for the color attachment, if applicable.
150 // Clear values for depth and stencil attachments, if applicable.
151 // If both are set, the depth will be cleared first, then stencil.
153 // If true, with no clear values set, the attachment will not be loaded.
154 bool loadDontCare{false};
155 [[nodiscard]] constexpr bool IsValid() const { return imageView; }
156 };
161 };
162 virtual RHICommandList& BeginGraphics(GraphicsDesc const& desc) = 0;
165 virtual RHICommandList& BindIndexBuffer(RHIBuffer* buffer, size_t offset = 0,
168#pragma endregion
169#pragma region Compute
172#pragma endregion
173#pragma region Raytracing
174 virtual RHICommandList&
176 virtual RHICommandList&
177 TraceRays(uint32_t width, uint32_t height, uint32_t depth) = 0;
178#pragma endregion
179#pragma region Tags & Query
181 uint32_t queryIndex) = 0;
183 RHIDeviceQueryPool* pool, size_t queryIndex) = 0;
184 virtual RHICommandList& DebugBegin(const char* message) = 0;
185 virtual RHICommandList& DebugInsertMarker(const char* message) = 0;
186 virtual RHICommandList& DebugEnd() = 0;
187 virtual RHICommandList& Begin() = 0;
188 virtual void End() = 0;
189 virtual void Reset() = 0;
190#pragma endregion
191
192 virtual void DebugSetObjectName(const char* name) = 0;
193 };
194
195 template <>
197 {
198 static RHICommandList* Get(RHICommandPool const* pool, Handle handle) { return pool->GetCommandList(handle); }
199 static void Destroy(RHICommandPool* pool, Handle handle) { pool->DestroyCommandList(handle); }
200 };
201} // namespace Foundation::RHI
Definition Resource.hpp:57
Definition Command.hpp:42
virtual RHICommandList & BindDescriptorSet(RHIDevicePipelineType bindpoint, RHIPipelineState *pipeline, Span< RHIDeviceDescriptorSet *const > sets, size_t first=0, Span< const uint32_t > dynamicOffsets={})=0
virtual RHICommandList & CopyAccelerationStructure(RHIAccelerationStructure *src, RHIAccelerationStructure *dst, bool compact=true)=0
RHICommandList(RHICommandPool const &commandPool)
Definition Command.hpp:47
virtual RHICommandList & DebugEnd()=0
virtual RHICommandList & Draw(uint32_t vertex_count, uint32_t instance_count=1, uint32_t first_vertex=0, uint32_t first_instance=0)=0
virtual RHICommandList & PushConstant(RHIPipelineState *pipeline, RHIShaderStage stage, uint32_t offset, Span< const char > data)=0
virtual RHICommandList & EndGraphics()=0
virtual RHICommandList & BindIndexBuffer(RHIBuffer *buffer, size_t offset=0, RHIResourceFormat format=RHIResourceFormat::R32Uint)=0
virtual RHICommandList & DebugInsertMarker(const char *message)=0
const RHICommandPool & mCommandPool
Definition Command.hpp:44
virtual RHICommandList & SetBufferTransition(RHIBuffer *buffer, TransitionDesc const &desc)=0
virtual RHICommandList & DispatchIndirect(RHIBuffer *cmd_buffer, size_t cmd_offset)=0
virtual RHICommandList & BuildAccelerationStructure(Span< const RHIAccelerationStructureBuildDesc > desc)=0
virtual RHICommandList & SetScissor(uint32_t x, uint32_t y, uint32_t width, uint32_t height)=0
virtual RHICommandList & SetAccelerationStructureTransition(RHIAccelerationStructure *as, TransitionDesc const &desc)=0
virtual RHICommandList & BeginGraphics(GraphicsDesc const &desc)=0
virtual RHICommandList & TraceRays(uint32_t width, uint32_t height, uint32_t depth)=0
virtual RHICommandList & EndTransition()=0
virtual RHICommandList & UpdateBuffer(RHIBuffer *buffer, size_t offset, Span< const char > data)=0
virtual RHICommandList & SetImageTransition(RHITexture *image, TransitionDesc const &desc)=0
virtual RHICommandList & Dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z)=0
virtual RHICommandList & CopyImage(RHITexture *src_image, RHITextureLayout src_layout, RHITexture *dst_image, RHITextureLayout dst_layout, Span< const CopyImageRegion > regions)=0
virtual RHICommandList & DrawMeshTasksIndirect(RHIBuffer *cmd_buffer, size_t cmd_offset, size_t draw_count, size_t stride)=0
virtual RHICommandList & CopyBufferToImage(RHIBuffer *src_buffer, RHITexture *dst_image, RHITextureLayout dst_layout, Span< const CopyImageRegion > regions)=0
virtual RHICommandList & SetPipeline(PipelineDesc const &desc)=0
virtual RHICommandList & DrawMeshTasksIndirectCount(RHIBuffer *cmd_buffer, size_t cmd_offset, RHIBuffer *count_buffer, size_t count_offset, uint32_t max_draw_count, uint32_t cmd_stride)=0
virtual RHICommandList & DrawIndexedIndirectCount(RHIBuffer *cmd_buffer, size_t cmd_offset, RHIBuffer *count_buffer, size_t count_offset, uint32_t max_draw_count, uint32_t cmd_stride)=0
virtual RHICommandList & SetViewport(float x, float y, float width, float height, float depth_min=0.0, float depth_max=1.0, bool flipY=false)=0
virtual RHICommandList & BindVertexBuffer(uint32_t index, Span< RHIBuffer *const > buffers, Span< const size_t > offsets)=0
virtual RHICommandList & DrawIndexed(uint32_t index_count, uint32_t instance_count=1, uint32_t first_index=0, int32_t vertex_offset=0, uint32_t first_instance=0)=0
virtual RHICommandList & DrawMeshTasks(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z)=0
virtual RHICommandList & DebugBegin(const char *message)=0
virtual RHICommandList & CopyBuffer(RHIBuffer *src_buffer, RHIBuffer *dst_buffer, Span< const CopyBufferRegion > regions)=0
virtual RHICommandList & WriteAccelerationStructureCompactedSize(Span< RHIAccelerationStructure *const > as, RHIDeviceQueryPool *pool, size_t queryIndex)=0
virtual RHICommandList & Begin()=0
virtual void DebugSetObjectName(const char *name)=0
virtual RHICommandList & FillBuffer(RHIBuffer *buffer, uint32_t value, size_t offset=0, size_t size=kFullSize)=0
virtual RHICommandList & WriteTimestamp(RHIDeviceQueryPool *pool, RHIPipelineStageBits stage, uint32_t queryIndex)=0
virtual RHICommandList & BeginTransition()=0
Definition Command.hpp:18
virtual RHICommandPoolScopedHandle< RHICommandList > CreateCommandList()=0
virtual void ResetAllCommandLists(bool freeResources=false)=0
const RHIDevice & mDevice
Definition Command.hpp:20
virtual void DestroyCommandList(Handle handle)=0
struct Foundation::RHI::RHICommandPool::PoolDesc mDesc
virtual void DebugSetObjectName(const char *name)=0
virtual RHICommandList * GetCommandList(Handle handle) const =0
RHICommandPool(RHIDevice const &device, PoolDesc desc)
Definition Command.hpp:30
Definition Device.hpp:164
Definition Device.hpp:16
Definition Device.hpp:189
Handle type for RHI Objects.
Definition Details.hpp:42
Base class for all RHI objects.
Definition Details.hpp:16
Definition PipelineState.hpp:22
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:86
Definition Resource.hpp:211
Definition Resource.hpp:190
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:149
std::span< T > Span
Alias for std::span
Definition Container.hpp:60
std::optional< T > Optional
Alias for std::optional
Definition Container.hpp:26
Low-level Rendering Hardware Interface (RHI) abstractions.
Definition Application.hpp:4
const uint32_t kCommandQueueTransferIgnored
Definition Command.hpp:40
glm::vec< 3, int32_t > RHIOffset3D
Definition Common.hpp:14
RHITextureLayout
Definition Common.hpp:148
uintptr_t Handle
Definition Details.hpp:8
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHIResourceFormat
Definition Common.hpp:20
static constexpr size_t kFullSize
Definition Common.hpp:8
RHICommandPoolType
Definition Common.hpp:103
size_t size
Definition Command.hpp:114
size_t dstOffset
Definition Command.hpp:109
size_t srcOffset
Definition Command.hpp:108
RHIOffset3D srcOffset
Definition Command.hpp:127
uint32_t srcBufferOffset
Definition Command.hpp:123
RHITextureSubresourceLayer dstLayer
Definition Command.hpp:128
RHITextureSubresourceLayer srcLayer
Definition Command.hpp:125
RHIExtent3D extent
Definition Command.hpp:133
RHIOffset3D dstOffset
Definition Command.hpp:129
Optional< RHIClearDepthStencil > clearDepthStencil
Definition Command.hpp:152
Optional< RHIClearColor > clearColor
Definition Command.hpp:149
RHITextureLayout imageLayout
Definition Command.hpp:147
constexpr bool IsValid() const
Definition Command.hpp:155
RHITextureView * imageView
Definition Command.hpp:146
Span< const Attachment > colorAttachments
Definition Command.hpp:157
const Attachment depthAttachment
Definition Command.hpp:158
uint32_t width
Definition Command.hpp:160
uint32_t height
Definition Command.hpp:160
const Attachment stencilAttachment
Definition Command.hpp:159
RHIDevicePipelineType type
Definition Command.hpp:72
RHIPipelineState * pipeline
Definition Command.hpp:71
RHITextureSubresourceRange srcImgRange
Definition Command.hpp:55
RHITextureLayout srcImgLayout
Definition Command.hpp:54
RHIPipelineStage srcStage
Definition Command.hpp:52
RHITextureLayout dstImgLayout
Definition Command.hpp:54
RHIResourceAccess dstAccess
Definition Command.hpp:51
RHIResourceAccess srcAccess
Definition Command.hpp:51
uint32_t srcQueueIndex
Definition Command.hpp:59
uint32_t dstQueueIndex
Definition Command.hpp:59
size_t srcBufferSize
Definition Command.hpp:57
size_t srcBufferOffset
Definition Command.hpp:57
RHIPipelineStage dstStage
Definition Command.hpp:52
RHICommandPoolType type
Definition Command.hpp:28
RHIDeviceQueue * queue
Definition Command.hpp:26
static void Destroy(RHICommandPool *pool, Handle handle)
Definition Command.hpp:199
static RHICommandList * Get(RHICommandPool const *pool, Handle handle)
Definition Command.hpp:198
Provides type traits for types derived from RHIObject.
Definition Details.hpp:30