1
+ #ifndef __NBL_I_GPU_COMMAND_BUFFER_H_INCLUDED__
2
+ #define __NBL_I_GPU_COMMAND_BUFFER_H_INCLUDED__
3
+
4
+ #include < irr/core/IReferenceCounted.h>
5
+ #include " IGPUBuffer.h"
6
+ #include < irr/asset/IMeshBuffer.h>
7
+ #include < irr/video/IGPUImage.h>
8
+ #include < irr/video/IGPUSampler.h>
9
+ #include " IVideoDriver.h"
10
+
11
+ #include < type_traits>
12
+
13
+ namespace irr {
14
+ namespace video
15
+ {
16
+ // TODO move and possibly rename
17
+ struct VkBufferCopy
18
+ {
19
+ size_t srcOffset;
20
+ size_t dstOffset;
21
+ size_t size;
22
+ };
23
+ struct VkImageBlit
24
+ {
25
+ asset::IImage::SSubresourceLayers srcSubresource;
26
+ asset::VkOffset3D srcOffsets[2 ];
27
+ asset::IImage::SSubresourceLayers dstSubresource;
28
+ asset::VkOffset3D dstOffsets[2 ];
29
+ };
30
+ struct VkImageResolve
31
+ {
32
+ asset::IImage::SSubresourceLayers srcSubresource;
33
+ asset::VkOffset3D srcOffset;
34
+ asset::IImage::SSubresourceLayers dstSubresource;
35
+ asset::VkOffset3D dstOffset;
36
+ asset::VkExtent3D extent;
37
+ };
38
+ struct VkOffset2D
39
+ {
40
+ int32_t x;
41
+ int32_t y;
42
+ };
43
+ struct VkExtent2D
44
+ {
45
+ uint32_t width;
46
+ uint32_t height;
47
+ };
48
+ struct VkRect2D
49
+ {
50
+ VkOffset2D offset;
51
+ VkExtent2D extent;
52
+ };
53
+ enum E_STENCIL_FACE_FLAGS : uint32_t
54
+ {
55
+ ESFF_FRONT_BIT = 0x01 ,
56
+ ESFF_BACK_BIT = 0x02 ,
57
+ ESFF_FACE_AND_FRONT = 0x03
58
+ };
59
+ enum E_PIPELINE_STAGE_FLAGS : uint32_t
60
+ {
61
+ EPSF_TOP_OF_PIPE_BIT = 0x00000001 ,
62
+ EPSF_DRAW_INDIRECT_BIT = 0x00000002 ,
63
+ EPSF_VERTEX_INPUT_BIT = 0x00000004 ,
64
+ EPSF_VERTEX_SHADER_BIT = 0x00000008 ,
65
+ EPSF_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010 ,
66
+ EPSF_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020 ,
67
+ EPSF_GEOMETRY_SHADER_BIT = 0x00000040 ,
68
+ EPSF_FRAGMENT_SHADER_BIT = 0x00000080 ,
69
+ EPSF_EARLY_FRAGMENT_TESTS_BIT = 0x00000100 ,
70
+ EPSF_LATE_FRAGMENT_TESTS_BIT = 0x00000200 ,
71
+ EPSF_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400 ,
72
+ EPSF_COMPUTE_SHADER_BIT = 0x00000800 ,
73
+ EPSF_TRANSFER_BIT = 0x00001000 ,
74
+ EPSF_BOTTOM_OF_PIPE_BIT = 0x00002000 ,
75
+ EPSF_HOST_BIT = 0x00004000 ,
76
+ EPSF_ALL_GRAPHICS_BIT = 0x00008000 ,
77
+ EPSF_ALL_COMMANDS_BIT = 0x00010000 ,
78
+ EPSF_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000 ,
79
+ EPSF_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000 ,
80
+ EPSF_RAY_TRACING_SHADER_BIT_KHR = 0x00200000 ,
81
+ EPSF_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000 ,
82
+ EPSF_SHADING_RATE_IMAGE_BIT_NV = 0x00400000 ,
83
+ EPSF_TASK_SHADER_BIT_NV = 0x00080000 ,
84
+ EPSF_MESH_SHADER_BIT_NV = 0x00100000 ,
85
+ EPSF_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000 ,
86
+ EPSF_COMMAND_PREPROCESS_BIT_NV = 0x00020000
87
+ };
88
+ enum E_DEPENDENCY_FLAGS : uint32_t
89
+ {
90
+ EDF_BY_REGION_BIT = 0x01 ,
91
+ EDF_DEVICE_GROUP_BIT = 0x04 ,
92
+ EDF_VIEW_LOCAL_BIT = 0x02
93
+ };
94
+ enum E_QUERY_CONTROL_FLAGS : uint32_t
95
+ {
96
+ EQCF_PRECISE_BIT = 0x01
97
+ };
98
+ enum E_QUERY_RESULT_FLAGS : uint32_t
99
+ {
100
+ EQRF_64_BIT = 0x01 ,
101
+ EQRF_WAIT_BIT = 0x02 ,
102
+ EQRF_WITH_AVAILABILITY_BIT = 0x04 ,
103
+ EQRF_PARTIAL_BIT = 0x08
104
+ };
105
+
106
+ class IGPUQueue ;
107
+
108
+ class IGPUCommandBuffer : public core ::IReferenceCounted
109
+ {
110
+ friend class IGPUQueue ;
111
+
112
+ public:
113
+ enum E_RESET_FLAGS : uint32_t
114
+ {
115
+ ERF_RELEASE_RESOURCES_BIT = 0x01
116
+ };
117
+
118
+ enum E_STATE : uint32_t
119
+ {
120
+ ES_INITIAL,
121
+ ES_RECORDING,
122
+ ES_EXECUTABLE,
123
+ ES_PENDING,
124
+ ES_INVALID
125
+ };
126
+
127
+ enum E_USAGE : uint32_t
128
+ {
129
+ EU_ONE_TIME_SUBMIT_BIT = 0x01 ,
130
+ EU_RENDER_PASS_CONTINUE_BIT = 0x02 ,
131
+ EU_SIMULTANEOUS_USE_BIT = 0x04
132
+ };
133
+
134
+ enum E_LEVEL : uint32_t
135
+ {
136
+ EL_PRIMARY,
137
+ EL_SECONDARY
138
+ };
139
+
140
+ IGPUCommandBuffer (uint32_t _familyIx) : m_familyIndex(_familyIx)
141
+ {
142
+
143
+ }
144
+
145
+ virtual E_LEVEL getLevel () const = 0;
146
+
147
+ uint32_t getQueueFamilyIndex () const { return m_familyIndex; }
148
+
149
+ // ! `_flags` takes bits from E_RESET_FLAGS
150
+ virtual void reset (uint32_t _flags)
151
+ {
152
+ assert (m_state!=ES_PENDING);
153
+ m_state = ES_INITIAL;
154
+ }
155
+
156
+ virtual void end ()
157
+ {
158
+ assert (m_state!=ES_PENDING);
159
+ m_state = ES_EXECUTABLE;
160
+ }
161
+
162
+ virtual void bindIndexBuffer (IGPUBuffer* buffer, size_t offset, asset::E_INDEX_TYPE indexType) = 0;
163
+ virtual void draw (uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) = 0;
164
+ virtual void drawIndexed (uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) = 0;
165
+ virtual void drawIndirect (IGPUBuffer* buffer, size_t offset, uint32_t drawCount, uint32_t stride) = 0;
166
+ virtual void drawIndexedIndirect (IGPUBuffer* buffer, size_t offset, uint32_t drawCount, uint32_t stride) = 0;
167
+
168
+ // virtual void setViewport(uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports) = 0;
169
+
170
+ virtual void setLineWidth (float lineWidth) = 0;
171
+ virtual void setDepthBias (float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) = 0;
172
+
173
+ virtual void setBlendConstants (const float blendConstants[4 ]) = 0;
174
+
175
+ virtual void copyBuffer (IGPUBuffer* srcBuffer, IGPUBuffer* dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions) = 0;
176
+ // TODO theres no E_LAYOUT enum!
177
+ // virtual void copyImage(IGPUImage* srcImage, IGPUImage::E_LAYOUT srcImageLayout, IGPUImage* dstImage, IGPUImage::E_LAYOUT dstImageLayout, uint32_t regionCount, const IGPUImage::SImageCopy* pRegions) = 0;
178
+ // virtual void copyBufferToImage(IGPUBuffer* srcBuffer, IGPUImage* dstImage, IGPUImage::E_LAYOUT dstImageLayout, uint32_t regionCount, const IGPUImage::SBufferCopy* pRegions) = 0;
179
+ // virtual void copyImageToBuffer(IGPUBuffer* srcImage, IGPUImage::E_LAYOUT srcImageLayout, IGPUBuffer* dstBuffer, uint32_t regionCount, const IGPUImage::SBufferCopy* pRegions) = 0;
180
+ // virtual void blitImage(IGPUImage* srcImage, IGPUImage::E_LAYOUT srcImageLayout, IGPUImage* dstImage, IGPUImage::E_LAYOUT dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, IGPUSampler::E_TEXTURE_FILTER filter) = 0;
181
+ // virtual void resolveImage(IGPUImage* srcImage, IGPUImage::E_LAYOUT srcImageLayout, IGPUImage* dstImage, IGPUImage::E_LAYOUT dstImageLayout, uint32_t regionCount, const VkImageResolve* pRegions) = 0;
182
+
183
+ virtual void bindVertexBuffers (uint32_t firstBinding, uint32_t bindingCount, IGPUBuffer** pBuffers, const size_t pOffsets) = 0;
184
+
185
+ virtual void setScissor (uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors) = 0;
186
+ virtual void setDepthBounds (float minDepthBounds, float maxDepthBounds) = 0;
187
+ virtual void setStencilCompareMask (E_STENCIL_FACE_FLAGS faceMask, uint32_t compareMask) = 0;
188
+ virtual void setStencilWriteMask (E_STENCIL_FACE_FLAGS faceMask, uint32_t writeMask) = 0;
189
+ virtual void setStencilReference (E_STENCIL_FACE_FLAGS faceMask, uint32_t reference) = 0;
190
+
191
+ virtual void dispatch (uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) = 0;
192
+ virtual void dispatchIndirect (IGPUBuffer* buffer, size_t offset) = 0;
193
+ virtual void dispatchBase (uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) = 0;
194
+
195
+ // virtual void setEvent(VkEvent event, VkPipelineStageFlags stageMask) = 0;
196
+ // virtual void resetEvent(VkEvent event, VkPipelineStageFlags stageMask) = 0;
197
+
198
+ // `srcStagemask`, `dstStageMask` take bits from E_PIPELINE_STAGE_FLAGS
199
+ /* virtual void waitEvents(uint32_t eventCount, const VkEvent* pEvents, std::underlying_type_t<E_PIPELINE_STAGE_FLAGS> srcStageMask, std::underlying_type_t<E_PIPELINE_STAGE_FLAGS> dstStageMask,
200
+ uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
201
+ uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
202
+ uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers
203
+ ) = 0;*/
204
+
205
+ /* virtual void pipelineBarrier(uint32_t eventCount, const VkEvent* pEvents, std::underlying_type_t<E_PIPELINE_STAGE_FLAGS> srcStageMask, std::underlying_type_t<E_PIPELINE_STAGE_FLAGS> dstStageMask,
206
+ std::underlying_type_t<E_DEPENDENCY_FLAGS> dependencyFlags,
207
+ uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
208
+ uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
209
+ uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) = 0;*/
210
+
211
+ // virtual void beginRenderPass(const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents content) = 0;
212
+ // virtual void nextSubpass(VkSubpassContents contents) = 0;
213
+ // virtual void endRenderPass() = 0;
214
+
215
+ virtual void setDeviceMask (uint32_t deviceMask) { m_deviceMask = deviceMask; }
216
+
217
+ // those two instead of bindPipeline(E_PIPELINE_BIND_POINT, pipeline)
218
+ virtual void bindGraphicsPipeline (IGPURenderpassIndependentPipeline* pipeline) = 0;
219
+ virtual void bindComputePipeline (IGPUComputePipeline* pipeline) = 0;
220
+
221
+ // virtual void resetQueryPool(IGPUQueryPool* queryPool, uint32_t firstQuery, uint32_t queryCount) = 0;
222
+ // virtual void beginQuery(IGPUQueryPool* queryPool, uint32_t entry, std::underlying_type_t<E_QUERY_CONTROL_FLAGS> flags) = 0;
223
+ // virtual void endQuery(IGPUQueryPool* queryPool, uint32_t query) = 0;
224
+ // virtual void copyQueryPoolResults(IGPUQueryPool* queryPool, uint32_t firstQuery, uint32_t queryCount, IGPUBuffer* dstBuffer, size_t dstOffset, size_t stride, std::underlying_type_t<E_QUERY_RESULT_FLAGS> flags) = 0;
225
+ // virtual void writeTimestamp(std::underlying_type_t<E_PIPELINE_STAGE_FLAGS> pipelineStage, IGPUQueryPool* queryPool, uint32_t query) = 0;
226
+
227
+ virtual void bindDescriptorSets (E_PIPELINE_BIND_POINT pipelineBindPoint, IGPUPipelineLayout* layout, uint32_t firstSet, uint32_t descriptorSetCount,
228
+ IGPUDescriptorSet** pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t pDynamicOffsets
229
+ ) = 0;
230
+ virtual void pushConstants (IGPUPipelineLayout* layout, std::underlying_type_t <IGPUSpecializedShader::E_SHADER_STAGE> stageFlags, uint32_t offset, uint32_t size, const void * pValues) = 0;
231
+
232
+ // virtual void clearColorImage(IGPUImage* image, IGPUImage::E_LAYOUT imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) = 0;
233
+ // virtual void clearDepthStencilImage(IGPUImage* image, IGPUImage::E_LAYOUT imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) = 0;
234
+ // virtual void clearAttachments(uint32_t attachmentCount, const VkClearAttachment* pAttachments, uint32_t rectCount, const VkClearRect* pRects) = 0;
235
+ virtual void fillBuffer (IGPUBuffer* dstBuffer, size_t dstOffset, size_t size, uint32_t data) = 0;
236
+ virtual void updateBuffer (IGPUBuffer* dstBuffer, size_t dstOffset, size_t dataSize, const void * pData) = 0;
237
+
238
+ protected:
239
+ // ! `_flags` takes bits from E_USAGE
240
+ virtual void begin (uint32_t _flags)
241
+ {
242
+ assert (m_state!=ES_PENDING);
243
+ assert (m_state!=ES_RECORDING);
244
+
245
+ m_state = ES_RECORDING;
246
+ m_recordingFlags = _flags;
247
+ }
248
+
249
+ void setState (E_STATE _state)
250
+ {
251
+ m_state = _state;
252
+ }
253
+
254
+ // Flags from E_USAGE
255
+ uint32_t m_recordingFlags = 0u ;
256
+ E_STATE m_state = ES_INITIAL;
257
+ const uint32_t m_familyIndex;
258
+ // future
259
+ uint32_t m_deviceMask = ~0u ;
260
+ };
261
+
262
+ }}
263
+
264
+ #endif
0 commit comments