From 64828e2c6c1eef17a221888da203c43ac8a5ae15 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 23 Aug 2023 14:54:42 +0200 Subject: [PATCH] [dxvk] Use vkCmdBindIndexBuffer2 if supported --- src/dxvk/dxvk_cmdlist.h | 10 ++++++++++ src/dxvk/dxvk_context.cpp | 20 ++++++++++++++++---- src/dxvk/dxvk_context_state.h | 1 + 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index ca8e5d443..b9b9a165d 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -467,6 +467,16 @@ namespace dxvk { } + void cmdBindIndexBuffer2( + VkBuffer buffer, + VkDeviceSize offset, + VkDeviceSize size, + VkIndexType indexType) { + m_vkd->vkCmdBindIndexBuffer2KHR(m_cmd.execBuffer, + buffer, offset, size, indexType); + } + + void cmdBindPipeline( VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) { diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 61ad7016c..80c2620de 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -61,6 +61,10 @@ namespace dxvk { // requested rasterizer sample count changes if (m_device->features().core.features.variableMultisampleRate) m_features.set(DxvkContextFeature::VariableMultisampleRate); + + // Maintenance5 introduced a bounded BindIndexBuffer function + if (m_device->features().khrMaintenance5.maintenance5) + m_features.set(DxvkContextFeature::IndexBufferRobustness); } @@ -5589,10 +5593,18 @@ namespace dxvk { m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer); auto bufferInfo = m_state.vi.indexBuffer.getDescriptor(); - m_cmd->cmdBindIndexBuffer( - bufferInfo.buffer.buffer, - bufferInfo.buffer.offset, - m_state.vi.indexType); + if (m_features.test(DxvkContextFeature::IndexBufferRobustness)) { + m_cmd->cmdBindIndexBuffer2( + bufferInfo.buffer.buffer, + bufferInfo.buffer.offset, + bufferInfo.buffer.range, + m_state.vi.indexType); + } else { + m_cmd->cmdBindIndexBuffer( + bufferInfo.buffer.buffer, + bufferInfo.buffer.offset, + m_state.vi.indexType); + } if (m_vbTracked.set(MaxNumVertexBindings)) m_cmd->trackResource(m_state.vi.indexBuffer.buffer()); diff --git a/src/dxvk/dxvk_context_state.h b/src/dxvk/dxvk_context_state.h index 23f2e2484..b6066cb8a 100644 --- a/src/dxvk/dxvk_context_state.h +++ b/src/dxvk/dxvk_context_state.h @@ -65,6 +65,7 @@ namespace dxvk { enum class DxvkContextFeature : uint32_t { TrackGraphicsPipeline, VariableMultisampleRate, + IndexBufferRobustness, FeatureCount };