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 PipelineStage : uint8_t {
17 TopOfPipe,
18 FragmentShader,
19 ComputeShader,
20 ColorAttachmentOutput,
21 BottomOfPipe,
22 };
23
24 enum class AccessFlags : uint8_t {
25 None = 0,
26 Read = 1 << 0,
27 Write = 1 << 1,
28 };
29
30 enum class ImageLayout : uint8_t {
31 Undefined,
32 General,
33 ColorAttachment,
34 DepthStencilAttachment,
35 ShaderReadOnly,
36 TransferSrc,
37 TransferDst,
38 Present,
39 };
40
41 struct ImageBarrier {
42 GraphicsAPI::Image* image;
43 ImageLayout oldLayout;
44 ImageLayout newLayout;
45 PipelineStage srcStage;
46 PipelineStage dstStage;
47 AccessFlags srcAccess;
48 AccessFlags dstAccess;
49 uint32_t baseMipLevel = 0;
50 uint32_t levelCount = 0;
51 uint32_t baseArrayLayer = 0;
52 uint32_t layerCount = 0;
53 };
54
60 public:
61 virtual ~CommandBuffer() {};
62
63 virtual void BeginCommandBuffer() = 0;
64 virtual void BindRenderPass(
65 RenderPass* renderPass,
66 Framebuffer* framebuffer,
67 uint32_t width,
68 uint32_t height,
69 ClearColorValue* colorClearValues,
70 uint32_t colorClearCount,
71 ClearDepthStencil depthStencilClearValue
72 ) = 0;
73 virtual void UnbindRenderPass() = 0;
74 virtual void BeginDebugLabelSection(const char* name, float color[4] = nullptr) = 0;
75 virtual void EndDebugLabelSection() = 0;
76 virtual void BindGraphicsDescriptorSet(
77 const GraphicsPipeline* graphicsPipeline,
78 const DescriptorSet* const* descriptorSets,
79 uint32_t descriptorSetOffset,
80 uint32_t descriptorSetCount
81 ) = 0;
82 virtual void BindComputeDescriptorSet(
83 const ComputePipeline* graphicsPipeline,
84 const DescriptorSet* const* descriptorSets,
85 uint32_t descriptorSetOffset,
86 uint32_t descriptorSetCount
87 ) = 0;
88 virtual void BindCommandBuffers(CommandBuffer** commandBuffers, uint32_t commandBuffersCount) = 0;
89 virtual void SetViewport(float offsetX, float offsetY, float width, float height, float depthMin = 0.0f, float depthMax = 1.0f) = 0;
90 virtual void SetScissor(int32_t offsetX, int32_t offsetY, uint32_t width, uint32_t height) = 0;
91 virtual void SetDepthBias(float biasConstantFactor, float biasSlopeFactor) = 0;
92 virtual void BindGraphicsPipeline(const GraphicsPipeline* pipeline) = 0;
93 virtual void BindComputePipeline(const ComputePipeline* pipeline) = 0;
94 virtual void BindVertexArrayObject(const VertexArrayObject* vertexArrayObject) = 0;
95 virtual void BindVertexBuffers(const Buffer* const * vb, uint32_t count) = 0;
96 virtual void BindIndexBuffer(Buffer* indexBuffer) = 0;
97 virtual void DrawVertices(uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount, int32_t vertexOffset) = 0;
98 virtual void DrawIndices(uint32_t firstIndex, uint32_t indexCount, uint32_t firstInstance, uint32_t instanceCount, int32_t vertexOffset) = 0;
99 virtual void DispatchCompute(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) = 0;
100 virtual void BlitImage(Image* src, Image* dst) = 0;
101
102 virtual void WaitForComputeMemoryBarrier(Image* renderTarget, bool shouldMakeWritable) = 0;
103 virtual void PipelineBarrier(const GraphicsAPI::ImageBarrier* barriers, uint32_t barrierCount) = 0;
104
105 virtual void EndCommandBuffer() = 0;
106
108 bool isSecondary = false;
109 Framebuffer *framebuffer = nullptr;
110 RenderPass *renderPass = nullptr;
111 };
112
113 struct CreateInfo {
114 const char* debugName = nullptr;
115 CommandBufferSecondaryInfo secondaryInfo{};
116 };
117 };
118}
119
120inline Grindstone::GraphicsAPI::AccessFlags operator|(Grindstone::GraphicsAPI::AccessFlags a, Grindstone::GraphicsAPI::AccessFlags b) {
121 return static_cast<Grindstone::GraphicsAPI::AccessFlags>(static_cast<uint8_t>(a) | static_cast<uint8_t>(b));
122}
123
124inline Grindstone::GraphicsAPI::AccessFlags operator&(Grindstone::GraphicsAPI::AccessFlags a, Grindstone::GraphicsAPI::AccessFlags b) {
125 return static_cast<Grindstone::GraphicsAPI::AccessFlags>(static_cast<uint8_t>(a) & static_cast<uint8_t>(b));
126}
Definition Buffer.hpp:56
Definition CommandBuffer.hpp:59
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 RenderPass.hpp:18
Definition CommandBuffer.hpp:41