[d3d11] Use bindIndexBufferRange whenever possible

This commit is contained in:
Philip Rebohle 2022-08-07 15:45:22 +02:00
parent 35dde3e1b9
commit 97f0d1dfb8
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 45 additions and 8 deletions

View File

@ -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)

View File

@ -1227,19 +1227,19 @@ namespace dxvk {
D3D10DeviceLock lock = LockContext();
auto newBuffer = static_cast<D3D11Buffer*>(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<typename ContextType>
void D3D11CommonContext<ContextType>::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<typename ContextType>
void D3D11CommonContext<ContextType>::BindXfbBuffer(

View File

@ -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,