Blender V4.3
vk_command_buffer_wrapper.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10#include "vk_backend.hh"
11#include "vk_memory.hh"
12
15{
16 vk_command_pool_create_info_ = {};
17 vk_command_pool_create_info_.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18 vk_command_pool_create_info_.queueFamilyIndex = 0;
19
20 vk_command_buffer_allocate_info_ = {};
21 vk_command_buffer_allocate_info_.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22 vk_command_buffer_allocate_info_.commandPool = VK_NULL_HANDLE;
23 vk_command_buffer_allocate_info_.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
24 vk_command_buffer_allocate_info_.commandBufferCount = 1;
25
26 vk_command_buffer_begin_info_ = {};
27 vk_command_buffer_begin_info_.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
28 vk_command_buffer_begin_info_.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
29
30 vk_fence_create_info_ = {};
31 vk_fence_create_info_.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
32 vk_fence_create_info_.flags = VK_FENCE_CREATE_SIGNALED_BIT;
33
34 vk_submit_info_ = {};
35 vk_submit_info_.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
36 vk_submit_info_.waitSemaphoreCount = 0;
37 vk_submit_info_.pWaitSemaphores = nullptr;
38 vk_submit_info_.pWaitDstStageMask = nullptr;
39 vk_submit_info_.commandBufferCount = 1;
40 vk_submit_info_.pCommandBuffers = &vk_command_buffer_;
41 vk_submit_info_.signalSemaphoreCount = 0;
42 vk_submit_info_.pSignalSemaphores = nullptr;
43}
44
46{
48 VKDevice &device = VKBackend::get().device;
49
50 if (vk_command_pool_ != VK_NULL_HANDLE) {
51 vkDestroyCommandPool(device.vk_handle(), vk_command_pool_, vk_allocation_callbacks);
52 vk_command_pool_ = VK_NULL_HANDLE;
53 }
54 if (vk_fence_ != VK_NULL_HANDLE) {
55 vkDestroyFence(device.vk_handle(), vk_fence_, vk_allocation_callbacks);
56 vk_fence_ = VK_NULL_HANDLE;
57 }
58}
59
61{
63 VKDevice &device = VKBackend::get().device;
64 if (vk_command_pool_ == VK_NULL_HANDLE) {
65 vk_command_pool_create_info_.queueFamilyIndex = device.queue_family_get();
66 vkCreateCommandPool(device.vk_handle(),
67 &vk_command_pool_create_info_,
68 vk_allocation_callbacks,
69 &vk_command_pool_);
70 vk_command_buffer_allocate_info_.commandPool = vk_command_pool_;
71 vk_command_pool_create_info_.queueFamilyIndex = 0;
72 }
73 if (vk_fence_ == VK_NULL_HANDLE) {
74 vkCreateFence(device.vk_handle(), &vk_fence_create_info_, vk_allocation_callbacks, &vk_fence_);
75 }
76 BLI_assert(vk_command_buffer_ == VK_NULL_HANDLE);
77 vkAllocateCommandBuffers(
78 device.vk_handle(), &vk_command_buffer_allocate_info_, &vk_command_buffer_);
79
80 vkBeginCommandBuffer(vk_command_buffer_, &vk_command_buffer_begin_info_);
81}
82
84{
85 vkEndCommandBuffer(vk_command_buffer_);
86}
87
89{
90 if (vk_fence == VK_NULL_HANDLE) {
91 vk_fence = vk_fence_;
92 }
93 VKDevice &device = VKBackend::get().device;
94 vkResetFences(device.vk_handle(), 1, &vk_fence);
95 {
96 std::scoped_lock lock(device.queue_mutex_get());
97 vkQueueSubmit(device.queue_get(), 1, &vk_submit_info_, vk_fence);
98 }
99 vk_command_buffer_ = nullptr;
100}
101
103{
104 if (vk_fence == VK_NULL_HANDLE) {
105 vk_fence = vk_fence_;
106 }
107 VKDevice &device = VKBackend::get().device;
108 while (vkWaitForFences(device.vk_handle(), 1, &vk_fence, true, UINT64_MAX) == VK_TIMEOUT) {
109 }
110}
111
112void VKCommandBufferWrapper::bind_pipeline(VkPipelineBindPoint pipeline_bind_point,
113 VkPipeline pipeline)
114{
115 vkCmdBindPipeline(vk_command_buffer_, pipeline_bind_point, pipeline);
116}
117
118void VKCommandBufferWrapper::bind_descriptor_sets(VkPipelineBindPoint pipeline_bind_point,
119 VkPipelineLayout layout,
120 uint32_t first_set,
121 uint32_t descriptor_set_count,
122 const VkDescriptorSet *p_descriptor_sets,
123 uint32_t dynamic_offset_count,
124 const uint32_t *p_dynamic_offsets)
125{
126 vkCmdBindDescriptorSets(vk_command_buffer_,
127 pipeline_bind_point,
128 layout,
129 first_set,
130 descriptor_set_count,
131 p_descriptor_sets,
132 dynamic_offset_count,
133 p_dynamic_offsets);
134}
135
137 VkDeviceSize offset,
138 VkIndexType index_type)
139{
140 vkCmdBindIndexBuffer(vk_command_buffer_, buffer, offset, index_type);
141}
142
144 uint32_t binding_count,
145 const VkBuffer *p_buffers,
146 const VkDeviceSize *p_offsets)
147{
148 vkCmdBindVertexBuffers(vk_command_buffer_, first_binding, binding_count, p_buffers, p_offsets);
149}
150
152 uint32_t instance_count,
153 uint32_t first_vertex,
154 uint32_t first_instance)
155{
156 vkCmdDraw(vk_command_buffer_, vertex_count, instance_count, first_vertex, first_instance);
157}
158
160 uint32_t instance_count,
161 uint32_t first_index,
162 int32_t vertex_offset,
163 uint32_t first_instance)
164{
165 vkCmdDrawIndexed(
166 vk_command_buffer_, index_count, instance_count, first_index, vertex_offset, first_instance);
167}
168
170 VkDeviceSize offset,
171 uint32_t draw_count,
172 uint32_t stride)
173{
174 vkCmdDrawIndirect(vk_command_buffer_, buffer, offset, draw_count, stride);
175}
176
178 VkDeviceSize offset,
179 uint32_t draw_count,
180 uint32_t stride)
181{
182 vkCmdDrawIndexedIndirect(vk_command_buffer_, buffer, offset, draw_count, stride);
183}
184
186 uint32_t group_count_y,
187 uint32_t group_count_z)
188{
189 vkCmdDispatch(vk_command_buffer_, group_count_x, group_count_y, group_count_z);
190}
191
192void VKCommandBufferWrapper::dispatch_indirect(VkBuffer buffer, VkDeviceSize offset)
193{
194 vkCmdDispatchIndirect(vk_command_buffer_, buffer, offset);
195}
196
198 VkDeviceSize dst_offset,
199 VkDeviceSize data_size,
200 const void *p_data)
201{
202 vkCmdUpdateBuffer(vk_command_buffer_, dst_buffer, dst_offset, data_size, p_data);
203}
204
205void VKCommandBufferWrapper::copy_buffer(VkBuffer src_buffer,
206 VkBuffer dst_buffer,
207 uint32_t region_count,
208 const VkBufferCopy *p_regions)
209{
210 vkCmdCopyBuffer(vk_command_buffer_, src_buffer, dst_buffer, region_count, p_regions);
211}
212
214 VkImageLayout src_image_layout,
215 VkImage dst_image,
216 VkImageLayout dst_image_layout,
217 uint32_t region_count,
218 const VkImageCopy *p_regions)
219{
220 vkCmdCopyImage(vk_command_buffer_,
221 src_image,
222 src_image_layout,
223 dst_image,
224 dst_image_layout,
225 region_count,
226 p_regions);
227}
228
230 VkImageLayout src_image_layout,
231 VkImage dst_image,
232 VkImageLayout dst_image_layout,
233 uint32_t region_count,
234 const VkImageBlit *p_regions,
235 VkFilter filter)
236{
237 vkCmdBlitImage(vk_command_buffer_,
238 src_image,
239 src_image_layout,
240 dst_image,
241 dst_image_layout,
242 region_count,
243 p_regions,
244 filter);
245}
246
248 VkImage dst_image,
249 VkImageLayout dst_image_layout,
250 uint32_t region_count,
251 const VkBufferImageCopy *p_regions)
252{
253 vkCmdCopyBufferToImage(
254 vk_command_buffer_, src_buffer, dst_image, dst_image_layout, region_count, p_regions);
255}
256
258 VkImageLayout src_image_layout,
259 VkBuffer dst_buffer,
260 uint32_t region_count,
261 const VkBufferImageCopy *p_regions)
262{
263 vkCmdCopyImageToBuffer(
264 vk_command_buffer_, src_image, src_image_layout, dst_buffer, region_count, p_regions);
265}
266
267void VKCommandBufferWrapper::fill_buffer(VkBuffer dst_buffer,
268 VkDeviceSize dst_offset,
269 VkDeviceSize size,
270 uint32_t data)
271{
272 vkCmdFillBuffer(vk_command_buffer_, dst_buffer, dst_offset, size, data);
273}
274
276 VkImageLayout image_layout,
277 const VkClearColorValue *p_color,
278 uint32_t range_count,
279 const VkImageSubresourceRange *p_ranges)
280{
281 vkCmdClearColorImage(vk_command_buffer_, image, image_layout, p_color, range_count, p_ranges);
282}
284 VkImage image,
285 VkImageLayout image_layout,
286 const VkClearDepthStencilValue *p_depth_stencil,
287 uint32_t range_count,
288 const VkImageSubresourceRange *p_ranges)
289{
290 vkCmdClearDepthStencilImage(
291 vk_command_buffer_, image, image_layout, p_depth_stencil, range_count, p_ranges);
292}
293
295 const VkClearAttachment *p_attachments,
296 uint32_t rect_count,
297 const VkClearRect *p_rects)
298{
299 vkCmdClearAttachments(vk_command_buffer_, attachment_count, p_attachments, rect_count, p_rects);
300}
301
303 VkPipelineStageFlags src_stage_mask,
304 VkPipelineStageFlags dst_stage_mask,
305 VkDependencyFlags dependency_flags,
306 uint32_t memory_barrier_count,
307 const VkMemoryBarrier *p_memory_barriers,
308 uint32_t buffer_memory_barrier_count,
309 const VkBufferMemoryBarrier *p_buffer_memory_barriers,
310 uint32_t image_memory_barrier_count,
311 const VkImageMemoryBarrier *p_image_memory_barriers)
312{
313 vkCmdPipelineBarrier(vk_command_buffer_,
314 src_stage_mask,
315 dst_stage_mask,
316 dependency_flags,
317 memory_barrier_count,
318 p_memory_barriers,
319 buffer_memory_barrier_count,
320 p_buffer_memory_barriers,
321 image_memory_barrier_count,
322 p_image_memory_barriers);
323}
324
325void VKCommandBufferWrapper::push_constants(VkPipelineLayout layout,
326 VkShaderStageFlags stage_flags,
327 uint32_t offset,
328 uint32_t size,
329 const void *p_values)
330{
331 vkCmdPushConstants(vk_command_buffer_, layout, stage_flags, offset, size, p_values);
332}
333
334void VKCommandBufferWrapper::begin_rendering(const VkRenderingInfo *p_rendering_info)
335{
336 const VKDevice &device = VKBackend::get().device;
338 device.functions.vkCmdBeginRendering(vk_command_buffer_, p_rendering_info);
339}
340
342{
343 const VKDevice &device = VKBackend::get().device;
345 device.functions.vkCmdEndRendering(vk_command_buffer_);
346}
347
348void VKCommandBufferWrapper::begin_query(VkQueryPool vk_query_pool,
349 uint32_t query_index,
350 VkQueryControlFlags vk_query_control_flags)
351{
352 vkCmdBeginQuery(vk_command_buffer_, vk_query_pool, query_index, vk_query_control_flags);
353}
354
355void VKCommandBufferWrapper::end_query(VkQueryPool vk_query_pool, uint32_t query_index)
356{
357 vkCmdEndQuery(vk_command_buffer_, vk_query_pool, query_index);
358}
359
360void VKCommandBufferWrapper::reset_query_pool(VkQueryPool vk_query_pool,
361 uint32_t first_query,
362 uint32_t query_count)
363{
364 vkCmdResetQueryPool(vk_command_buffer_, vk_query_pool, first_query, query_count);
365}
366
368 const VkDebugUtilsLabelEXT *vk_debug_utils_label)
369{
370 const VKDevice &device = VKBackend::get().device;
372 device.functions.vkCmdBeginDebugUtilsLabel(vk_command_buffer_, vk_debug_utils_label);
373 }
374}
375
377{
378 const VKDevice &device = VKBackend::get().device;
380 device.functions.vkCmdEndDebugUtilsLabel(vk_command_buffer_);
381 }
382}
383
384} // namespace blender::gpu::render_graph
#define BLI_assert(a)
Definition BLI_assert.h:50
volatile int lock
static VKBackend & get()
Definition vk_backend.hh:92
VkQueue queue_get() const
Definition vk_device.hh:229
VkDevice vk_handle() const
Definition vk_device.hh:224
std::mutex & queue_mutex_get()
Definition vk_device.hh:233
const uint32_t queue_family_get() const
Definition vk_device.hh:238
PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabel
Definition vk_device.hh:188
PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabel
Definition vk_device.hh:187
PFN_vkCmdBeginRendering vkCmdBeginRendering
Definition vk_device.hh:183
struct blender::gpu::VKDevice::@670 functions
PFN_vkCmdEndRendering vkCmdEndRendering
Definition vk_device.hh:184
void begin_debug_utils_label(const VkDebugUtilsLabelEXT *vk_debug_utils_label) override
void bind_descriptor_sets(VkPipelineBindPoint pipeline_bind_point, VkPipelineLayout layout, uint32_t first_set, uint32_t descriptor_set_count, const VkDescriptorSet *p_descriptor_sets, uint32_t dynamic_offset_count, const uint32_t *p_dynamic_offsets) override
void clear_attachments(uint32_t attachment_count, const VkClearAttachment *p_attachments, uint32_t rect_count, const VkClearRect *p_rects) override
void clear_depth_stencil_image(VkImage image, VkImageLayout image_layout, const VkClearDepthStencilValue *p_depth_stencil, uint32_t range_count, const VkImageSubresourceRange *p_ranges) override
void draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance) override
void fill_buffer(VkBuffer dst_buffer, VkDeviceSize dst_offset, VkDeviceSize size, uint32_t data) override
void copy_image_to_buffer(VkImage src_image, VkImageLayout src_image_layout, VkBuffer dst_buffer, uint32_t region_count, const VkBufferImageCopy *p_regions) override
void bind_pipeline(VkPipelineBindPoint pipeline_bind_point, VkPipeline pipeline) override
void begin_query(VkQueryPool vk_query_pool, uint32_t query_index, VkQueryControlFlags vk_query_control_flags) override
void draw_indirect(VkBuffer buffer, VkDeviceSize offset, uint32_t draw_count, uint32_t stride) override
void dispatch_indirect(VkBuffer buffer, VkDeviceSize offset) override
void pipeline_barrier(VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask, VkDependencyFlags dependency_flags, uint32_t memory_barrier_count, const VkMemoryBarrier *p_memory_barriers, uint32_t buffer_memory_barrier_count, const VkBufferMemoryBarrier *p_buffer_memory_barriers, uint32_t image_memory_barrier_count, const VkImageMemoryBarrier *p_image_memory_barriers) override
void clear_color_image(VkImage image, VkImageLayout image_layout, const VkClearColorValue *p_color, uint32_t range_count, const VkImageSubresourceRange *p_ranges) override
void copy_buffer_to_image(VkBuffer src_buffer, VkImage dst_image, VkImageLayout dst_image_layout, uint32_t region_count, const VkBufferImageCopy *p_regions) override
void draw_indexed_indirect(VkBuffer buffer, VkDeviceSize offset, uint32_t draw_count, uint32_t stride) override
void begin_rendering(const VkRenderingInfo *p_rendering_info) override
void draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance) override
void copy_image(VkImage src_image, VkImageLayout src_image_layout, VkImage dst_image, VkImageLayout dst_image_layout, uint32_t region_count, const VkImageCopy *p_regions) override
void update_buffer(VkBuffer dst_buffer, VkDeviceSize dst_offset, VkDeviceSize data_size, const void *p_data) override
void push_constants(VkPipelineLayout layout, VkShaderStageFlags stage_flags, uint32_t offset, uint32_t size, const void *p_values) override
void end_query(VkQueryPool vk_query_pool, uint32_t query_index) override
void copy_buffer(VkBuffer src_buffer, VkBuffer dst_buffer, uint32_t region_count, const VkBufferCopy *p_regions) override
void reset_query_pool(VkQueryPool, uint32_t first_query, uint32_t query_count) override
void blit_image(VkImage src_image, VkImageLayout src_image_layout, VkImage dst_image, VkImageLayout dst_image_layout, uint32_t region_count, const VkImageBlit *p_regions, VkFilter filter) override
void dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z) override
void bind_index_buffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType index_type) override
void bind_vertex_buffers(uint32_t first_binding, uint32_t binding_count, const VkBuffer *p_buffers, const VkDeviceSize *p_offsets) override
#define UINT64_MAX
Definition stdint.h:143
unsigned int uint32_t
Definition stdint.h:80
signed int int32_t
Definition stdint.h:77
#define VK_ALLOCATION_CALLBACKS
Definition vk_memory.hh:58