From ab5126fb6b2245cf3f1e54e2c3c164e081ec9c53 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 7 Oct 2022 21:32:43 +0300 Subject: [PATCH] Pass frame number to TransferQueue from the outside It can't reliably track it by itself since transfers may be dispatched multiple times per frame. --- source/backends/vulkan/commands_backend.cpp | 7 ++++--- source/backends/vulkan/commands_backend.h | 1 + source/backends/vulkan/transferqueue.cpp | 3 +-- source/backends/vulkan/transferqueue.h | 3 +-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/source/backends/vulkan/commands_backend.cpp b/source/backends/vulkan/commands_backend.cpp index 4791122f..7f56c984 100644 --- a/source/backends/vulkan/commands_backend.cpp +++ b/source/backends/vulkan/commands_backend.cpp @@ -115,7 +115,7 @@ void VulkanCommands::end_render_pass() vk.EndCommandBuffer(pass_buffer); - device.get_transfer_queue().dispatch_transfers(vkCmd); + device.get_transfer_queue().dispatch_transfers(vkCmd, frame_number); Synchronizer &sync = device.get_synchronizer(); sync.reset(); @@ -133,11 +133,12 @@ void VulkanCommands::end_render_pass() pass_buffer = 0; } -void VulkanCommands::begin_frame(unsigned index) +void VulkanCommands::begin_frame(unsigned fnum) { const VulkanFunctions &vk = device.get_functions(); - frame_index = index%device.get_n_frames_in_flight(); + frame_number = fnum; + frame_index = fnum%device.get_n_frames_in_flight(); if(frame_index>=command_pools.size()) { command_pools.reserve(frame_index+1); diff --git a/source/backends/vulkan/commands_backend.h b/source/backends/vulkan/commands_backend.h index feb7d077..e17636a8 100644 --- a/source/backends/vulkan/commands_backend.h +++ b/source/backends/vulkan/commands_backend.h @@ -43,6 +43,7 @@ protected: Device &device; std::vector command_pools; + unsigned frame_number = 0; unsigned frame_index = 0; VkCommandBuffer primary_buffer = 0; VkCommandBuffer pass_buffer = 0; diff --git a/source/backends/vulkan/transferqueue.cpp b/source/backends/vulkan/transferqueue.cpp index 5419245b..95f170d4 100644 --- a/source/backends/vulkan/transferqueue.cpp +++ b/source/backends/vulkan/transferqueue.cpp @@ -78,12 +78,11 @@ TransferQueue::PendingTransfer &TransferQueue::insert_transfer(PendingTransfer & return *j; } -void TransferQueue::dispatch_transfers(const VulkanCommandRecorder &vkCmd) +void TransferQueue::dispatch_transfers(const VulkanCommandRecorder &vkCmd, unsigned current_frame) { if(transfers.empty()) return; - ++current_frame; for(auto i=transfers.begin(); i!=transfers.end(); ) { auto j = i; diff --git a/source/backends/vulkan/transferqueue.h b/source/backends/vulkan/transferqueue.h index 536edbd8..14654b76 100644 --- a/source/backends/vulkan/transferqueue.h +++ b/source/backends/vulkan/transferqueue.h @@ -49,7 +49,6 @@ private: std::vector transfers; std::vector async_transfers; std::map next_orders; - unsigned current_frame = 0; public: TransferQueue(Device &); @@ -69,7 +68,7 @@ private: PendingTransfer &insert_transfer(PendingTransfer &&); public: - void dispatch_transfers(const VulkanCommandRecorder &); + void dispatch_transfers(const VulkanCommandRecorder &, unsigned); }; template -- 2.45.2