4#include <score/gfx/Vulkan.hpp>
7#include <Gfx/Graph/VulkanVideoDevice.hpp>
9#include <QtGui/private/qrhivulkan_p.h>
10#include <qvulkanfunctions.h>
11#include <vulkan/vulkan.h>
18#if defined(VK_EXT_image_drm_format_modifier) && defined(VK_KHR_external_memory_fd) \
19 && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
30struct DMABufPlaneImporter
32 VkDevice m_dev{VK_NULL_HANDLE};
33 QVulkanDeviceFunctions* m_dfuncs{};
34 PFN_vkGetMemoryFdPropertiesKHR m_getMemFdProps{};
38 VkImage image{VK_NULL_HANDLE};
39 VkDeviceMemory memory{VK_NULL_HANDLE};
45 =
static_cast<const QRhiVulkanNativeHandles*
>(rhi.nativeHandles());
47 m_dfuncs = nh->inst->deviceFunctions(m_dev);
48 m_getMemFdProps =
reinterpret_cast<PFN_vkGetMemoryFdPropertiesKHR
>(
49 vulkanDeviceCommand(rhi,
"vkGetMemoryFdPropertiesKHR"));
52 static bool isAvailable(QRhi& rhi)
54 if(rhi.backend() != QRhi::Vulkan)
57 =
static_cast<const QRhiVulkanNativeHandles*
>(rhi.nativeHandles());
58 if(!nh || !nh->dev || !nh->physDev || !nh->inst)
61 if(!vulkanDeviceCommand(rhi,
"vkGetMemoryFdPropertiesKHR")
62 || !vulkanDeviceCommand(rhi,
"vkGetImageDrmFormatModifierPropertiesEXT"))
66 auto* funcs = nh->inst->functions();
67 uint32_t extCount = 0;
68 funcs->vkEnumerateDeviceExtensionProperties(
69 nh->physDev,
nullptr, &extCount,
nullptr);
70 std::vector<VkExtensionProperties> exts(extCount);
71 funcs->vkEnumerateDeviceExtensionProperties(
72 nh->physDev,
nullptr, &extCount, exts.data());
74 bool hasDmaBuf =
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)
88 static std::uint32_t driverId(QRhi& rhi)
noexcept
90#if defined(VK_KHR_driver_properties) || defined(VK_VERSION_1_2)
91 if(rhi.backend() != QRhi::Vulkan)
93 auto* nh =
static_cast<const QRhiVulkanNativeHandles*
>(rhi.nativeHandles());
94 if(!nh || !nh->physDev || !nh->inst)
96 auto getProps2 =
reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2
>(
97 nh->inst->getInstanceProcAddr(
"vkGetPhysicalDeviceProperties2"));
99 getProps2 =
reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2
>(
100 nh->inst->getInstanceProcAddr(
"vkGetPhysicalDeviceProperties2KHR"));
104 VkPhysicalDeviceDriverProperties drv{};
105 drv.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
106 VkPhysicalDeviceProperties2 props{};
107 props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
109 getProps2(nh->physDev, &props);
110 return static_cast<std::uint32_t
>(drv.driverID);
122 void waitIdle() noexcept
124 if(m_dfuncs && m_dev != VK_NULL_HANDLE)
125 m_dfuncs->vkDeviceWaitIdle(m_dev);
128 void cleanupPlane(PlaneImport& p)
130 if(p.image != VK_NULL_HANDLE)
131 m_dfuncs->vkDestroyImage(m_dev, p.image,
nullptr);
132 if(p.memory != VK_NULL_HANDLE)
133 m_dfuncs->vkFreeMemory(m_dev, p.memory,
nullptr);
138 PlaneImport& out,
int fd, uint64_t modifier, ptrdiff_t offset,
139 ptrdiff_t pitch, VkFormat format,
int w,
int h)
143 VkSubresourceLayout planeLayout{};
144 planeLayout.offset =
static_cast<VkDeviceSize
>(offset);
145 planeLayout.rowPitch =
static_cast<VkDeviceSize
>(pitch);
147 VkImageDrmFormatModifierExplicitCreateInfoEXT modInfo{};
149 = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
150 modInfo.drmFormatModifier = modifier;
151 modInfo.drmFormatModifierPlaneCount = 1;
152 modInfo.pPlaneLayouts = &planeLayout;
154 VkExternalMemoryImageCreateInfo extInfo{};
155 extInfo.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
156 extInfo.pNext = &modInfo;
157 extInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
159 VkImageCreateInfo imgInfo{};
160 imgInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
161 imgInfo.pNext = &extInfo;
162 imgInfo.imageType = VK_IMAGE_TYPE_2D;
163 imgInfo.format = format;
165 = {
static_cast<uint32_t
>(w),
static_cast<uint32_t
>(h), 1};
166 imgInfo.mipLevels = 1;
167 imgInfo.arrayLayers = 1;
168 imgInfo.samples = VK_SAMPLE_COUNT_1_BIT;
169 imgInfo.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
170 imgInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
171 imgInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
172 imgInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
175 if(m_dfuncs->vkCreateImage(m_dev, &imgInfo,
nullptr, &image)
181 VkMemoryRequirements memReqs{};
182 m_dfuncs->vkGetImageMemoryRequirements(m_dev, image, &memReqs);
187 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
191 VkMemoryFdPropertiesKHR fdProps{};
192 fdProps.sType = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR;
194 m_dev, VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, dupFd,
199 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
203 uint32_t memTypeIdx = UINT32_MAX;
204 uint32_t compatible = memReqs.memoryTypeBits & fdProps.memoryTypeBits;
205 for(uint32_t i = 0; i < 32; ++i)
207 if(compatible & (1u << i))
213 if(memTypeIdx == UINT32_MAX)
216 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
220 VkImportMemoryFdInfoKHR importInfo{};
221 importInfo.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR;
222 importInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
223 importInfo.fd = dupFd;
225 VkMemoryDedicatedAllocateInfo dedicatedInfo{};
226 dedicatedInfo.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;
227 dedicatedInfo.pNext = &importInfo;
228 dedicatedInfo.image = image;
230 VkMemoryAllocateInfo allocInfo{};
231 allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
232 allocInfo.pNext = &dedicatedInfo;
233 allocInfo.allocationSize = memReqs.size;
234 allocInfo.memoryTypeIndex = memTypeIdx;
236 VkDeviceMemory memory{};
237 if(m_dfuncs->vkAllocateMemory(m_dev, &allocInfo,
nullptr, &memory)
241 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
245 if(m_dfuncs->vkBindImageMemory(m_dev, image, memory, 0) != VK_SUCCESS)
247 m_dfuncs->vkFreeMemory(m_dev, memory,
nullptr);
248 m_dfuncs->vkDestroyImage(m_dev, image,
nullptr);
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11