1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-28 02:19:26 +01:00

[dxvk] Always use vkCmdBindIndexBuffer2 for index buffer robustness

This commit is contained in:
Philip Rebohle 2025-03-23 22:23:20 +01:00
parent a5de2e458a
commit 8ca0592017
3 changed files with 7 additions and 23 deletions

View File

@ -47,10 +47,6 @@ namespace dxvk {
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);
// Check whether we can batch direct draws
if (m_device->features().extMultiDraw.multiDraw
&& m_device->properties().extMultiDraw.maxMultiDrawCount >= DirectMultiDrawBatchSize)
@ -6801,20 +6797,13 @@ namespace dxvk {
m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer);
auto bufferInfo = m_state.vi.indexBuffer.getDescriptor();
if (m_features.test(DxvkContextFeature::IndexBufferRobustness)) {
VkDeviceSize align = m_state.vi.indexType == VK_INDEX_TYPE_UINT16 ? 2 : 4;
VkDeviceSize range = bufferInfo.buffer.range & ~(align - 1);
VkDeviceSize align = m_state.vi.indexType == VK_INDEX_TYPE_UINT16 ? 2 : 4;
VkDeviceSize range = bufferInfo.buffer.range & ~(align - 1);
m_cmd->cmdBindIndexBuffer2(
bufferInfo.buffer.buffer,
bufferInfo.buffer.offset,
range, m_state.vi.indexType);
} else {
m_cmd->cmdBindIndexBuffer(
bufferInfo.buffer.buffer,
bufferInfo.buffer.offset,
m_state.vi.indexType);
}
m_cmd->cmdBindIndexBuffer2(
bufferInfo.buffer.buffer,
bufferInfo.buffer.offset,
range, m_state.vi.indexType);
if (unlikely(m_state.vi.indexBuffer.buffer()->hasGfxStores())) {
accessBuffer(DxvkCmdBuffer::ExecBuffer, m_state.vi.indexBuffer,

View File

@ -74,7 +74,6 @@ namespace dxvk {
enum class DxvkContextFeature : uint32_t {
TrackGraphicsPipeline,
VariableMultisampleRate,
IndexBufferRobustness,
DebugUtils,
DirectMultiDraw,
FeatureCount

View File

@ -1822,17 +1822,13 @@ namespace dxvk {
void DxvkMemoryAllocator::determineBufferUsageFlagsPerMemoryType() {
VkBufferUsageFlags flags = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
| VK_BUFFER_USAGE_INDEX_BUFFER_BIT
| VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
| VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
| VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
| VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
// Also lock index buffer usage to maintenance5 support since we
// cannot explicitly specify a buffer range otherwise.
if (m_device->features().khrMaintenance5.maintenance5)
flags |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
if (m_device->features().extTransformFeedback.transformFeedback) {
flags |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT
| VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;