From ad017c2556dc04329e5abbc6599d84502549c3cc Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 7 Mar 2018 13:32:17 +0100 Subject: [PATCH] [dxvk] Implemented physical buffer view --- src/dxvk/dxvk_buffer_res.cpp | 25 ++++++++++++++++++++ src/dxvk/dxvk_buffer_res.h | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/src/dxvk/dxvk_buffer_res.cpp b/src/dxvk/dxvk_buffer_res.cpp index 7d48bc23..caf151bb 100644 --- a/src/dxvk/dxvk_buffer_res.cpp +++ b/src/dxvk/dxvk_buffer_res.cpp @@ -39,4 +39,29 @@ namespace dxvk { m_vkd->vkDestroyBuffer(m_vkd->device(), m_handle, nullptr); } + + DxvkPhysicalBufferView::DxvkPhysicalBufferView( + const Rc& vkd, + const DxvkPhysicalBufferSlice& slice, + const DxvkBufferViewCreateInfo& info) + : m_vkd(vkd), m_slice(slice.subSlice(info.rangeOffset, info.rangeLength)) { + VkBufferViewCreateInfo viewInfo; + viewInfo.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; + viewInfo.pNext = nullptr; + viewInfo.flags = 0; + viewInfo.buffer = m_slice.handle(); + viewInfo.format = info.format; + viewInfo.offset = m_slice.offset(); + viewInfo.range = m_slice.length(); + + if (m_vkd->vkCreateBufferView(m_vkd->device(), &viewInfo, nullptr, &m_view) != VK_SUCCESS) + throw DxvkError("DxvkBufferView::DxvkBufferView: Failed to create buffer view"); + } + + + DxvkPhysicalBufferView::~DxvkPhysicalBufferView() { + m_vkd->vkDestroyBufferView( + m_vkd->device(), m_view, nullptr); + } + } \ No newline at end of file diff --git a/src/dxvk/dxvk_buffer_res.h b/src/dxvk/dxvk_buffer_res.h index 86264e1e..4b67d8ff 100644 --- a/src/dxvk/dxvk_buffer_res.h +++ b/src/dxvk/dxvk_buffer_res.h @@ -203,4 +203,50 @@ namespace dxvk { return DxvkPhysicalBufferSlice(this, offset, length); } + + /** + * \brief Physical buffer view + * + * Manages a texel buffer view for a physical + * buffer slice, which is used as the backing + * resource of a \c DxvkBufferView. + */ + class DxvkPhysicalBufferView : public DxvkResource { + + public: + + DxvkPhysicalBufferView( + const Rc& vkd, + const DxvkPhysicalBufferSlice& slice, + const DxvkBufferViewCreateInfo& info); + + ~DxvkPhysicalBufferView(); + + /** + * \brief Vulkan buffer view handle + * \returns Vulkan buffer view handle + */ + VkBufferView handle() const { + return m_view; + } + + /** + * \brief Physical buffer slice + * + * The slice backing this buffer view. + * \returns Physical buffer slice + */ + DxvkPhysicalBufferSlice slice() const { + return m_slice; + } + + private: + + Rc m_vkd; + DxvkPhysicalBufferSlice m_slice; + + VkBufferView m_view = VK_NULL_HANDLE; + + }; + } \ No newline at end of file