From: Mikko Rasa Date: Fri, 7 Oct 2022 18:32:43 +0000 (+0300) Subject: Pass frame number to TransferQueue from the outside X-Git-Url: https://git.tdb.fi/?a=commitdiff_plain;h=ab5126fb6b2245cf3f1e54e2c3c164e081ec9c53;p=libs%2Fgl.git 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. --- 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