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