4#include <score/gfx/Vulkan.hpp>
7#include <QtGui/private/qrhivulkan_p.h>
8#include <qvulkanfunctions.h>
9#include <vulkan/vulkan.h>
16#if defined(VK_EXT_image_drm_format_modifier) && defined(VK_KHR_external_memory_fd) \
17 && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
28struct DMABufPlaneImporter
30 VkDevice m_dev{VK_NULL_HANDLE};
31 QVulkanDeviceFunctions* m_dfuncs{};
32 PFN_vkGetMemoryFdPropertiesKHR m_getMemFdProps{};
36 VkImage image{VK_NULL_HANDLE};
37 VkDeviceMemory memory{VK_NULL_HANDLE};
43 =
static_cast<const QRhiVulkanNativeHandles*
>(rhi.nativeHandles());
45 m_dfuncs = nh->inst->deviceFunctions(m_dev);
46 m_getMemFdProps =
reinterpret_cast<PFN_vkGetMemoryFdPropertiesKHR
>(
47 nh->inst->getInstanceProcAddr(
"vkGetMemoryFdPropertiesKHR"));
50 static bool isAvailable(QRhi& rhi)
52 if(rhi.backend() != QRhi::Vulkan)
55 =
static_cast<const QRhiVulkanNativeHandles*
>(rhi.nativeHandles());
56 if(!nh || !nh->dev || !nh->physDev || !nh->inst)
58 if(!nh->inst->getInstanceProcAddr(
"vkGetMemoryFdPropertiesKHR"))
65 auto* funcs = nh->inst->functions();
66 uint32_t extCount = 0;
67 funcs->vkEnumerateDeviceExtensionProperties(
68 nh->physDev,
nullptr, &extCount,
nullptr);
69 std::vector<VkExtensionProperties> exts(extCount);
70 funcs->vkEnumerateDeviceExtensionProperties(
71 nh->physDev,
nullptr, &extCount, exts.data());
73 bool hasDmaBuf =
false;
74 bool hasDrmModifier =
false;
77#ifdef VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME
78 if(std::strcmp(e.extensionName, VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME) == 0)
81#ifdef VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME
82 if(std::strcmp(e.extensionName, VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME) == 0)
83 hasDrmModifier =
true;
86 return hasDmaBuf && hasDrmModifier;
89 void cleanupPlane(PlaneImport& p)
91 if(p.image != VK_NULL_HANDLE)
92 m_dfuncs->vkDestroyImage(m_dev, p.image,
nullptr);
93 if(p.memory != VK_NULL_HANDLE)
94 m_dfuncs->vkFreeMemory(m_dev, p.memory,
nullptr);
99 PlaneImport& out,
int fd, uint64_t modifier, ptrdiff_t offset,
100 ptrdiff_t pitch, VkFormat format,
int w,
int h)
104 VkSubresourceLayout planeLayout{};
105 planeLayout.offset =
static_cast<VkDeviceSize
>(offset);
106 planeLayout.rowPitch =
static_cast<VkDeviceSize
>(pitch);
108 VkImageDrmFormatModifierExplicitCreateInfoEXT modInfo{};
110 = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
111 modInfo.drmFormatModifier = modifier;
112 modInfo.drmFormatModifierPlaneCount = 1;
113 modInfo.pPlaneLayouts = &planeLayout;
115 VkExternalMemoryImageCreateInfo extInfo{};
116 extInfo.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
117 extInfo.pNext = &modInfo;
118 extInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
120 VkImageCreateInfo imgInfo{};
121 imgInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
122 imgInfo.pNext = &extInfo;
123 imgInfo.imageType = VK_IMAGE_TYPE_2D;
124 imgInfo.format = format;
126 = {
static_cast<uint32_t
>(w),
static_cast<uint32_t
>(h), 1};
127 imgInfo.mipLevels = 1;
128 imgInfo.arrayLayers = 1;
129 imgInfo.samples = VK_SAMPLE_COUNT_1_BIT;
130 imgInfo.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
131 imgInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
132 imgInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
133 imgInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
136 if(m_dfuncs->vkCreateImage(m_dev, &imgInfo,
nullptr, &image)
142 VkMemoryRequirements memReqs{};
143 m_dfuncs->vkGetImageMemoryRequirements(m_dev, image, &memReqs);
148 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
152 VkMemoryFdPropertiesKHR fdProps{};
153 fdProps.sType = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR;
155 m_dev, VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, dupFd,
160 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
164 uint32_t memTypeIdx = UINT32_MAX;
165 uint32_t compatible = memReqs.memoryTypeBits & fdProps.memoryTypeBits;
166 for(uint32_t i = 0; i < 32; ++i)
168 if(compatible & (1u << i))
174 if(memTypeIdx == UINT32_MAX)
177 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
181 VkImportMemoryFdInfoKHR importInfo{};
182 importInfo.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR;
183 importInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
184 importInfo.fd = dupFd;
186 VkMemoryDedicatedAllocateInfo dedicatedInfo{};
187 dedicatedInfo.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;
188 dedicatedInfo.pNext = &importInfo;
189 dedicatedInfo.image = image;
191 VkMemoryAllocateInfo allocInfo{};
192 allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
193 allocInfo.pNext = &dedicatedInfo;
194 allocInfo.allocationSize = memReqs.size;
195 allocInfo.memoryTypeIndex = memTypeIdx;
197 VkDeviceMemory memory{};
198 if(m_dfuncs->vkAllocateMemory(m_dev, &allocInfo,
nullptr, &memory)
202 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
206 if(m_dfuncs->vkBindImageMemory(m_dev, image, memory, 0) != VK_SUCCESS)
208 m_dfuncs->vkFreeMemory(m_dev, memory,
nullptr);
209 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:12