From 8029712aa40dd67ca1e3d3137149422bb7260c93 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 8 May 2019 00:27:13 +0200 Subject: [PATCH] [dxvk] Fix unbound vertex buffer handling Bit of a brain fart there; we can't just change the meaning of bindingMask since it indirectly affetcs binding strides. --- src/dxvk/dxvk_context.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index a112e6d4..9a455409 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -3679,10 +3679,10 @@ namespace dxvk { // Set buffer handles and offsets for active bindings uint32_t bindingMask = 0; + uint32_t bindingDead = 0; for (uint32_t i = 0; i < m_state.gp.state.ilBindingCount; i++) { uint32_t binding = m_state.gp.state.ilBindings[i].binding; - bindingMask |= 1u << binding; if (likely(m_state.vi.vertexBuffers[binding].defined())) { auto vbo = m_state.vi.vertexBuffers[binding].getDescriptor(); @@ -3690,20 +3690,24 @@ namespace dxvk { buffers[binding] = vbo.buffer.buffer; offsets[binding] = vbo.buffer.offset; + bindingMask |= 1u << binding; m_cmd->trackResource(m_state.vi.vertexBuffers[binding].buffer()); } else { buffers[binding] = m_device->dummyBufferHandle(); offsets[binding] = 0; + + bindingDead |= 1u << binding; } } // Adjust stride of inactive bindings if needed - if (m_state.vi.bindingMask != bindingMask) { + if (unlikely(m_state.vi.bindingMask != bindingMask)) { m_flags.set(DxvkContextFlag::GpDirtyPipelineState); m_state.vi.bindingMask = bindingMask; } - // Actually bind all the vertex buffers + // Actually bind all the vertex buffers. + bindingMask |= bindingDead; uint32_t bindingIndex = 0; while (bindingMask) {