From 04ed4273baab56c77b23a471be7c363734e182ac Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 23 Sep 2018 20:09:01 +0200 Subject: [PATCH] [dxvk] Avoid buffer slice copy when binding index/vertex buffers Also redesigns getDescriptor to always return the offset. --- src/dxvk/dxvk_buffer.h | 10 ++++------ src/dxvk/dxvk_buffer_res.h | 6 ++---- src/dxvk/dxvk_context.cpp | 21 +++++++++++---------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/dxvk/dxvk_buffer.h b/src/dxvk/dxvk_buffer.h index fc2265d1..50c2e43c 100644 --- a/src/dxvk/dxvk_buffer.h +++ b/src/dxvk/dxvk_buffer.h @@ -76,8 +76,8 @@ namespace dxvk { * \param [in] keepOffset \c false to zero offset * \returns Buffer slice descriptor */ - DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const { - return m_physSlice.getDescriptor(offset, length, keepOffset); + DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const { + return m_physSlice.getDescriptor(offset, length); } /** @@ -272,12 +272,10 @@ namespace dxvk { /** * \brief Retrieves descriptor info - * - * \param [in] keepOffset \c false to zero offset * \returns Buffer slice descriptor */ - DxvkDescriptorInfo getDescriptor(bool keepOffset) const { - return m_buffer->getDescriptor(m_offset, m_length, keepOffset); + DxvkDescriptorInfo getDescriptor() const { + return m_buffer->getDescriptor(m_offset, m_length); } /** diff --git a/src/dxvk/dxvk_buffer_res.h b/src/dxvk/dxvk_buffer_res.h index f2e423a3..166753b7 100644 --- a/src/dxvk/dxvk_buffer_res.h +++ b/src/dxvk/dxvk_buffer_res.h @@ -189,12 +189,10 @@ namespace dxvk { * * \param [in] offset Buffer slice offset * \param [in] length Buffer slice length - * \param [in] keepOffset \c false to zero offset * \returns Buffer slice descriptor */ - DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const { - offset = keepOffset ? m_offset + offset : 0; - return m_buffer->getDescriptor(offset, length); + DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const { + return m_buffer->getDescriptor(m_offset + offset, length); } /** diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index eea4a281..cde496c0 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2244,7 +2244,7 @@ namespace dxvk { case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: if (res.bufferSlice.defined()) { updatePipelineState |= bindMask.setBound(i); - m_descInfos[i] = res.bufferSlice.getDescriptor(true); + m_descInfos[i] = res.bufferSlice.getDescriptor(); m_cmd->trackResource(res.bufferSlice.resource()); } else { @@ -2256,7 +2256,8 @@ namespace dxvk { case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: if (res.bufferSlice.defined()) { updatePipelineState |= bindMask.setBound(i); - m_descInfos[i] = res.bufferSlice.getDescriptor(false); + m_descInfos[i] = res.bufferSlice.getDescriptor(); + m_descInfos[i].buffer.offset = 0; m_cmd->trackResource(res.bufferSlice.resource()); } else { @@ -2346,14 +2347,14 @@ namespace dxvk { m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer); if (m_state.vi.indexBuffer.defined()) { - auto physicalSlice = m_state.vi.indexBuffer.physicalSlice(); + auto bufferInfo = m_state.vi.indexBuffer.getDescriptor(); m_cmd->cmdBindIndexBuffer( - physicalSlice.handle(), - physicalSlice.offset(), + bufferInfo.buffer.buffer, + bufferInfo.buffer.offset, m_state.vi.indexType); m_cmd->trackResource( - physicalSlice.resource()); + m_state.vi.indexBuffer.resource()); } else { m_cmd->cmdBindIndexBuffer( m_device->dummyBufferHandle(), @@ -2379,14 +2380,14 @@ namespace dxvk { bindingCount = std::max(bindingCount, binding + 1); if (m_state.vi.vertexBuffers[binding].defined()) { - auto vbo = m_state.vi.vertexBuffers[binding].physicalSlice(); + auto vbo = m_state.vi.vertexBuffers[binding].getDescriptor(); - buffers[binding] = vbo.handle(); - offsets[binding] = vbo.offset(); + buffers[binding] = vbo.buffer.buffer; + offsets[binding] = vbo.buffer.offset; bindingMask |= 1u << binding; - m_cmd->trackResource(vbo.resource()); + m_cmd->trackResource(m_state.vi.vertexBuffers[binding].resource()); } }