From bbd2461c8fb126f502ed6c7b2a1fe8907f76a3f0 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 25 Sep 2024 20:34:21 +0200 Subject: [PATCH] [dxvk] Reimplement sparse buffer support --- src/dxvk/dxvk_buffer.cpp | 5 +++++ src/dxvk/dxvk_buffer.h | 6 ++++++ src/dxvk/dxvk_image.cpp | 5 +++++ src/dxvk/dxvk_image.h | 10 +++++++++- src/dxvk/dxvk_memory.cpp | 11 ++++++++++- src/dxvk/dxvk_memory.h | 3 +++ src/dxvk/dxvk_sparse.cpp | 9 +++++---- src/dxvk/dxvk_sparse.h | 21 +++++++++------------ 8 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/dxvk/dxvk_buffer.cpp b/src/dxvk/dxvk_buffer.cpp index 86fe9b2b2..e4a34c0ec 100644 --- a/src/dxvk/dxvk_buffer.cpp +++ b/src/dxvk/dxvk_buffer.cpp @@ -64,4 +64,9 @@ namespace dxvk { return &entry.first->second; } + + DxvkSparsePageTable* DxvkBuffer::getSparsePageTable() { + return m_storage->getSparsePageTable(); + } + } diff --git a/src/dxvk/dxvk_buffer.h b/src/dxvk/dxvk_buffer.h index 4e8ebb0eb..682a7fbff 100644 --- a/src/dxvk/dxvk_buffer.h +++ b/src/dxvk/dxvk_buffer.h @@ -384,6 +384,12 @@ namespace dxvk { Rc createView( const DxvkBufferViewCreateInfo& info); + /** + * \brief Retrieves sparse binding table + * \returns Sparse binding table + */ + DxvkSparsePageTable* getSparsePageTable(); + private: Rc m_vkd; diff --git a/src/dxvk/dxvk_image.cpp b/src/dxvk/dxvk_image.cpp index d5142e171..238741fa2 100644 --- a/src/dxvk/dxvk_image.cpp +++ b/src/dxvk/dxvk_image.cpp @@ -215,6 +215,11 @@ namespace dxvk { } + DxvkSparsePageTable* DxvkImage::getSparsePageTable() { + return &m_sparsePageTable; + } + + DxvkImageView::DxvkImageView( const Rc& vkd, const Rc& image, diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index 3a09302bf..bdbaf59b1 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -330,7 +330,13 @@ namespace dxvk { * \returns The shared handle with the type given by DxvkSharedHandleInfo::type */ HANDLE sharedHandle() const; - + + /** + * \brief Retrives sparse page table + * \returns Page table + */ + DxvkSparsePageTable* getSparsePageTable(); + private: Rc m_vkd; @@ -339,6 +345,8 @@ namespace dxvk { VkMemoryPropertyFlags m_memFlags; DxvkPhysicalImage m_image; + DxvkSparsePageTable m_sparsePageTable; + bool m_shared = false; small_vector m_viewFormats; diff --git a/src/dxvk/dxvk_memory.cpp b/src/dxvk/dxvk_memory.cpp index d2b447765..6a5d29e75 100644 --- a/src/dxvk/dxvk_memory.cpp +++ b/src/dxvk/dxvk_memory.cpp @@ -758,7 +758,7 @@ namespace dxvk { logMemoryStats(); } } else { - // TODO implement sparse + allocation = createAllocation(new DxvkSparsePageTable(m_device, createInfo, buffer)); } if (!allocation) { @@ -1102,6 +1102,15 @@ namespace dxvk { } + DxvkResourceAllocation* DxvkMemoryAllocator::createAllocation( + DxvkSparsePageTable* sparsePageTable) { + auto allocation = m_allocationPool.create(this, nullptr); + allocation->m_sparsePageTable = sparsePageTable; + + return allocation; + } + + DxvkResourceAllocation* DxvkMemoryAllocator::createAllocation( DxvkMemoryType& type, const DxvkDeviceMemory& memory) { diff --git a/src/dxvk/dxvk_memory.h b/src/dxvk/dxvk_memory.h index bae1196d5..ae971f6df 100644 --- a/src/dxvk/dxvk_memory.h +++ b/src/dxvk/dxvk_memory.h @@ -1279,6 +1279,9 @@ namespace dxvk { DxvkMemoryType& type, const DxvkDeviceMemory& memory); + DxvkResourceAllocation* createAllocation( + DxvkSparsePageTable* sparsePageTable); + bool refillAllocationCache( DxvkLocalAllocationCache* cache, const VkMemoryRequirements& requirements, diff --git a/src/dxvk/dxvk_sparse.cpp b/src/dxvk/dxvk_sparse.cpp index 7948c0658..6cd91c21c 100644 --- a/src/dxvk/dxvk_sparse.cpp +++ b/src/dxvk/dxvk_sparse.cpp @@ -182,9 +182,10 @@ namespace dxvk { DxvkSparsePageTable::DxvkSparsePageTable( DxvkDevice* device, - const DxvkBuffer* buffer) - : m_buffer(buffer) { - VkDeviceSize bufferSize = buffer->info().size; + const VkBufferCreateInfo& bufferInfo, + VkBuffer bufferHandle) + : m_buffer(bufferHandle) { + VkDeviceSize bufferSize = bufferInfo.size; // For linear buffers, the mapping is very simple // and consists of consecutive 64k pages @@ -357,7 +358,7 @@ namespace dxvk { VkBuffer DxvkSparsePageTable::getBufferHandle() const { - return m_buffer ? m_buffer->getSliceHandle().handle : VK_NULL_HANDLE; + return m_buffer; } diff --git a/src/dxvk/dxvk_sparse.h b/src/dxvk/dxvk_sparse.h index 86231d3e2..6f3a4aa04 100644 --- a/src/dxvk/dxvk_sparse.h +++ b/src/dxvk/dxvk_sparse.h @@ -331,7 +331,8 @@ namespace dxvk { DxvkSparsePageTable( DxvkDevice* device, - const DxvkBuffer* buffer); + const VkBufferCreateInfo& bufferInfo, + VkBuffer bufferHandle); DxvkSparsePageTable( DxvkDevice* device, @@ -455,8 +456,9 @@ namespace dxvk { private: - const DxvkBuffer* m_buffer = nullptr; - const DxvkImage* m_image = nullptr; + VkBuffer m_buffer = VK_NULL_HANDLE; + + const DxvkImage* m_image = nullptr; DxvkSparseImageProperties m_properties = { }; std::vector m_subresources; @@ -478,17 +480,12 @@ namespace dxvk { /** * \brief Queries sparse page table + * + * Should be removed once storage objects can + * be retrieved from resources diectly. * \returns Sparse page table, if defined */ - DxvkSparsePageTable* getSparsePageTable() { - return m_sparsePageTable - ? &m_sparsePageTable - : nullptr; - } - - protected: - - DxvkSparsePageTable m_sparsePageTable; + virtual DxvkSparsePageTable* getSparsePageTable() = 0; };