mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[dxvk] Avoid buffer slice copy when binding index/vertex buffers
Also redesigns getDescriptor to always return the offset.
This commit is contained in:
parent
1c865328d3
commit
04ed4273ba
@ -76,8 +76,8 @@ namespace dxvk {
|
|||||||
* \param [in] keepOffset \c false to zero offset
|
* \param [in] keepOffset \c false to zero offset
|
||||||
* \returns Buffer slice descriptor
|
* \returns Buffer slice descriptor
|
||||||
*/
|
*/
|
||||||
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const {
|
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const {
|
||||||
return m_physSlice.getDescriptor(offset, length, keepOffset);
|
return m_physSlice.getDescriptor(offset, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -272,12 +272,10 @@ namespace dxvk {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Retrieves descriptor info
|
* \brief Retrieves descriptor info
|
||||||
*
|
|
||||||
* \param [in] keepOffset \c false to zero offset
|
|
||||||
* \returns Buffer slice descriptor
|
* \returns Buffer slice descriptor
|
||||||
*/
|
*/
|
||||||
DxvkDescriptorInfo getDescriptor(bool keepOffset) const {
|
DxvkDescriptorInfo getDescriptor() const {
|
||||||
return m_buffer->getDescriptor(m_offset, m_length, keepOffset);
|
return m_buffer->getDescriptor(m_offset, m_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -189,12 +189,10 @@ namespace dxvk {
|
|||||||
*
|
*
|
||||||
* \param [in] offset Buffer slice offset
|
* \param [in] offset Buffer slice offset
|
||||||
* \param [in] length Buffer slice length
|
* \param [in] length Buffer slice length
|
||||||
* \param [in] keepOffset \c false to zero offset
|
|
||||||
* \returns Buffer slice descriptor
|
* \returns Buffer slice descriptor
|
||||||
*/
|
*/
|
||||||
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const {
|
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const {
|
||||||
offset = keepOffset ? m_offset + offset : 0;
|
return m_buffer->getDescriptor(m_offset + offset, length);
|
||||||
return m_buffer->getDescriptor(offset, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2244,7 +2244,7 @@ namespace dxvk {
|
|||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||||
if (res.bufferSlice.defined()) {
|
if (res.bufferSlice.defined()) {
|
||||||
updatePipelineState |= bindMask.setBound(i);
|
updatePipelineState |= bindMask.setBound(i);
|
||||||
m_descInfos[i] = res.bufferSlice.getDescriptor(true);
|
m_descInfos[i] = res.bufferSlice.getDescriptor();
|
||||||
|
|
||||||
m_cmd->trackResource(res.bufferSlice.resource());
|
m_cmd->trackResource(res.bufferSlice.resource());
|
||||||
} else {
|
} else {
|
||||||
@ -2256,7 +2256,8 @@ namespace dxvk {
|
|||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||||
if (res.bufferSlice.defined()) {
|
if (res.bufferSlice.defined()) {
|
||||||
updatePipelineState |= bindMask.setBound(i);
|
updatePipelineState |= bindMask.setBound(i);
|
||||||
m_descInfos[i] = res.bufferSlice.getDescriptor(false);
|
m_descInfos[i] = res.bufferSlice.getDescriptor();
|
||||||
|
m_descInfos[i].buffer.offset = 0;
|
||||||
|
|
||||||
m_cmd->trackResource(res.bufferSlice.resource());
|
m_cmd->trackResource(res.bufferSlice.resource());
|
||||||
} else {
|
} else {
|
||||||
@ -2346,14 +2347,14 @@ namespace dxvk {
|
|||||||
m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer);
|
m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer);
|
||||||
|
|
||||||
if (m_state.vi.indexBuffer.defined()) {
|
if (m_state.vi.indexBuffer.defined()) {
|
||||||
auto physicalSlice = m_state.vi.indexBuffer.physicalSlice();
|
auto bufferInfo = m_state.vi.indexBuffer.getDescriptor();
|
||||||
|
|
||||||
m_cmd->cmdBindIndexBuffer(
|
m_cmd->cmdBindIndexBuffer(
|
||||||
physicalSlice.handle(),
|
bufferInfo.buffer.buffer,
|
||||||
physicalSlice.offset(),
|
bufferInfo.buffer.offset,
|
||||||
m_state.vi.indexType);
|
m_state.vi.indexType);
|
||||||
m_cmd->trackResource(
|
m_cmd->trackResource(
|
||||||
physicalSlice.resource());
|
m_state.vi.indexBuffer.resource());
|
||||||
} else {
|
} else {
|
||||||
m_cmd->cmdBindIndexBuffer(
|
m_cmd->cmdBindIndexBuffer(
|
||||||
m_device->dummyBufferHandle(),
|
m_device->dummyBufferHandle(),
|
||||||
@ -2379,14 +2380,14 @@ namespace dxvk {
|
|||||||
bindingCount = std::max(bindingCount, binding + 1);
|
bindingCount = std::max(bindingCount, binding + 1);
|
||||||
|
|
||||||
if (m_state.vi.vertexBuffers[binding].defined()) {
|
if (m_state.vi.vertexBuffers[binding].defined()) {
|
||||||
auto vbo = m_state.vi.vertexBuffers[binding].physicalSlice();
|
auto vbo = m_state.vi.vertexBuffers[binding].getDescriptor();
|
||||||
|
|
||||||
buffers[binding] = vbo.handle();
|
buffers[binding] = vbo.buffer.buffer;
|
||||||
offsets[binding] = vbo.offset();
|
offsets[binding] = vbo.buffer.offset;
|
||||||
|
|
||||||
bindingMask |= 1u << binding;
|
bindingMask |= 1u << binding;
|
||||||
|
|
||||||
m_cmd->trackResource(vbo.resource());
|
m_cmd->trackResource(m_state.vi.vertexBuffers[binding].resource());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user