tornavis/source/blender/gpu/vulkan/vk_command_buffer.cc

75 lines
1.8 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup gpu
*/
#include "vk_command_buffer.hh"
#include "vk_backend.hh"
namespace blender::gpu {
VKCommandBuffer::~VKCommandBuffer()
{
free();
}
void VKCommandBuffer::free()
{
if (vk_command_buffer_ != VK_NULL_HANDLE) {
VKDevice &device = VKBackend::get().device_get();
vkFreeCommandBuffers(device.device_get(), vk_command_pool_, 1, &vk_command_buffer_);
vk_command_buffer_ = VK_NULL_HANDLE;
}
vk_command_pool_ = VK_NULL_HANDLE;
}
bool VKCommandBuffer::is_initialized() const
{
return vk_command_buffer_ != VK_NULL_HANDLE;
}
void VKCommandBuffer::init(const VkCommandPool vk_command_pool,
const VkCommandBuffer vk_command_buffer)
{
if (is_initialized()) {
return;
}
vk_command_pool_ = vk_command_pool;
vk_command_buffer_ = vk_command_buffer;
state.stage = Stage::Initial;
}
void VKCommandBuffer::begin_recording()
{
if (is_in_stage(Stage::Submitted)) {
stage_transfer(Stage::Submitted, Stage::Executed);
}
if (is_in_stage(Stage::Executed)) {
vkResetCommandBuffer(vk_command_buffer_, 0);
stage_transfer(Stage::Executed, Stage::Initial);
}
VkCommandBufferBeginInfo begin_info = {};
begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
vkBeginCommandBuffer(vk_command_buffer_, &begin_info);
stage_transfer(Stage::Initial, Stage::Recording);
state.recorded_command_counts = 0;
}
void VKCommandBuffer::end_recording()
{
vkEndCommandBuffer(vk_command_buffer_);
stage_transfer(Stage::Recording, Stage::BetweenRecordingAndSubmitting);
}
void VKCommandBuffer::commands_submitted()
{
stage_transfer(Stage::BetweenRecordingAndSubmitting, Stage::Submitted);
}
} // namespace blender::gpu