Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
CommandBuffer.hpp
1#pragma once
2
3#include <vector>
4
5#include <Common/Rect.hpp>
6
7#include "Framebuffer.hpp"
8
9namespace Grindstone::GraphicsAPI {
10 class Buffer;
11 class RenderPass;
12 class Framebuffer;
13 class DescriptorSet;
14 class GraphicsPipeline;
15 class ComputePipeline;
16 class PipelineLayout;
18 class DepthStencilTarget;
19
20 enum class AccessFlags : uint32_t {
21 None = 0,
22 IndirectCommandRead = 0x00000001,
23 IndexRead = 0x00000002,
24 VertexAttributeRead = 0x00000004,
25 UniformRead = 0x00000008,
26 InputAttachmentRead = 0x00000010,
27 ShaderRead = 0x00000020,
28 ShaderWrite = 0x00000040,
29 ColorAttachmentRead = 0x00000080,
30 ColorAttachmentWrite = 0x00000100,
31 DepthStencilAttachmentRead = 0x00000200,
32 DepthStencilAttachmentWrite = 0x00000400,
33 TransferRead = 0x00000800,
34 TransferWrite = 0x00001000,
35 HostRead = 0x00002000,
36 HostWrite = 0x00004000,
37 MemoryRead = 0x00008000,
38 MemoryWrite = 0x00010000,
39 TransformFeedbackWrite = 0x02000000,
40 TransformFeedbackCounterRead = 0x04000000,
41 TransformFeedbackCounterWrite = 0x08000000,
42 ConditionalRenderingRead = 0x00100000,
43 ColorAttachmentReadNoncoherent = 0x00080000,
44 AccelerationStructureRead = 0x00200000,
45 AccelerationStructureWrite = 0x00400000,
46 FragmentDensityMapRead = 0x01000000,
47 FragmentShadingRateAttachmentRead = 0x00800000,
48 CommandPreprocessRead = 0x00020000,
49 CommandPreprocessWrite = 0x00040000
50 };
51
52 struct ImageBarrier {
53 Grindstone::GraphicsAPI::Image* image = nullptr;
54 Grindstone::GraphicsAPI::PipelineStageBit srcStageMask;
55 Grindstone::GraphicsAPI::PipelineStageBit dstStageMask;
56 Grindstone::GraphicsAPI::ImageLayout oldLayout;
57 Grindstone::GraphicsAPI::ImageLayout newLayout;
58 Grindstone::GraphicsAPI::AccessFlags srcAccess;
59 Grindstone::GraphicsAPI::AccessFlags dstAccess;
60 Grindstone::GraphicsAPI::ImageAspectBits imageAspect;
61 uint32_t baseMipLevel = 0;
62 uint32_t levelCount = 0;
63 uint32_t baseArrayLayer = 0;
64 uint32_t layerCount = 0;
65 };
66
68 Grindstone::GraphicsAPI::Buffer* buffer = nullptr;
69 Grindstone::GraphicsAPI::PipelineStageBit srcStageMask;
70 Grindstone::GraphicsAPI::PipelineStageBit dstStageMask;
71 Grindstone::GraphicsAPI::AccessFlags srcAccess;
72 Grindstone::GraphicsAPI::AccessFlags dstAccess;
73 uint32_t offset = 0;
74 uint32_t size = 0;
75 };
76
78 uint32_t srcOffset = 0;
79 uint32_t dstOffset = 0;
80 uint32_t size = 0;
81 };
82
84 Grindstone::GraphicsAPI::Image* image = nullptr;
85 Grindstone::GraphicsAPI::ImageLayout imageLayout;
86 Grindstone::GraphicsAPI::LoadOp loadOp = Grindstone::GraphicsAPI::LoadOp::Clear;
87 Grindstone::GraphicsAPI::StoreOp storeOp = Grindstone::GraphicsAPI::StoreOp::Store;
89 };
90
92 // What aspects of the image to clear.
93 Grindstone::GraphicsAPI::ImageAspectBits aspectMask;
94 // Index into the bound color attachments, or unused if aspectMask isn't Color.
95 uint32_t colorAttachmentIndex;
97 };
98
99 struct ClearRect {
101 uint32_t baseArrayLayer;
102 uint32_t layerCount;
103 };
104
110 public:
111 virtual ~CommandBuffer() {};
112
113 virtual void BeginCommandBuffer() = 0;
114 virtual void BindRenderPass(
115 RenderPass* renderPass,
116 Framebuffer* framebuffer,
118 ClearColor* colorClearValues,
119 uint32_t colorClearCount,
120 ClearDepthStencil depthStencilClearValue
121 ) = 0;
122 virtual void UnbindRenderPass() = 0;
123 virtual void BeginRendering(
124 const char* name,
126 RenderAttachment* colorAttachments,
127 uint32_t colorAttachmentCount,
128 RenderAttachment* depthAttachment = nullptr,
129 RenderAttachment* stencilAttachment = nullptr,
130 float* debugColor = nullptr
131 ) = 0;
132 virtual void EndRendering() = 0;
133 virtual void BeginDebugLabelSection(const char* name, float color[4] = nullptr) = 0;
134 virtual void EndDebugLabelSection() = 0;
135 virtual void BindGraphicsDescriptorSet(
136 const GraphicsAPI::PipelineLayout* pipelineLayout,
137 const DescriptorSet* const* descriptorSets,
138 uint32_t descriptorSetOffset,
139 uint32_t descriptorSetCount
140 ) = 0;
141 virtual void BindComputeDescriptorSet(
142 const GraphicsAPI::PipelineLayout* pipelineLayout,
143 const DescriptorSet* const* descriptorSets,
144 uint32_t descriptorSetOffset,
145 uint32_t descriptorSetCount
146 ) = 0;
147 virtual void ClearAttachments(ClearAttachment* attachments, uint32_t attachmentCount, ClearRect* rects, uint32_t rectCount) = 0;
148 virtual void CopyBufferRegions(GraphicsAPI::Buffer* srcBuffer, GraphicsAPI::Buffer* dstBuffer, BufferCopyRegion* regions, uint32_t regionCount) = 0;
149 virtual void CopyBufferRegion(GraphicsAPI::Buffer* srcBuffer, GraphicsAPI::Buffer* dstBuffer, uint64_t size = 0, uint32_t srcOffset = 0, uint32_t dstOffset = 0) = 0;
150
151 virtual void BindCommandBuffers(CommandBuffer** commandBuffers, uint32_t commandBuffersCount) = 0;
152 virtual void SetViewport(float offsetX, float offsetY, float width, float height, float depthMin = 0.0f, float depthMax = 1.0f) = 0;
153 virtual void SetScissor(int32_t offsetX, int32_t offsetY, uint32_t width, uint32_t height) = 0;
154 virtual void SetDepthBias(float biasConstantFactor, float biasSlopeFactor) = 0;
155 virtual void BindGraphicsPipeline(const GraphicsPipeline* pipeline) = 0;
156 virtual void BindComputePipeline(const ComputePipeline* pipeline) = 0;
157 virtual void BindVertexArrayObject(const VertexArrayObject* vertexArrayObject) = 0;
158 virtual void BindVertexBuffers(const Buffer* const * vb, uint32_t count) = 0;
159 virtual void BindIndexBuffer(Buffer* indexBuffer) = 0;
160 virtual void DrawVertices(uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount, int32_t vertexOffset) = 0;
161 virtual void DrawIndices(uint32_t firstIndex, uint32_t indexCount, uint32_t firstInstance, uint32_t instanceCount, int32_t vertexOffset) = 0;
162 virtual void DispatchCompute(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) = 0;
163 virtual void BlitImage(
166 Grindstone::GraphicsAPI::ImageLayout oldLayout,
167 Grindstone::GraphicsAPI::ImageLayout newLayout,
168 Grindstone::GraphicsAPI::TextureFilter filter,
171 ) = 0;
172
173 virtual void PipelineBarrier(
174 const GraphicsAPI::BufferBarrier* bufferBarriers, uint32_t bufferBarrierCount,
175 const GraphicsAPI::ImageBarrier* imageBarriers, uint32_t imageBarrierCount
176 ) = 0;
177
178 virtual void EndCommandBuffer() = 0;
179
181 bool isSecondary = false;
182 Framebuffer *framebuffer = nullptr;
183 RenderPass *renderPass = nullptr;
184 };
185
186 struct CreateInfo {
187 const char* debugName = nullptr;
188 CommandBufferSecondaryInfo secondaryInfo{};
189 };
190 };
191}
192
193GS_ENUM_FLAGS_FUNCS(Grindstone::GraphicsAPI::AccessFlags)
Definition Buffer.hpp:49
Definition CommandBuffer.hpp:109
Definition ComputePipeline.hpp:19
Definition DescriptorSet.hpp:15
Definition Framebuffer.hpp:16
Definition GraphicsPipeline.hpp:20
Definition Image.hpp:49
Definition PipelineLayout.hpp:18
Definition RenderPass.hpp:10
Definition VertexArrayObject.hpp:9
Definition CommandBuffer.hpp:67
Definition CommandBuffer.hpp:77
Definition CommandBuffer.hpp:91
Definition CommandBuffer.hpp:99
Definition CommandBuffer.hpp:52
Definition CommandBuffer.hpp:83
Definition Rect.hpp:77
Definition Rect.hpp:33
Definition Formats.hpp:14
Definition Formats.hpp:48