From 5193e8ef24927c5dae18e3d3caceadcdbe361863 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 8 Jan 2020 16:14:45 +0100 Subject: [PATCH] [dxvk] Introduce DxvkPhysicalImage --- src/dxvk/dxvk_image.cpp | 18 +++++++++--------- src/dxvk/dxvk_image.h | 20 ++++++++++++++------ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/dxvk/dxvk_image.cpp b/src/dxvk/dxvk_image.cpp index a703b02a..3634eaf4 100644 --- a/src/dxvk/dxvk_image.cpp +++ b/src/dxvk/dxvk_image.cpp @@ -41,7 +41,7 @@ namespace dxvk { info.initialLayout = createInfo.initialLayout; if (m_vkd->vkCreateImage(m_vkd->device(), - &info, nullptr, &m_image) != VK_SUCCESS) { + &info, nullptr, &m_image.image) != VK_SUCCESS) { throw DxvkError(str::format( "DxvkImage: Failed to create image:", "\n Type: ", info.imageType, @@ -72,14 +72,14 @@ namespace dxvk { VkImageMemoryRequirementsInfo2KHR memReqInfo; memReqInfo.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR; - memReqInfo.image = m_image; + memReqInfo.image = m_image.image; memReqInfo.pNext = VK_NULL_HANDLE; VkMemoryDedicatedAllocateInfoKHR dedMemoryAllocInfo; dedMemoryAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR; dedMemoryAllocInfo.pNext = VK_NULL_HANDLE; dedMemoryAllocInfo.buffer = VK_NULL_HANDLE; - dedMemoryAllocInfo.image = m_image; + dedMemoryAllocInfo.image = m_image.image; m_vkd->vkGetImageMemoryRequirements2KHR( m_vkd->device(), &memReqInfo, &memReq); @@ -98,12 +98,12 @@ namespace dxvk { float priority = isGpuWritable ? 1.0f : 0.5f; // Ask driver whether we should be using a dedicated allocation - m_memory = memAlloc.alloc(&memReq.memoryRequirements, + m_image.memory = memAlloc.alloc(&memReq.memoryRequirements, dedicatedRequirements, dedMemoryAllocInfo, memFlags, priority); // Try to bind the allocated memory slice to the image - if (m_vkd->vkBindImageMemory(m_vkd->device(), - m_image, m_memory.memory(), m_memory.offset()) != VK_SUCCESS) + if (m_vkd->vkBindImageMemory(m_vkd->device(), m_image.image, + m_image.memory.memory(), m_image.memory.offset()) != VK_SUCCESS) throw DxvkError("DxvkImage::DxvkImage: Failed to bind device memory"); } @@ -112,7 +112,7 @@ namespace dxvk { const Rc& vkd, const DxvkImageCreateInfo& info, VkImage image) - : m_vkd(vkd), m_info(info), m_image(image) { + : m_vkd(vkd), m_info(info), m_image({ image }) { } @@ -120,8 +120,8 @@ namespace dxvk { DxvkImage::~DxvkImage() { // This is a bit of a hack to determine whether // the image is implementation-handled or not - if (m_memory.memory() != VK_NULL_HANDLE) - m_vkd->vkDestroyImage(m_vkd->device(), m_image, nullptr); + if (m_image.memory.memory() != VK_NULL_HANDLE) + m_vkd->vkDestroyImage(m_vkd->device(), m_image.image, nullptr); } diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index db6dd8b9..ff6a7771 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -96,6 +96,15 @@ namespace dxvk { VK_COMPONENT_SWIZZLE_IDENTITY, }; }; + + + /** + * \brief Stores an image and its memory slice. + */ + struct DxvkPhysicalImage { + VkImage image = VK_NULL_HANDLE; + DxvkMemory memory; + }; /** @@ -143,7 +152,7 @@ namespace dxvk { * \returns Image handle */ VkImage handle() const { - return m_image; + return m_image.image; } /** @@ -177,7 +186,7 @@ namespace dxvk { * \returns Pointer to mapped memory region */ void* mapPtr(VkDeviceSize offset) const { - return m_memory.mapPtr(offset); + return m_image.memory.mapPtr(offset); } /** @@ -210,7 +219,7 @@ namespace dxvk { const VkImageSubresource& subresource) const { VkSubresourceLayout result; m_vkd->vkGetImageSubresourceLayout( - m_vkd->device(), m_image, + m_vkd->device(), m_image.image, &subresource, &result); return result; } @@ -272,7 +281,7 @@ namespace dxvk { * \returns The memory size of the image */ VkDeviceSize memSize() const { - return m_memory.length(); + return m_image.memory.length(); } private: @@ -280,8 +289,7 @@ namespace dxvk { Rc m_vkd; DxvkImageCreateInfo m_info; VkMemoryPropertyFlags m_memFlags; - DxvkMemory m_memory; - VkImage m_image = VK_NULL_HANDLE; + DxvkPhysicalImage m_image; small_vector m_viewFormats;