From afe2b487a62cc62246926e11723a0277ecc42aca Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 27 Jun 2019 01:51:15 +0200 Subject: [PATCH] [dxvk] Avoid redundant vertex and index buffer tracking Same optimization as for regular resources. Mostly reduces load on the cleanup thread. --- src/dxvk/dxvk_context.cpp | 30 ++++++++++++++++++++++++------ src/dxvk/dxvk_context.h | 3 ++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 664d35ba..57b47cf9 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -43,6 +43,7 @@ namespace dxvk { m_cmd->beginRecording(); // Mark all resources as untracked + m_vbTracked.clear(); m_rcTracked.clear(); // The current state of the internal command buffer is @@ -149,8 +150,16 @@ namespace dxvk { void DxvkContext::bindIndexBuffer( const DxvkBufferSlice& buffer, VkIndexType indexType) { - if (!m_state.vi.indexBuffer.matches(buffer) - || (m_state.vi.indexType != indexType)) { + bool needsUpdate = !m_state.vi.indexBuffer.matchesBuffer(buffer); + + if (likely(!needsUpdate)) { + needsUpdate = !m_state.vi.indexBuffer.matchesRange(buffer) + || m_state.vi.indexType != indexType; + } else { + m_vbTracked.clr(MaxNumVertexBindings); + } + + if (needsUpdate) { m_state.vi.indexBuffer = buffer; m_state.vi.indexType = indexType; @@ -244,7 +253,14 @@ namespace dxvk { uint32_t binding, const DxvkBufferSlice& buffer, uint32_t stride) { - if (!m_state.vi.vertexBuffers[binding].matches(buffer)) { + bool needsUpdate = !m_state.vi.vertexBuffers[binding].matchesBuffer(buffer); + + if (likely(!needsUpdate)) + needsUpdate = !m_state.vi.vertexBuffers[binding].matchesRange(buffer); + else + m_vbTracked.clr(binding); + + if (needsUpdate) { m_state.vi.vertexBuffers[binding] = buffer; m_flags.set(DxvkContextFlag::GpDirtyVertexBuffers); } @@ -3730,8 +3746,9 @@ namespace dxvk { bufferInfo.buffer.buffer, bufferInfo.buffer.offset, m_state.vi.indexType); - m_cmd->trackResource( - m_state.vi.indexBuffer.buffer()); + + if (m_vbTracked.set(MaxNumVertexBindings)) + m_cmd->trackResource(m_state.vi.indexBuffer.buffer()); } else { m_cmd->cmdBindIndexBuffer( m_device->dummyBufferHandle(), @@ -3761,7 +3778,8 @@ namespace dxvk { buffers[i] = vbo.buffer.buffer; offsets[i] = vbo.buffer.offset; - m_cmd->trackResource(m_state.vi.vertexBuffers[binding].buffer()); + if (m_vbTracked.set(binding)) + m_cmd->trackResource(m_state.vi.vertexBuffers[binding].buffer()); } else { buffers[i] = m_device->dummyBufferHandle(); offsets[i] = 0; diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 24f4a1ea..8d21733d 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -994,7 +994,8 @@ namespace dxvk { VkDescriptorSet m_gpSet = VK_NULL_HANDLE; VkDescriptorSet m_cpSet = VK_NULL_HANDLE; - DxvkBindingSet m_rcTracked; + DxvkBindingSet m_vbTracked; + DxvkBindingSet m_rcTracked; std::array m_rc; std::array m_descInfos;