diff --git a/src/d3d11/d3d11_buffer.h b/src/d3d11/d3d11_buffer.h index 866e8d213..a20121457 100644 --- a/src/d3d11/d3d11_buffer.h +++ b/src/d3d11/d3d11_buffer.h @@ -90,6 +90,12 @@ namespace dxvk { return DxvkBufferSlice(m_buffer, offset, std::min(length, size - offset)); } + VkDeviceSize GetRemainingSize(VkDeviceSize offset) const { + VkDeviceSize size = m_desc.ByteWidth; + offset = std::min(offset, size); + return size - offset; + } + DxvkBufferSlice GetSOCounter() { return m_soCounter != nullptr ? DxvkBufferSlice(m_soCounter) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 416bfa30e..c56aaa1fa 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -1227,19 +1227,19 @@ namespace dxvk { D3D10DeviceLock lock = LockContext(); auto newBuffer = static_cast(pIndexBuffer); - bool needsUpdate = m_state.ia.indexBuffer.buffer != newBuffer; - if (needsUpdate) + if (m_state.ia.indexBuffer.buffer != newBuffer) { m_state.ia.indexBuffer.buffer = newBuffer; - - needsUpdate |= m_state.ia.indexBuffer.offset != Offset - || m_state.ia.indexBuffer.format != Format; - - if (needsUpdate) { m_state.ia.indexBuffer.offset = Offset; m_state.ia.indexBuffer.format = Format; BindIndexBuffer(newBuffer, Offset, Format); + } else if (m_state.ia.indexBuffer.offset != Offset + || m_state.ia.indexBuffer.format != Format) { + m_state.ia.indexBuffer.offset = Offset; + m_state.ia.indexBuffer.format = Format; + + BindIndexBufferRange(newBuffer, Offset, Format); } } @@ -3239,7 +3239,33 @@ namespace dxvk { }); } } - + + + template + void D3D11CommonContext::BindIndexBufferRange( + D3D11Buffer* pBuffer, + UINT Offset, + DXGI_FORMAT Format) { + if (pBuffer) { + VkIndexType indexType = Format == DXGI_FORMAT_R16_UINT + ? VK_INDEX_TYPE_UINT16 + : VK_INDEX_TYPE_UINT32; + + VkDeviceSize offset = Offset; + VkDeviceSize length = pBuffer->GetRemainingSize(Offset); + + EmitCs([ + cBufferOffset = offset, + cBufferLength = length, + cIndexType = indexType + ] (DxvkContext* ctx) mutable { + ctx->bindIndexBufferRange( + cBufferOffset, cBufferLength, + cIndexType); + }); + } + } + template void D3D11CommonContext::BindXfbBuffer( diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index 5ba55507c..2b1f52e34 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -824,6 +824,11 @@ namespace dxvk { UINT Offset, DXGI_FORMAT Format); + void BindIndexBufferRange( + D3D11Buffer* pBuffer, + UINT Offset, + DXGI_FORMAT Format); + void BindXfbBuffer( UINT Slot, D3D11Buffer* pBuffer,