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;
92 static std::uint32_t driverId(QRhi& rhi)
noexcept
94#if defined(VK_KHR_driver_properties) || defined(VK_VERSION_1_2)
95 if(rhi.backend() != QRhi::Vulkan)
97 auto* nh =
static_cast<const QRhiVulkanNativeHandles*
>(rhi.nativeHandles());
98 if(!nh || !nh->physDev || !nh->inst)
100 auto getProps2 =
reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2
>(
101 nh->inst->getInstanceProcAddr(
"vkGetPhysicalDeviceProperties2"));
103 getProps2 =
reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2
>(
104 nh->inst->getInstanceProcAddr(
"vkGetPhysicalDeviceProperties2KHR"));
108 VkPhysicalDeviceDriverProperties drv{};
109 drv.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
110 VkPhysicalDeviceProperties2 props{};
111 props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
113 getProps2(nh->physDev, &props);
114 return static_cast<std::uint32_t
>(drv.driverID);
126 void waitIdle() noexcept
128 if(m_dfuncs && m_dev != VK_NULL_HANDLE)
129 m_dfuncs->vkDeviceWaitIdle(m_dev);
132 void cleanupPlane(PlaneImport& p)
134 if(p.image != VK_NULL_HANDLE)
135 m_dfuncs->vkDestroyImage(m_dev, p.image,
nullptr);
136 if(p.memory != VK_NULL_HANDLE)
137 m_dfuncs->vkFreeMemory(m_dev, p.memory,
nullptr);
142 PlaneImport& out,
int fd, uint64_t modifier, ptrdiff_t offset,
143 ptrdiff_t pitch, VkFormat format,
int w,
int h)
147 VkSubresourceLayout planeLayout{};
148 planeLayout.offset =
static_cast<VkDeviceSize
>(offset);
149 planeLayout.rowPitch =
static_cast<VkDeviceSize
>(pitch);
151 VkImageDrmFormatModifierExplicitCreateInfoEXT modInfo{};
153 = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
154 modInfo.drmFormatModifier = modifier;
155 modInfo.drmFormatModifierPlaneCount = 1;
156 modInfo.pPlaneLayouts = &planeLayout;
158 VkExternalMemoryImageCreateInfo extInfo{};
159 extInfo.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
160 extInfo.pNext = &modInfo;
161 extInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
163 VkImageCreateInfo imgInfo{};
164 imgInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
165 imgInfo.pNext = &extInfo;
166 imgInfo.imageType = VK_IMAGE_TYPE_2D;
167 imgInfo.format = format;
169 = {
static_cast<uint32_t
>(w),
static_cast<uint32_t
>(h), 1};
170 imgInfo.mipLevels = 1;
171 imgInfo.arrayLayers = 1;
172 imgInfo.samples = VK_SAMPLE_COUNT_1_BIT;
173 imgInfo.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
174 imgInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
175 imgInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
176 imgInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
179 if(m_dfuncs->vkCreateImage(m_dev, &imgInfo,
nullptr, &image)
185 VkMemoryRequirements memReqs{};
186 m_dfuncs->vkGetImageMemoryRequirements(m_dev, image, &memReqs);
191 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
195 VkMemoryFdPropertiesKHR fdProps{};
196 fdProps.sType = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR;
198 m_dev, VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, dupFd,
203 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
207 uint32_t memTypeIdx = UINT32_MAX;
208 uint32_t compatible = memReqs.memoryTypeBits & fdProps.memoryTypeBits;
209 for(uint32_t i = 0; i < 32; ++i)
211 if(compatible & (1u << i))
217 if(memTypeIdx == UINT32_MAX)
220 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
224 VkImportMemoryFdInfoKHR importInfo{};
225 importInfo.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR;
226 importInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
227 importInfo.fd = dupFd;
229 VkMemoryDedicatedAllocateInfo dedicatedInfo{};
230 dedicatedInfo.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;
231 dedicatedInfo.pNext = &importInfo;
232 dedicatedInfo.image = image;
234 VkMemoryAllocateInfo allocInfo{};
235 allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
236 allocInfo.pNext = &dedicatedInfo;
237 allocInfo.allocationSize = memReqs.size;
238 allocInfo.memoryTypeIndex = memTypeIdx;
240 VkDeviceMemory memory{};
241 if(m_dfuncs->vkAllocateMemory(m_dev, &allocInfo,
nullptr, &memory)
245 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
249 if(m_dfuncs->vkBindImageMemory(m_dev, image, memory, 0) != VK_SUCCESS)
251 m_dfuncs->vkFreeMemory(m_dev, memory,
nullptr);
252 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11