2#include <score/gfx/Vulkan.hpp>
4#if QT_HAS_VULKAN && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
6#include <QtGui/private/qrhivulkan_p.h>
7#include <qvulkanfunctions.h>
8#include <vulkan/vulkan.h>
14#ifdef VK_KHR_video_decode_queue
27struct SharedVulkanDevice
29 VkPhysicalDevice physDev{VK_NULL_HANDLE};
30 VkDevice dev{VK_NULL_HANDLE};
31 VkQueue gfxQueue{VK_NULL_HANDLE};
32 uint32_t gfxQueueFamilyIdx{0};
33 bool hasVideoDecodeQueue{
false};
34 uint32_t videoDecodeQueueFamilyIdx{0};
37 std::vector<std::string> enabledExtensions;
40 struct QueueFamilyInfo
46 std::vector<QueueFamilyInfo> queueFamilies;
50 if(dev != VK_NULL_HANDLE)
52 auto* inst = staticVulkanInstance(
false);
55 auto fn =
reinterpret_cast<PFN_vkDestroyDevice
>(
56 inst->getInstanceProcAddr(
"vkDestroyDevice"));
64 explicit operator bool()
const {
return dev != VK_NULL_HANDLE; }
74inline std::vector<const char*> sharedVulkanDeviceExtensions()
78 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
79#ifdef VK_KHR_MAINTENANCE_1_EXTENSION_NAME
80 VK_KHR_MAINTENANCE_1_EXTENSION_NAME,
82#ifdef VK_KHR_MAINTENANCE_2_EXTENSION_NAME
83 VK_KHR_MAINTENANCE_2_EXTENSION_NAME,
85#ifdef VK_KHR_MAINTENANCE_3_EXTENSION_NAME
86 VK_KHR_MAINTENANCE_3_EXTENSION_NAME,
88#ifdef VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME
89 VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME,
91#ifdef VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME
92 VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME,
94#ifdef VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME
95 VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME,
97#ifdef VK_KHR_MULTIVIEW_EXTENSION_NAME
98 VK_KHR_MULTIVIEW_EXTENSION_NAME,
100#ifdef VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
101 VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME,
103#ifdef VK_KHR_SPIRV_1_4_EXTENSION_NAME
104 VK_KHR_SPIRV_1_4_EXTENSION_NAME,
106#ifdef VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME
107 VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME,
110 VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
111 VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
112#ifdef VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME
113 VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
115#ifdef VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME
116 VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
118#ifdef VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME
119 VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME,
121#ifdef VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME
122 VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME,
124#ifdef VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME
125 VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,
127#ifdef VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME
128 VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
130#ifdef VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME
131 VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
133 VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME,
134 VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
136 VK_KHR_VIDEO_QUEUE_EXTENSION_NAME,
137 VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME,
138#ifdef VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME
139 VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME,
141#ifdef VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME
142 VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME,
144#ifdef VK_KHR_VIDEO_DECODE_AV1_EXTENSION_NAME
145 VK_KHR_VIDEO_DECODE_AV1_EXTENSION_NAME,
148 VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME,
149 VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME,
151#ifdef VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME
152 VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
154#ifdef VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
155 VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
157#ifdef VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME
158 VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME,
160#ifdef VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME
161 VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME,
163#ifdef VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME
164 VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME,
166#ifdef VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME
167 VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
169#ifdef VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME
170 VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME,
172#ifdef VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME
173 VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME,
175#ifdef VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
176 VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME,
194inline SharedVulkanDevice createSharedVulkanDevice(
195 QVulkanInstance* inst, VkPhysicalDevice preferredPhysDev = VK_NULL_HANDLE)
197 SharedVulkanDevice result;
201 auto* funcs = inst->functions();
207 uint32_t devCount = 0;
208 funcs->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount,
nullptr);
212 std::vector<VkPhysicalDevice> physDevs(devCount);
213 funcs->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount, physDevs.data());
217 if(preferredPhysDev != VK_NULL_HANDLE)
218 result.physDev = preferredPhysDev;
220 result.physDev = physDevs[0];
222 uint32_t qfCount = 0;
223 funcs->vkGetPhysicalDeviceQueueFamilyProperties(
224 result.physDev, &qfCount,
nullptr);
228 std::vector<VkQueueFamilyProperties> qfProps(qfCount);
229 funcs->vkGetPhysicalDeviceQueueFamilyProperties(
230 result.physDev, &qfCount, qfProps.data());
232 bool foundGfx =
false;
233 for(uint32_t i = 0; i < qfCount; i++)
235 if(!foundGfx && (qfProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT))
237 result.gfxQueueFamilyIdx = i;
240 if(qfProps[i].queueFlags & VK_QUEUE_VIDEO_DECODE_BIT_KHR)
242 result.hasVideoDecodeQueue =
true;
243 result.videoDecodeQueueFamilyIdx = i;
247 if(!foundGfx || !result.hasVideoDecodeQueue)
252 uint32_t extCount = 0;
253 funcs->vkEnumerateDeviceExtensionProperties(
254 result.physDev,
nullptr, &extCount,
nullptr);
255 std::vector<VkExtensionProperties> avail(extCount);
256 funcs->vkEnumerateDeviceExtensionProperties(
257 result.physDev,
nullptr, &extCount, avail.data());
259 auto hasExt = [&](
const char* name) {
261 if(
std::strcmp(e.extensionName, name) == 0)
270 auto wantedExtensions = sharedVulkanDeviceExtensions();
271 std::vector<const char*> extPtrs;
272 for(
auto* ext : wantedExtensions)
276 result.enabledExtensions.push_back(ext);
277 extPtrs.push_back(ext);
283 auto vkGetPhysicalDeviceFeatures2Fn
284 =
reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2
>(
285 inst->getInstanceProcAddr(
"vkGetPhysicalDeviceFeatures2"));
286 if(!vkGetPhysicalDeviceFeatures2Fn)
290 VkPhysicalDeviceVulkan13Features vk13{};
291 vk13.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
293 VkPhysicalDeviceVulkan12Features vk12{};
294 vk12.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
297 VkPhysicalDeviceVulkan11Features vk11{};
298 vk11.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
301 VkPhysicalDeviceFeatures2 features2{};
302 features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
303 features2.pNext = &vk11;
306 vkGetPhysicalDeviceFeatures2Fn(result.physDev, &features2);
310 std::vector<VkDeviceQueueCreateInfo> queueInfos;
311 float priority = 1.0f;
312 for(uint32_t i = 0; i < qfCount; i++)
314 VkDeviceQueueCreateInfo qi{};
315 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
316 qi.queueFamilyIndex = i;
318 qi.pQueuePriorities = &priority;
319 queueInfos.push_back(qi);
321 result.queueFamilies.push_back(
322 {i, 1, qfProps[i].queueFlags});
327 VkDeviceCreateInfo devInfo{};
328 devInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
329 devInfo.pNext = &features2;
330 devInfo.queueCreateInfoCount =
static_cast<uint32_t
>(queueInfos.size());
331 devInfo.pQueueCreateInfos = queueInfos.data();
332 devInfo.enabledExtensionCount =
static_cast<uint32_t
>(extPtrs.size());
333 devInfo.ppEnabledExtensionNames = extPtrs.data();
335 auto vkCreateDeviceFn =
reinterpret_cast<PFN_vkCreateDevice
>(
336 inst->getInstanceProcAddr(
"vkCreateDevice"));
337 if(!vkCreateDeviceFn)
341 = vkCreateDeviceFn(result.physDev, &devInfo,
nullptr, &result.dev);
342 if(vkResult != VK_SUCCESS)
344 qDebug() <<
"createSharedVulkanDevice: vkCreateDevice failed:" << vkResult;
345 result.dev = VK_NULL_HANDLE;
351 auto vkGetDeviceQueueFn =
reinterpret_cast<PFN_vkGetDeviceQueue
>(
352 inst->getInstanceProcAddr(
"vkGetDeviceQueue"));
353 if(vkGetDeviceQueueFn)
355 result.dev, result.gfxQueueFamilyIdx, 0, &result.gfxQueue);
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:12