1/* 2 * Copyright © 2021 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24#include "vk_command_buffer.h" 25 26#include "vk_command_pool.h" 27#include "vk_common_entrypoints.h" 28#include "vk_device.h" 29 30VkResult 31vk_command_buffer_init(struct vk_command_buffer *command_buffer, 32 struct vk_command_pool *pool, 33 VkCommandBufferLevel level) 34{ 35 memset(command_buffer, 0, sizeof(*command_buffer)); 36 vk_object_base_init(pool->base.device, &command_buffer->base, 37 VK_OBJECT_TYPE_COMMAND_BUFFER); 38 39 command_buffer->pool = pool; 40 command_buffer->level = level; 41 vk_dynamic_graphics_state_init(&command_buffer->dynamic_graphics_state); 42 vk_cmd_queue_init(&command_buffer->cmd_queue, &pool->alloc); 43 util_dynarray_init(&command_buffer->labels, NULL); 44 command_buffer->region_begin = true; 45 46 list_add(&command_buffer->pool_link, &pool->command_buffers); 47 48 return VK_SUCCESS; 49} 50 51void 52vk_command_buffer_reset(struct vk_command_buffer *command_buffer) 53{ 54 vk_dynamic_graphics_state_clear(&command_buffer->dynamic_graphics_state); 55 vk_command_buffer_reset_render_pass(command_buffer); 56 vk_cmd_queue_reset(&command_buffer->cmd_queue); 57 util_dynarray_clear(&command_buffer->labels); 58 command_buffer->region_begin = true; 59} 60 61void 62vk_command_buffer_finish(struct vk_command_buffer *command_buffer) 63{ 64 list_del(&command_buffer->pool_link); 65 vk_command_buffer_reset_render_pass(command_buffer); 66 vk_cmd_queue_finish(&command_buffer->cmd_queue); 67 util_dynarray_fini(&command_buffer->labels); 68 vk_object_base_finish(&command_buffer->base); 69} 70 71VKAPI_ATTR void VKAPI_CALL 72vk_common_CmdExecuteCommands(VkCommandBuffer commandBuffer, 73 uint32_t commandBufferCount, 74 const VkCommandBuffer *pCommandBuffers) 75{ 76 VK_FROM_HANDLE(vk_command_buffer, primary, commandBuffer); 77 const struct vk_device_dispatch_table *disp = 78 primary->base.device->command_dispatch_table; 79 80 for (uint32_t i = 0; i < commandBufferCount; i++) { 81 VK_FROM_HANDLE(vk_command_buffer, secondary, pCommandBuffers[i]); 82 83 vk_cmd_queue_execute(&secondary->cmd_queue, commandBuffer, disp); 84 } 85} 86 87VKAPI_ATTR void VKAPI_CALL 88vk_common_CmdBindVertexBuffers(VkCommandBuffer commandBuffer, 89 uint32_t firstBinding, 90 uint32_t bindingCount, 91 const VkBuffer *pBuffers, 92 const VkDeviceSize *pOffsets) 93{ 94 VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer); 95 const struct vk_device_dispatch_table *disp = 96 &cmd_buffer->base.device->dispatch_table; 97 98 disp->CmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, 99 pBuffers, pOffsets, NULL, NULL); 100} 101