/* * Copyright © 2025 Lucas Francisco Fryzek * SPDX-License-Identifier: MIT */ #include "fgvk_cmd_buffer.h" #include "fgvk_cmd_pool.h" static VkResult fgvk_create_cmd_buffer(struct vk_command_pool *vk_pool, VkCommandBufferLevel level, struct vk_command_buffer **cmd_buffer_out) { struct fgvk_cmd_pool *pool = container_of(vk_pool, struct fgvk_cmd_pool, vk); struct fgvk_device *dev = fgvk_cmd_pool_device(pool); struct fgvk_cmd_buffer *cmd; VkResult result; cmd = vk_zalloc(&pool->vk.alloc, sizeof(*cmd), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (cmd == NULL) return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); result = vk_command_buffer_init(&pool->vk, &cmd->vk, &fgvk_cmd_buffer_ops, level); if (result != VK_SUCCESS) { vk_free(&pool->vk.alloc, cmd); return result; } cmd->vk.dynamic_graphics_state.vi = &cmd->state.gfx._dynamic_vi; cmd->vk.dynamic_graphics_state.ms.sample_locations = &cmd->state.gfx._dynamic_sl; *cmd_buffer_out = &cmd->vk; return VK_SUCCESS; } static void fgvk_reset_cmd_buffer(struct vk_command_buffer *vk_cmd_buffer, UNUSED VkCommandBufferResetFlags flags) { struct fgvk_cmd_buffer *cmd = container_of(vk_cmd_buffer, struct fgvk_cmd_buffer, vk); vk_command_buffer_reset(&cmd->vk); } static void fgvk_destroy_cmd_buffer(struct vk_command_buffer *vk_cmd_buffer) { struct fgvk_cmd_buffer *cmd = container_of(vk_cmd_buffer, struct fgvk_cmd_buffer, vk); struct fgvk_cmd_pool *pool = fgvk_cmd_buffer_pool(cmd); vk_command_buffer_finish(&cmd->vk); vk_free(&pool->vk.alloc, cmd); } const struct vk_command_buffer_ops fgvk_cmd_buffer_ops = { .create = fgvk_create_cmd_buffer, .reset = fgvk_reset_cmd_buffer, .destroy = fgvk_destroy_cmd_buffer, }; void fgvk_cmd_bind_shaders(struct vk_command_buffer *vk_cmd, uint32_t stage_count, const mesa_shader_stage *stages, struct vk_shader ** const shaders) { //UNREACHABLE("TODO"); } VKAPI_ATTR VkResult VKAPI_CALL fgvk_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) { return VK_SUCCESS; } VKAPI_ATTR VkResult VKAPI_CALL fgvk_EndCommandBuffer(VkCommandBuffer commandBuffer) { return VK_SUCCESS; } VKAPI_ATTR void VKAPI_CALL fgvk_CmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) { }