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;
17 class DepthStencilTarget;
18
19 enum class AccessFlags : uint32_t {
20 None = 0,
21 IndirectCommandRead = 0x00000001,
22 IndexRead = 0x00000002,
23 VertexAttributeRead = 0x00000004,
24 UNIFORMRead = 0x00000008,
25 InputAttachmentRead = 0x00000010,
26 ShaderRead = 0x00000020,
27 ShaderWrite = 0x00000040,
28 ColorAttachmentRead = 0x00000080,
29 ColorAttachmentWrite = 0x00000100,
30 DepthStencilAttachmentRead = 0x00000200,
31 DepthStencilAttachmentWrite = 0x00000400,
32 TransferRead = 0x00000800,
33 TransferWrite = 0x00001000,
34 HostRead = 0x00002000,
35 HostWrite = 0x00004000,
36 MemoryRead = 0x00008000,
37 MemoryWrite = 0x00010000,
38 TransformFeedbackWrite = 0x02000000,
39 TransformFeedbackCounterRead = 0x04000000,
40 TransformFeedbackCounterWrite = 0x08000000,
41 ConditionalRenderingRead = 0x00100000,
42 ColorAttachmentReadNoncoherent = 0x00080000,
43 AccelerationStructureRead = 0x00200000,
44 AccelerationStructureWrite = 0x00400000,
45 FragmentDensityMapRead = 0x01000000,
46 FragmentShadingRateAttachmentRead = 0x00800000,
47 CommandPreprocessRead = 0x00020000,
48 CommandPreprocessWrite = 0x00040000
49 };
50
51 struct ImageBarrier {
52 Grindstone::GraphicsAPI::Image* image = nullptr;
53 Grindstone::GraphicsAPI::ImageLayout oldLayout;
54 Grindstone::GraphicsAPI::ImageLayout newLayout;
55 Grindstone::GraphicsAPI::AccessFlags srcAccess;
56 Grindstone::GraphicsAPI::AccessFlags dstAccess;
57 Grindstone::GraphicsAPI::ImageAspectBits imageAspect;
58 uint32_t baseMipLevel = 0;
59 uint32_t levelCount = 0;
60 uint32_t baseArrayLayer = 0;
61 uint32_t layerCount = 0;
62 };
63
65 Grindstone::GraphicsAPI::Buffer* buffer = nullptr;
66 Grindstone::GraphicsAPI::AccessFlags srcAccess;
67 Grindstone::GraphicsAPI::AccessFlags dstAccess;
68 uint32_t offset = 0;
69 uint32_t size = 0;
70 };
71
73 uint32_t srcOffset = 0;
74 uint32_t dstOffset = 0;
75 uint32_t size = 0;
76 };
77
79 Grindstone::GraphicsAPI::Image* image = nullptr;
80 Grindstone::GraphicsAPI::ImageLayout imageLayout;
81 Grindstone::GraphicsAPI::LoadOp loadOp = Grindstone::GraphicsAPI::LoadOp::Clear;
82 Grindstone::GraphicsAPI::StoreOp storeOp = Grindstone::GraphicsAPI::StoreOp::Store;
84 };
85
91 public:
92 virtual ~CommandBuffer() {};
93
94 virtual void BeginCommandBuffer() = 0;
95 virtual void BindRenderPass(
96 RenderPass* renderPass,
97 Framebuffer* framebuffer,
99 ClearColor* colorClearValues,
100 uint32_t colorClearCount,
101 ClearDepthStencil depthStencilClearValue
102 ) = 0;
103 virtual void UnbindRenderPass() = 0;
104 virtual void BeginRendering(
105 const char* name,
107 RenderAttachment* colorAttachments,
108 uint32_t colorAttachmentCount,
109 RenderAttachment* depthAttachment = nullptr,
110 RenderAttachment* stencilAttachment = nullptr,
111 float* debugColor = nullptr
112 ) = 0;
113 virtual void EndRendering() = 0;
114 virtual void BeginDebugLabelSection(const char* name, float color[4] = nullptr) = 0;
115 virtual void EndDebugLabelSection() = 0;
116 virtual void BindGraphicsDescriptorSet(
117 const GraphicsPipeline* graphicsPipeline,
118 const DescriptorSet* const* descriptorSets,
119 uint32_t descriptorSetOffset,
120 uint32_t descriptorSetCount
121 ) = 0;
122 virtual void BindComputeDescriptorSet(
123 const ComputePipeline* graphicsPipeline,
124 const DescriptorSet* const* descriptorSets,
125 uint32_t descriptorSetOffset,
126 uint32_t descriptorSetCount
127 ) = 0;
128
129 virtual void CopyBufferRegions(GraphicsAPI::Buffer* srcBuffer, GraphicsAPI::Buffer* dstBuffer, BufferCopyRegion* regions, uint32_t regionCount) = 0;
130 virtual void CopyBufferRegion(GraphicsAPI::Buffer* srcBuffer, GraphicsAPI::Buffer* dstBuffer, uint64_t size = 0, uint32_t srcOffset = 0, uint32_t dstOffset = 0) = 0;
131
132 virtual void BindCommandBuffers(CommandBuffer** commandBuffers, uint32_t commandBuffersCount) = 0;
133 virtual void SetViewport(float offsetX, float offsetY, float width, float height, float depthMin = 0.0f, float depthMax = 1.0f) = 0;
134 virtual void SetScissor(int32_t offsetX, int32_t offsetY, uint32_t width, uint32_t height) = 0;
135 virtual void SetDepthBias(float biasConstantFactor, float biasSlopeFactor) = 0;
136 virtual void BindGraphicsPipeline(const GraphicsPipeline* pipeline) = 0;
137 virtual void BindComputePipeline(const ComputePipeline* pipeline) = 0;
138 virtual void BindVertexArrayObject(const VertexArrayObject* vertexArrayObject) = 0;
139 virtual void BindVertexBuffers(const Buffer* const * vb, uint32_t count) = 0;
140 virtual void BindIndexBuffer(Buffer* indexBuffer) = 0;
141 virtual void DrawVertices(uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount, int32_t vertexOffset) = 0;
142 virtual void DrawIndices(uint32_t firstIndex, uint32_t indexCount, uint32_t firstInstance, uint32_t instanceCount, int32_t vertexOffset) = 0;
143 virtual void DispatchCompute(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) = 0;
144 virtual void BlitImage(
145 Image* src, Image* dst,
146 Grindstone::GraphicsAPI::ImageLayout oldLayout,
147 Grindstone::GraphicsAPI::ImageLayout newLayout,
148 uint32_t width, uint32_t height, uint32_t depth
149 ) = 0;
150
151 virtual void PipelineBarrier(
152 GraphicsAPI::PipelineStageBit srcPipelineStageMask, GraphicsAPI::PipelineStageBit dstPipelineStageMask,
153 const GraphicsAPI::BufferBarrier* bufferBarriers, uint32_t bufferBarrierCount,
154 const GraphicsAPI::ImageBarrier* imageBarriers, uint32_t imageBarrierCount
155 ) = 0;
156
157 virtual void EndCommandBuffer() = 0;
158
160 bool isSecondary = false;
161 Framebuffer *framebuffer = nullptr;
162 RenderPass *renderPass = nullptr;
163 };
164
165 struct CreateInfo {
166 const char* debugName = nullptr;
167 CommandBufferSecondaryInfo secondaryInfo{};
168 };
169 };
170}
171
172inline Grindstone::GraphicsAPI::AccessFlags operator|(Grindstone::GraphicsAPI::AccessFlags a, Grindstone::GraphicsAPI::AccessFlags b) {
173 return static_cast<Grindstone::GraphicsAPI::AccessFlags>(static_cast<uint8_t>(a) | static_cast<uint8_t>(b));
174}
175
176inline Grindstone::GraphicsAPI::AccessFlags operator&(Grindstone::GraphicsAPI::AccessFlags a, Grindstone::GraphicsAPI::AccessFlags b) {
177 return static_cast<Grindstone::GraphicsAPI::AccessFlags>(static_cast<uint8_t>(a) & static_cast<uint8_t>(b));
178}
Definition Buffer.hpp:49
Definition CommandBuffer.hpp:90
Definition ComputePipeline.hpp:18
Definition DescriptorSet.hpp:15
Definition Framebuffer.hpp:16
Definition GraphicsPipeline.hpp:19
Definition Image.hpp:49
Definition RenderPass.hpp:10
Definition VertexArrayObject.hpp:9
Definition CommandBuffer.hpp:64
Definition CommandBuffer.hpp:72
Definition CommandBuffer.hpp:51
Definition CommandBuffer.hpp:78
Definition Rect.hpp:33
Definition Formats.hpp:12
Definition Formats.hpp:46