Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backends/vulkan/runtime/api/Context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Context::Context(vkapi::Adapter* adapter, const ContextConfig& config)
querypool_(config_.query_pool_config, nullptr),
// Command buffer submission
cmd_mutex_{},
cmd_(VK_NULL_HANDLE, 0u),
cmd_(VK_NULL_HANDLE, VK_NULL_HANDLE, 0u),
submit_count_{0u},
// Memory Management
buffer_clearlist_mutex_{},
Expand Down
29 changes: 27 additions & 2 deletions backends/vulkan/runtime/vk_api/Command.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,34 @@ namespace vkapi {

CommandBuffer::CommandBuffer(
VkCommandBuffer handle,
VkSemaphore semaphore,
const VkCommandBufferUsageFlags flags)
: handle_(handle),
signal_semaphore_(semaphore),
flags_(flags),
state_(CommandBuffer::State::NEW),
bound_{} {}

CommandBuffer::CommandBuffer(CommandBuffer&& other) noexcept
: handle_(other.handle_),
signal_semaphore_(other.signal_semaphore_),
flags_(other.flags_),
state_(CommandBuffer::State::INVALID),
state_(other.state_),
bound_(other.bound_) {
other.handle_ = VK_NULL_HANDLE;
other.signal_semaphore_ = VK_NULL_HANDLE;
other.bound_.reset();
}

CommandBuffer& CommandBuffer::operator=(CommandBuffer&& other) noexcept {
handle_ = other.handle_;
signal_semaphore_ = other.signal_semaphore_;
flags_ = other.flags_;
state_ = other.state_;
bound_ = other.bound_;

other.handle_ = VK_NULL_HANDLE;
other.signal_semaphore_ = VK_NULL_HANDLE;
other.bound_.reset();
other.state_ = CommandBuffer::State::INVALID;

Expand Down Expand Up @@ -304,6 +310,12 @@ CommandPool::~CommandPool() {
if (pool_ == VK_NULL_HANDLE) {
return;
}
for (auto& semaphore : semaphores_) {
if (semaphore != VK_NULL_HANDLE) {
vkDestroySemaphore(device_, semaphore, nullptr);
}
}

vkDestroyCommandPool(device_, pool_, nullptr);
}

Expand All @@ -314,14 +326,15 @@ CommandBuffer CommandPool::get_new_cmd(bool reusable) {
allocate_new_batch(config_.cmd_pool_batch_size);

VkCommandBuffer handle = buffers_[in_use_];
VkSemaphore semaphore = semaphores_[in_use_];

VkCommandBufferUsageFlags cmd_flags = 0u;
if (!reusable) {
cmd_flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
}

in_use_++;
return CommandBuffer(handle, cmd_flags);
return CommandBuffer(handle, semaphore, cmd_flags);
}

void CommandPool::flush() {
Expand All @@ -337,6 +350,7 @@ void CommandPool::allocate_new_batch(const uint32_t count) {
}

buffers_.resize(buffers_.size() + count);
semaphores_.resize(buffers_.size() + count);

const VkCommandBufferAllocateInfo allocate_info{
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType
Expand All @@ -348,6 +362,17 @@ void CommandPool::allocate_new_batch(const uint32_t count) {

VK_CHECK(vkAllocateCommandBuffers(
device_, &allocate_info, buffers_.data() + in_use_));

const VkSemaphoreCreateInfo semaphoreCreateInfo = {
VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};

for (uint32_t i = 0; i < count; i++) {
VK_CHECK(vkCreateSemaphore(
device_,
&semaphoreCreateInfo,
nullptr,
semaphores_.data() + in_use_ + i));
}
}

} // namespace vkapi
Expand Down
14 changes: 13 additions & 1 deletion backends/vulkan/runtime/vk_api/Command.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ namespace vkapi {

class CommandBuffer final {
public:
explicit CommandBuffer(VkCommandBuffer, const VkCommandBufferUsageFlags);
explicit CommandBuffer(
VkCommandBuffer,
VkSemaphore,
const VkCommandBufferUsageFlags);

CommandBuffer(const CommandBuffer&) = delete;
CommandBuffer& operator=(const CommandBuffer&) = delete;
Expand Down Expand Up @@ -70,6 +73,8 @@ class CommandBuffer final {

private:
VkCommandBuffer handle_;
// Semaphore to signal when the command buffer has completed execution
VkSemaphore signal_semaphore_;
VkCommandBufferUsageFlags flags_;
State state_;
Bound bound_;
Expand All @@ -81,6 +86,7 @@ class CommandBuffer final {

inline void invalidate() {
handle_ = VK_NULL_HANDLE;
signal_semaphore_ = VK_NULL_HANDLE;
bound_.reset();
}

Expand All @@ -100,6 +106,10 @@ class CommandBuffer final {

VkCommandBuffer get_submit_handle(const bool final_use = false);

VkSemaphore get_signal_semaphore() const {
return signal_semaphore_;
}

inline operator bool() const {
return handle_ != VK_NULL_HANDLE;
}
Expand Down Expand Up @@ -130,6 +140,8 @@ class CommandPool final {
// New Buffers
std::mutex mutex_;
std::vector<VkCommandBuffer> buffers_;
// Semaphores corresponding to the command buffers
std::vector<VkSemaphore> semaphores_;
size_t in_use_;

public:
Expand Down
Loading