diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index c56aaa1fa..62313593d 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -1198,19 +1198,19 @@ namespace dxvk { for (uint32_t i = 0; i < NumBuffers; i++) { auto newBuffer = static_cast(ppVertexBuffers[i]); - bool needsUpdate = m_state.ia.vertexBuffers[StartSlot + i].buffer != newBuffer; - if (needsUpdate) + if (m_state.ia.vertexBuffers[StartSlot + i].buffer != newBuffer) { m_state.ia.vertexBuffers[StartSlot + i].buffer = newBuffer; - - needsUpdate |= m_state.ia.vertexBuffers[StartSlot + i].offset != pOffsets[i] - || m_state.ia.vertexBuffers[StartSlot + i].stride != pStrides[i]; - - if (needsUpdate) { m_state.ia.vertexBuffers[StartSlot + i].offset = pOffsets[i]; m_state.ia.vertexBuffers[StartSlot + i].stride = pStrides[i]; BindVertexBuffer(StartSlot + i, newBuffer, pOffsets[i], pStrides[i]); + } else if (m_state.ia.vertexBuffers[StartSlot + i].offset != pOffsets[i] + || m_state.ia.vertexBuffers[StartSlot + i].stride != pStrides[i]) { + m_state.ia.vertexBuffers[StartSlot + i].offset = pOffsets[i]; + m_state.ia.vertexBuffers[StartSlot + i].stride = pStrides[i]; + + BindVertexBufferRange(StartSlot + i, newBuffer, pOffsets[i], pStrides[i]); } } @@ -3213,6 +3213,29 @@ namespace dxvk { } + template + void D3D11CommonContext::BindVertexBufferRange( + UINT Slot, + D3D11Buffer* pBuffer, + UINT Offset, + UINT Stride) { + if (pBuffer) { + VkDeviceSize offset = Offset; + VkDeviceSize length = pBuffer->GetRemainingSize(Offset); + + EmitCs([ + cSlotId = Slot, + cBufferOffset = offset, + cBufferLength = length, + cStride = Stride + ] (DxvkContext* ctx) mutable { + ctx->bindVertexBufferRange(cSlotId, + cBufferOffset, cBufferLength, cStride); + }); + } + } + + template void D3D11CommonContext::BindIndexBuffer( D3D11Buffer* pBuffer, diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index 2b1f52e34..a9acbbdce 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -819,6 +819,12 @@ namespace dxvk { UINT Offset, UINT Stride); + void BindVertexBufferRange( + UINT Slot, + D3D11Buffer* pBuffer, + UINT Offset, + UINT Stride); + void BindIndexBuffer( D3D11Buffer* pBuffer, UINT Offset,