From e8f59bfd7c612fe2c147af9bcca36dbdf47b1dfb Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 20 Aug 2022 22:04:51 +0200 Subject: [PATCH] [d3d11] Implement tile pool creation --- src/d3d11/d3d11_buffer.cpp | 24 ++++++++++++++++-------- src/d3d11/d3d11_buffer.h | 5 +++++ src/d3d11/d3d11_device.cpp | 5 ++++- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/d3d11/d3d11_buffer.cpp b/src/d3d11/d3d11_buffer.cpp index 55e8d0b69..cbcbb1e71 100644 --- a/src/d3d11/d3d11_buffer.cpp +++ b/src/d3d11/d3d11_buffer.cpp @@ -73,16 +73,24 @@ namespace dxvk { | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT; } - // Create the buffer and set the entire buffer slice as mapped, - // so that we only have to update it when invalidating th buffer - m_buffer = m_parent->GetDXVKDevice()->createBuffer(info, GetMemoryFlags()); - m_mapped = m_buffer->getSliceHandle(); + if (!(pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILE_POOL)) { + // Create the buffer and set the entire buffer slice as mapped, + // so that we only have to update it when invalidating the buffer + m_buffer = m_parent->GetDXVKDevice()->createBuffer(info, GetMemoryFlags()); + m_mapped = m_buffer->getSliceHandle(); - m_mapMode = DetermineMapMode(); + m_mapMode = DetermineMapMode(); - // For Stream Output buffers we need a counter - if (pDesc->BindFlags & D3D11_BIND_STREAM_OUTPUT) - m_soCounter = CreateSoCounterBuffer(); + // For Stream Output buffers we need a counter + if (pDesc->BindFlags & D3D11_BIND_STREAM_OUTPUT) + m_soCounter = CreateSoCounterBuffer(); + } else { + m_sparseAllocator = m_parent->GetDXVKDevice()->createSparsePageAllocator(); + m_sparseAllocator->setCapacity(info.size / SparseMemoryPageSize); + + m_mapped = DxvkBufferSliceHandle(); + m_mapMode = D3D11_COMMON_BUFFER_MAP_MODE_NONE; + } } diff --git a/src/d3d11/d3d11_buffer.h b/src/d3d11/d3d11_buffer.h index 90d069b01..5c9c0645b 100644 --- a/src/d3d11/d3d11_buffer.h +++ b/src/d3d11/d3d11_buffer.h @@ -73,6 +73,10 @@ namespace dxvk { Rc GetBuffer() const { return m_buffer; } + + Rc GetSparseAllocator() const { + return m_sparseAllocator; + } DxvkBufferSlice GetBufferSlice() const { return DxvkBufferSlice(m_buffer, 0, m_desc.ByteWidth); @@ -152,6 +156,7 @@ namespace dxvk { Rc m_buffer; Rc m_soCounter; + Rc m_sparseAllocator; DxvkBufferSliceHandle m_mapped; uint64_t m_seq = 0ull; diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 01c916632..2dd70877f 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -95,7 +95,10 @@ namespace dxvk { try { const Com buffer = new D3D11Buffer(this, &desc); - m_initializer->InitBuffer(buffer.ptr(), pInitialData); + + if (!(desc.MiscFlags & D3D11_RESOURCE_MISC_TILE_POOL)) + m_initializer->InitBuffer(buffer.ptr(), pInitialData); + *ppBuffer = buffer.ref(); return S_OK; } catch (const DxvkError& e) {