mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-01 10:54:14 +01:00
[dxvk] Avoid redundant vertex and index buffer tracking
Same optimization as for regular resources. Mostly reduces load on the cleanup thread.
This commit is contained in:
parent
c3ebf4658c
commit
afe2b487a6
@ -43,6 +43,7 @@ namespace dxvk {
|
|||||||
m_cmd->beginRecording();
|
m_cmd->beginRecording();
|
||||||
|
|
||||||
// Mark all resources as untracked
|
// Mark all resources as untracked
|
||||||
|
m_vbTracked.clear();
|
||||||
m_rcTracked.clear();
|
m_rcTracked.clear();
|
||||||
|
|
||||||
// The current state of the internal command buffer is
|
// The current state of the internal command buffer is
|
||||||
@ -149,8 +150,16 @@ namespace dxvk {
|
|||||||
void DxvkContext::bindIndexBuffer(
|
void DxvkContext::bindIndexBuffer(
|
||||||
const DxvkBufferSlice& buffer,
|
const DxvkBufferSlice& buffer,
|
||||||
VkIndexType indexType) {
|
VkIndexType indexType) {
|
||||||
if (!m_state.vi.indexBuffer.matches(buffer)
|
bool needsUpdate = !m_state.vi.indexBuffer.matchesBuffer(buffer);
|
||||||
|| (m_state.vi.indexType != indexType)) {
|
|
||||||
|
if (likely(!needsUpdate)) {
|
||||||
|
needsUpdate = !m_state.vi.indexBuffer.matchesRange(buffer)
|
||||||
|
|| m_state.vi.indexType != indexType;
|
||||||
|
} else {
|
||||||
|
m_vbTracked.clr(MaxNumVertexBindings);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needsUpdate) {
|
||||||
m_state.vi.indexBuffer = buffer;
|
m_state.vi.indexBuffer = buffer;
|
||||||
m_state.vi.indexType = indexType;
|
m_state.vi.indexType = indexType;
|
||||||
|
|
||||||
@ -244,7 +253,14 @@ namespace dxvk {
|
|||||||
uint32_t binding,
|
uint32_t binding,
|
||||||
const DxvkBufferSlice& buffer,
|
const DxvkBufferSlice& buffer,
|
||||||
uint32_t stride) {
|
uint32_t stride) {
|
||||||
if (!m_state.vi.vertexBuffers[binding].matches(buffer)) {
|
bool needsUpdate = !m_state.vi.vertexBuffers[binding].matchesBuffer(buffer);
|
||||||
|
|
||||||
|
if (likely(!needsUpdate))
|
||||||
|
needsUpdate = !m_state.vi.vertexBuffers[binding].matchesRange(buffer);
|
||||||
|
else
|
||||||
|
m_vbTracked.clr(binding);
|
||||||
|
|
||||||
|
if (needsUpdate) {
|
||||||
m_state.vi.vertexBuffers[binding] = buffer;
|
m_state.vi.vertexBuffers[binding] = buffer;
|
||||||
m_flags.set(DxvkContextFlag::GpDirtyVertexBuffers);
|
m_flags.set(DxvkContextFlag::GpDirtyVertexBuffers);
|
||||||
}
|
}
|
||||||
@ -3730,8 +3746,9 @@ namespace dxvk {
|
|||||||
bufferInfo.buffer.buffer,
|
bufferInfo.buffer.buffer,
|
||||||
bufferInfo.buffer.offset,
|
bufferInfo.buffer.offset,
|
||||||
m_state.vi.indexType);
|
m_state.vi.indexType);
|
||||||
m_cmd->trackResource(
|
|
||||||
m_state.vi.indexBuffer.buffer());
|
if (m_vbTracked.set(MaxNumVertexBindings))
|
||||||
|
m_cmd->trackResource(m_state.vi.indexBuffer.buffer());
|
||||||
} else {
|
} else {
|
||||||
m_cmd->cmdBindIndexBuffer(
|
m_cmd->cmdBindIndexBuffer(
|
||||||
m_device->dummyBufferHandle(),
|
m_device->dummyBufferHandle(),
|
||||||
@ -3761,6 +3778,7 @@ namespace dxvk {
|
|||||||
buffers[i] = vbo.buffer.buffer;
|
buffers[i] = vbo.buffer.buffer;
|
||||||
offsets[i] = vbo.buffer.offset;
|
offsets[i] = vbo.buffer.offset;
|
||||||
|
|
||||||
|
if (m_vbTracked.set(binding))
|
||||||
m_cmd->trackResource(m_state.vi.vertexBuffers[binding].buffer());
|
m_cmd->trackResource(m_state.vi.vertexBuffers[binding].buffer());
|
||||||
} else {
|
} else {
|
||||||
buffers[i] = m_device->dummyBufferHandle();
|
buffers[i] = m_device->dummyBufferHandle();
|
||||||
|
@ -994,6 +994,7 @@ namespace dxvk {
|
|||||||
VkDescriptorSet m_gpSet = VK_NULL_HANDLE;
|
VkDescriptorSet m_gpSet = VK_NULL_HANDLE;
|
||||||
VkDescriptorSet m_cpSet = VK_NULL_HANDLE;
|
VkDescriptorSet m_cpSet = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
DxvkBindingSet<MaxNumVertexBindings + 1> m_vbTracked;
|
||||||
DxvkBindingSet<MaxNumResourceSlots> m_rcTracked;
|
DxvkBindingSet<MaxNumResourceSlots> m_rcTracked;
|
||||||
|
|
||||||
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
|
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user