mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-13 19:29:14 +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
|
||||
* \returns Buffer slice descriptor
|
||||
*/
|
||||
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const {
|
||||
return m_physSlice.getDescriptor(offset, length, keepOffset);
|
||||
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const {
|
||||
return m_physSlice.getDescriptor(offset, length);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -272,12 +272,10 @@ namespace dxvk {
|
||||
|
||||
/**
|
||||
* \brief Retrieves descriptor info
|
||||
*
|
||||
* \param [in] keepOffset \c false to zero offset
|
||||
* \returns Buffer slice descriptor
|
||||
*/
|
||||
DxvkDescriptorInfo getDescriptor(bool keepOffset) const {
|
||||
return m_buffer->getDescriptor(m_offset, m_length, keepOffset);
|
||||
DxvkDescriptorInfo getDescriptor() const {
|
||||
return m_buffer->getDescriptor(m_offset, m_length);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -189,12 +189,10 @@ namespace dxvk {
|
||||
*
|
||||
* \param [in] offset Buffer slice offset
|
||||
* \param [in] length Buffer slice length
|
||||
* \param [in] keepOffset \c false to zero offset
|
||||
* \returns Buffer slice descriptor
|
||||
*/
|
||||
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const {
|
||||
offset = keepOffset ? m_offset + offset : 0;
|
||||
return m_buffer->getDescriptor(offset, length);
|
||||
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const {
|
||||
return m_buffer->getDescriptor(m_offset + offset, length);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2244,7 +2244,7 @@ namespace dxvk {
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||
if (res.bufferSlice.defined()) {
|
||||
updatePipelineState |= bindMask.setBound(i);
|
||||
m_descInfos[i] = res.bufferSlice.getDescriptor(true);
|
||||
m_descInfos[i] = res.bufferSlice.getDescriptor();
|
||||
|
||||
m_cmd->trackResource(res.bufferSlice.resource());
|
||||
} else {
|
||||
@ -2256,7 +2256,8 @@ namespace dxvk {
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||
if (res.bufferSlice.defined()) {
|
||||
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());
|
||||
} else {
|
||||
@ -2346,14 +2347,14 @@ namespace dxvk {
|
||||
m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer);
|
||||
|
||||
if (m_state.vi.indexBuffer.defined()) {
|
||||
auto physicalSlice = m_state.vi.indexBuffer.physicalSlice();
|
||||
auto bufferInfo = m_state.vi.indexBuffer.getDescriptor();
|
||||
|
||||
m_cmd->cmdBindIndexBuffer(
|
||||
physicalSlice.handle(),
|
||||
physicalSlice.offset(),
|
||||
bufferInfo.buffer.buffer,
|
||||
bufferInfo.buffer.offset,
|
||||
m_state.vi.indexType);
|
||||
m_cmd->trackResource(
|
||||
physicalSlice.resource());
|
||||
m_state.vi.indexBuffer.resource());
|
||||
} else {
|
||||
m_cmd->cmdBindIndexBuffer(
|
||||
m_device->dummyBufferHandle(),
|
||||
@ -2379,14 +2380,14 @@ namespace dxvk {
|
||||
bindingCount = std::max(bindingCount, binding + 1);
|
||||
|
||||
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();
|
||||
offsets[binding] = vbo.offset();
|
||||
buffers[binding] = vbo.buffer.buffer;
|
||||
offsets[binding] = vbo.buffer.offset;
|
||||
|
||||
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