From c572a9c39339d7694bbc8f27816fb1ab0b7cb232 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 27 Nov 2017 12:01:35 +0100 Subject: [PATCH] [dxvk] Implemented image creation --- src/dxvk/dxvk_device.cpp | 3 ++- src/dxvk/dxvk_image.cpp | 45 +++++++++++++++++++++++++++++++++------- src/dxvk/dxvk_image.h | 12 ++++++++++- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index cb295df1..60923d21 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -67,7 +67,8 @@ namespace dxvk { Rc DxvkDevice::createImage( const DxvkImageCreateInfo& createInfo, VkMemoryPropertyFlags memoryType) { - // TODO implement + return new DxvkImage(m_vkd, + createInfo, *m_memory, memoryType); } diff --git a/src/dxvk/dxvk_image.cpp b/src/dxvk/dxvk_image.cpp index 8d978065..8e55d3c7 100644 --- a/src/dxvk/dxvk_image.cpp +++ b/src/dxvk/dxvk_image.cpp @@ -2,13 +2,44 @@ namespace dxvk { -// DxvkImage::DxvkImage( -// const Rc& vkd, -// const DxvkImageCreateInfo& info, -// DxvkMemory&& memory) -// : m_vkd(vkd), m_info(info), m_memory(std::move(memory)) { -// -// } + DxvkImage::DxvkImage( + const Rc& vkd, + const DxvkImageCreateInfo& createInfo, + DxvkMemoryAllocator& memAlloc, + VkMemoryPropertyFlags memFlags) + : m_vkd(vkd), m_info(createInfo) { + + VkImageCreateInfo info; + info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + info.pNext = nullptr; + // TODO VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT if appropriate + info.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + info.imageType = createInfo.type; + info.format = createInfo.format; + info.extent = createInfo.extent; + info.mipLevels = createInfo.mipLevels; + info.arrayLayers = createInfo.numLayers; + info.samples = createInfo.sampleCount; + info.tiling = createInfo.tiling; + info.usage = createInfo.usage; + info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + info.queueFamilyIndexCount = 0; + info.pQueueFamilyIndices = nullptr; + info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + + if (m_vkd->vkCreateImage(m_vkd->device(), + &info, nullptr, &m_image) != VK_SUCCESS) + throw DxvkError("DxvkImage::DxvkImage: Failed to create image"); + + VkMemoryRequirements memReq; + m_vkd->vkGetImageMemoryRequirements( + m_vkd->device(), m_image, &memReq); + m_memory = memAlloc.alloc(memReq, memFlags); + + if (m_vkd->vkBindImageMemory(m_vkd->device(), + m_image, m_memory.memory(), m_memory.offset()) != VK_SUCCESS) + throw DxvkError("DxvkImage::DxvkImage: Failed to bind device memory"); + } DxvkImage::DxvkImage( diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index cfbe9876..87746beb 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -31,11 +31,21 @@ namespace dxvk { /** * \brief DXVK image + * + * An image resource consisting of various subresources. + * Cannot be mapped to host memory, the only way to access + * image data is through buffer transfer operations. */ class DxvkImage : public DxvkResource { public: + DxvkImage( + const Rc& vkd, + const DxvkImageCreateInfo& createInfo, + DxvkMemoryAllocator& memAlloc, + VkMemoryPropertyFlags memFlags); + /** * \brief Creates image object from existing image * @@ -82,7 +92,7 @@ namespace dxvk { Rc m_vkd; DxvkImageCreateInfo m_info; DxvkMemory m_memory; - VkImage m_image; + VkImage m_image = VK_NULL_HANDLE; };