1
0
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:
Philip Rebohle 2018-09-23 20:09:01 +02:00
parent 1c865328d3
commit 04ed4273ba
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 17 additions and 20 deletions

View File

@ -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);
}
/**

View File

@ -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);
}
/**

View File

@ -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());
}
}