mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 19:54:19 +01:00
[d3d11] Use bindIndexBufferRange whenever possible
This commit is contained in:
parent
35dde3e1b9
commit
97f0d1dfb8
@ -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)
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user