diff --git a/src/dxvk/dxvk_buffer.h b/src/dxvk/dxvk_buffer.h index ea4e3e1f..4492cc61 100644 --- a/src/dxvk/dxvk_buffer.h +++ b/src/dxvk/dxvk_buffer.h @@ -67,6 +67,18 @@ namespace dxvk { bool isInUse() const { 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 @@ -191,7 +203,7 @@ namespace dxvk { size_t offset() const { return m_offset; } size_t length() const { return m_length; } - + /** * \brief Underlying buffer * \returns The virtual buffer @@ -247,6 +259,16 @@ namespace dxvk { DxvkPhysicalBufferSlice physicalSlice() const { 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 @@ -258,6 +280,14 @@ namespace dxvk { return m_buffer->mapPtr(m_offset + offset); } + /** + * \brief Resource pointer + * \returns Resource pointer + */ + Rc resource() const { + return m_buffer->resource(); + } + /** * \brief Checks whether two slices are equal * diff --git a/src/dxvk/dxvk_buffer_res.h b/src/dxvk/dxvk_buffer_res.h index 235e673a..992cfb73 100644 --- a/src/dxvk/dxvk_buffer_res.h +++ b/src/dxvk/dxvk_buffer_res.h @@ -1,5 +1,6 @@ #pragma once +#include "dxvk_descriptor.h" #include "dxvk_format.h" #include "dxvk_memory.h" #include "dxvk_resource.h" @@ -88,6 +89,21 @@ namespace dxvk { void* mapPtr(VkDeviceSize offset) const { 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 @@ -167,6 +183,19 @@ namespace dxvk { DxvkPhysicalBufferSlice subSlice(VkDeviceSize offset, VkDeviceSize length) const { 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 diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 0fb1e7ca..2656bf01 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2244,13 +2244,9 @@ namespace dxvk { case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: if (res.bufferSlice.defined()) { updatePipelineState |= bindMask.setBound(i); + m_descInfos[i] = res.bufferSlice.getDescriptor(true); - auto physicalSlice = res.bufferSlice.physicalSlice(); - 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()); + m_cmd->trackResource(res.bufferSlice.resource()); } else { updatePipelineState |= bindMask.setUnbound(i); m_descInfos[i].buffer = m_device->dummyBufferDescriptor(); @@ -2260,13 +2256,9 @@ namespace dxvk { case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: if (res.bufferSlice.defined()) { updatePipelineState |= bindMask.setBound(i); + m_descInfos[i] = res.bufferSlice.getDescriptor(false); - auto physicalSlice = res.bufferSlice.physicalSlice(); - 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()); + m_cmd->trackResource(res.bufferSlice.resource()); } else { updatePipelineState |= bindMask.setUnbound(i); m_descInfos[i].buffer = m_device->dummyBufferDescriptor();