[dxvk] Eliminate buffer slice copy when updating buffer descriptors

This commit is contained in:
Philip Rebohle 2018-09-20 12:10:43 +02:00
parent 03a760bec6
commit 539cc77b6e
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 64 additions and 13 deletions

View File

@ -67,6 +67,18 @@ namespace dxvk {
bool isInUse() const { bool isInUse() const {
return m_physSlice.resource()->isInUse(); return m_physSlice.resource()->isInUse();
} }
/**
* \brief Retrieves descriptor info
*
* \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 {
return m_physSlice.getDescriptor(offset, length, keepOffset);
}
/** /**
* \brief Underlying buffer resource * \brief Underlying buffer resource
@ -191,7 +203,7 @@ namespace dxvk {
size_t offset() const { return m_offset; } size_t offset() const { return m_offset; }
size_t length() const { return m_length; } size_t length() const { return m_length; }
/** /**
* \brief Underlying buffer * \brief Underlying buffer
* \returns The virtual buffer * \returns The virtual buffer
@ -247,6 +259,16 @@ namespace dxvk {
DxvkPhysicalBufferSlice physicalSlice() const { DxvkPhysicalBufferSlice physicalSlice() const {
return m_buffer->subSlice(m_offset, m_length); return m_buffer->subSlice(m_offset, m_length);
} }
/**
* \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);
}
/** /**
* \brief Pointer to mapped memory region * \brief Pointer to mapped memory region
@ -258,6 +280,14 @@ namespace dxvk {
return m_buffer->mapPtr(m_offset + offset); return m_buffer->mapPtr(m_offset + offset);
} }
/**
* \brief Resource pointer
* \returns Resource pointer
*/
Rc<DxvkResource> resource() const {
return m_buffer->resource();
}
/** /**
* \brief Checks whether two slices are equal * \brief Checks whether two slices are equal
* *

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "dxvk_descriptor.h"
#include "dxvk_format.h" #include "dxvk_format.h"
#include "dxvk_memory.h" #include "dxvk_memory.h"
#include "dxvk_resource.h" #include "dxvk_resource.h"
@ -88,6 +89,21 @@ namespace dxvk {
void* mapPtr(VkDeviceSize offset) const { void* mapPtr(VkDeviceSize offset) const {
return m_memory.mapPtr(offset); return m_memory.mapPtr(offset);
} }
/**
* \brief Retrieves descriptor info
*
* \param [in] offset Buffer slice offset
* \param [in] length Buffer slice length
* \returns Buffer slice descriptor
*/
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const {
DxvkDescriptorInfo result;
result.buffer.buffer = m_handle;
result.buffer.offset = offset;
result.buffer.range = length;
return result;
}
/** /**
* \brief Retrieves a physical buffer slice * \brief Retrieves a physical buffer slice
@ -167,6 +183,19 @@ namespace dxvk {
DxvkPhysicalBufferSlice subSlice(VkDeviceSize offset, VkDeviceSize length) const { DxvkPhysicalBufferSlice subSlice(VkDeviceSize offset, VkDeviceSize length) const {
return DxvkPhysicalBufferSlice(m_buffer, m_offset + offset, length); return DxvkPhysicalBufferSlice(m_buffer, m_offset + offset, length);
} }
/**
* \brief Retrieves descriptor info
*
* \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);
}
/** /**
* \brief Map pointer * \brief Map pointer

View File

@ -2244,13 +2244,9 @@ 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);
auto physicalSlice = res.bufferSlice.physicalSlice(); m_cmd->trackResource(res.bufferSlice.resource());
m_descInfos[i].buffer.buffer = physicalSlice.handle();
m_descInfos[i].buffer.offset = physicalSlice.offset();
m_descInfos[i].buffer.range = physicalSlice.length();
m_cmd->trackResource(physicalSlice.resource());
} else { } else {
updatePipelineState |= bindMask.setUnbound(i); updatePipelineState |= bindMask.setUnbound(i);
m_descInfos[i].buffer = m_device->dummyBufferDescriptor(); m_descInfos[i].buffer = m_device->dummyBufferDescriptor();
@ -2260,13 +2256,9 @@ 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);
auto physicalSlice = res.bufferSlice.physicalSlice(); m_cmd->trackResource(res.bufferSlice.resource());
m_descInfos[i].buffer.buffer = physicalSlice.handle();
m_descInfos[i].buffer.offset = 0; /* dynamic */
m_descInfos[i].buffer.range = physicalSlice.length();
m_cmd->trackResource(physicalSlice.resource());
} else { } else {
updatePipelineState |= bindMask.setUnbound(i); updatePipelineState |= bindMask.setUnbound(i);
m_descInfos[i].buffer = m_device->dummyBufferDescriptor(); m_descInfos[i].buffer = m_device->dummyBufferDescriptor();