Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-08-16 18:11:09 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-08-24 14:00:35 +0300
commit179c5ec998d23f11575ef41e9d2a51d0918770bf (patch)
treec7f2ef5577002ffe5b8e05995168564598fa1e27
parentd6e0107e239d171466cfdc6061b4ccd2a33de0a1 (diff)
[dxvk] Sort allocated memory pages for sparse allocator
This way, memory regions bound to consecutive pages are more likely to end up in consecutive memory regions, which allows batching page table updates more efficiently.
-rw-r--r--src/dxvk/dxvk_sparse.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/dxvk/dxvk_sparse.cpp b/src/dxvk/dxvk_sparse.cpp
index ffdc7814..7f7aed0f 100644
--- a/src/dxvk/dxvk_sparse.cpp
+++ b/src/dxvk/dxvk_sparse.cpp
@@ -110,8 +110,28 @@ namespace dxvk {
if (!m_useCount)
m_pages.resize(pageCount);
} else if (pageCount > m_pageCount) {
- while (m_pages.size() < pageCount)
- m_pages.push_back(allocPage());
+ std::vector<Rc<DxvkSparsePage>> newPages;
+ newPages.reserve(pageCount - m_pageCount);
+
+ for (size_t i = 0; i < pageCount - m_pageCount; i++)
+ newPages.push_back(allocPage());
+
+ // Sort page by memory and offset to enable more
+ // batching opportunities during page table updates
+ std::sort(newPages.begin(), newPages.end(),
+ [] (const Rc<DxvkSparsePage>& a, const Rc<DxvkSparsePage>& b) {
+ auto aHandle = a->getHandle();
+ auto bHandle = b->getHandle();
+
+ // Ignore length here, the offsets cannot be the same anyway.
+ if (aHandle.memory < bHandle.memory) return true;
+ if (aHandle.memory > bHandle.memory) return false;
+
+ return aHandle.offset < bHandle.offset;
+ });
+
+ for (auto& page : newPages)
+ m_pages.push_back(std::move(page));
}
m_pageCount = pageCount;