diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2023-08-16 18:11:09 +0300 |
---|---|---|
committer | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2023-08-24 14:00:35 +0300 |
commit | 179c5ec998d23f11575ef41e9d2a51d0918770bf (patch) | |
tree | c7f2ef5577002ffe5b8e05995168564598fa1e27 | |
parent | d6e0107e239d171466cfdc6061b4ccd2a33de0a1 (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.cpp | 24 |
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; |