diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_resource_pool.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_resource_pool.h | 2 |
2 files changed, 8 insertions, 8 deletions
diff --git a/src/video_core/renderer_vulkan/vk_resource_pool.cpp b/src/video_core/renderer_vulkan/vk_resource_pool.cpp index ee274ac59..a8bf7bda8 100644 --- a/src/video_core/renderer_vulkan/vk_resource_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_resource_pool.cpp | |||
| @@ -17,21 +17,21 @@ ResourcePool::~ResourcePool() = default; | |||
| 17 | size_t ResourcePool::CommitResource() { | 17 | size_t ResourcePool::CommitResource() { |
| 18 | // Refresh semaphore to query updated results | 18 | // Refresh semaphore to query updated results |
| 19 | master_semaphore.Refresh(); | 19 | master_semaphore.Refresh(); |
| 20 | 20 | const u64 gpu_tick = master_semaphore.KnownGpuTick(); | |
| 21 | const auto search = [this](size_t begin, size_t end) -> std::optional<size_t> { | 21 | const auto search = [this, gpu_tick](size_t begin, size_t end) -> std::optional<size_t> { |
| 22 | for (size_t iterator = begin; iterator < end; ++iterator) { | 22 | for (size_t iterator = begin; iterator < end; ++iterator) { |
| 23 | if (master_semaphore.IsFree(ticks[iterator])) { | 23 | if (gpu_tick >= ticks[iterator]) { |
| 24 | ticks[iterator] = master_semaphore.CurrentTick(); | 24 | ticks[iterator] = master_semaphore.CurrentTick(); |
| 25 | return iterator; | 25 | return iterator; |
| 26 | } | 26 | } |
| 27 | } | 27 | } |
| 28 | return {}; | 28 | return std::nullopt; |
| 29 | }; | 29 | }; |
| 30 | // Try to find a free resource from the hinted position to the end. | 30 | // Try to find a free resource from the hinted position to the end. |
| 31 | auto found = search(free_iterator, ticks.size()); | 31 | std::optional<size_t> found = search(hint_iterator, ticks.size()); |
| 32 | if (!found) { | 32 | if (!found) { |
| 33 | // Search from beginning to the hinted position. | 33 | // Search from beginning to the hinted position. |
| 34 | found = search(0, free_iterator); | 34 | found = search(0, hint_iterator); |
| 35 | if (!found) { | 35 | if (!found) { |
| 36 | // Both searches failed, the pool is full; handle it. | 36 | // Both searches failed, the pool is full; handle it. |
| 37 | const size_t free_resource = ManageOverflow(); | 37 | const size_t free_resource = ManageOverflow(); |
| @@ -41,7 +41,7 @@ size_t ResourcePool::CommitResource() { | |||
| 41 | } | 41 | } |
| 42 | } | 42 | } |
| 43 | // Free iterator is hinted to the resource after the one that's been commited. | 43 | // Free iterator is hinted to the resource after the one that's been commited. |
| 44 | free_iterator = (*found + 1) % ticks.size(); | 44 | hint_iterator = (*found + 1) % ticks.size(); |
| 45 | return *found; | 45 | return *found; |
| 46 | } | 46 | } |
| 47 | 47 | ||
diff --git a/src/video_core/renderer_vulkan/vk_resource_pool.h b/src/video_core/renderer_vulkan/vk_resource_pool.h index a018c7ec2..9d0bb3b4d 100644 --- a/src/video_core/renderer_vulkan/vk_resource_pool.h +++ b/src/video_core/renderer_vulkan/vk_resource_pool.h | |||
| @@ -36,7 +36,7 @@ private: | |||
| 36 | 36 | ||
| 37 | MasterSemaphore& master_semaphore; | 37 | MasterSemaphore& master_semaphore; |
| 38 | size_t grow_step = 0; ///< Number of new resources created after an overflow | 38 | size_t grow_step = 0; ///< Number of new resources created after an overflow |
| 39 | size_t free_iterator = 0; ///< Hint to where the next free resources is likely to be found | 39 | size_t hint_iterator = 0; ///< Hint to where the next free resources is likely to be found |
| 40 | std::vector<u64> ticks; ///< Ticks for each resource | 40 | std::vector<u64> ticks; ///< Ticks for each resource |
| 41 | }; | 41 | }; |
| 42 | 42 | ||