mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-12-04 01:43:05 +00:00
Merge pull request #5925 from ReinUsesLisp/resource-pool-clean
vk_resource_pool: Load GPU tick once and compare with it
This commit is contained in:
commit
0bbf5e61f1
|
@ -17,21 +17,21 @@ ResourcePool::~ResourcePool() = default;
|
||||||
size_t ResourcePool::CommitResource() {
|
size_t ResourcePool::CommitResource() {
|
||||||
// Refresh semaphore to query updated results
|
// Refresh semaphore to query updated results
|
||||||
master_semaphore.Refresh();
|
master_semaphore.Refresh();
|
||||||
|
const u64 gpu_tick = master_semaphore.KnownGpuTick();
|
||||||
const auto search = [this](size_t begin, size_t end) -> std::optional<size_t> {
|
const auto search = [this, gpu_tick](size_t begin, size_t end) -> std::optional<size_t> {
|
||||||
for (size_t iterator = begin; iterator < end; ++iterator) {
|
for (size_t iterator = begin; iterator < end; ++iterator) {
|
||||||
if (master_semaphore.IsFree(ticks[iterator])) {
|
if (gpu_tick >= ticks[iterator]) {
|
||||||
ticks[iterator] = master_semaphore.CurrentTick();
|
ticks[iterator] = master_semaphore.CurrentTick();
|
||||||
return iterator;
|
return iterator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {};
|
return std::nullopt;
|
||||||
};
|
};
|
||||||
// Try to find a free resource from the hinted position to the end.
|
// Try to find a free resource from the hinted position to the end.
|
||||||
auto found = search(free_iterator, ticks.size());
|
std::optional<size_t> found = search(hint_iterator, ticks.size());
|
||||||
if (!found) {
|
if (!found) {
|
||||||
// Search from beginning to the hinted position.
|
// Search from beginning to the hinted position.
|
||||||
found = search(0, free_iterator);
|
found = search(0, hint_iterator);
|
||||||
if (!found) {
|
if (!found) {
|
||||||
// Both searches failed, the pool is full; handle it.
|
// Both searches failed, the pool is full; handle it.
|
||||||
const size_t free_resource = ManageOverflow();
|
const size_t free_resource = ManageOverflow();
|
||||||
|
@ -41,7 +41,7 @@ size_t ResourcePool::CommitResource() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Free iterator is hinted to the resource after the one that's been commited.
|
// Free iterator is hinted to the resource after the one that's been commited.
|
||||||
free_iterator = (*found + 1) % ticks.size();
|
hint_iterator = (*found + 1) % ticks.size();
|
||||||
return *found;
|
return *found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ private:
|
||||||
|
|
||||||
MasterSemaphore& master_semaphore;
|
MasterSemaphore& master_semaphore;
|
||||||
size_t grow_step = 0; ///< Number of new resources created after an overflow
|
size_t grow_step = 0; ///< Number of new resources created after an overflow
|
||||||
size_t free_iterator = 0; ///< Hint to where the next free resources is likely to be found
|
size_t hint_iterator = 0; ///< Hint to where the next free resources is likely to be found
|
||||||
std::vector<u64> ticks; ///< Ticks for each resource
|
std::vector<u64> ticks; ///< Ticks for each resource
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue