mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 04:45:58 +01:00
parent
d253d70786
commit
3232697252
1 changed files with 41 additions and 11 deletions
|
@ -457,17 +457,18 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
||||||
// For dmabuf import we require at least the external_memory_fd,
|
// For dmabuf import we require at least the external_memory_fd,
|
||||||
// external_memory_dma_buf, queue_family_foreign and
|
// external_memory_dma_buf, queue_family_foreign and
|
||||||
// image_drm_format_modifier extensions.
|
// image_drm_format_modifier extensions.
|
||||||
const char *extensions[] = {
|
// The size is set to a large number to allow for other conditional
|
||||||
VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
|
// extensions before the device is created
|
||||||
VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
|
const char *extensions[32] = {0};
|
||||||
VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, // or vulkan 1.2
|
size_t extensions_len = 0;
|
||||||
VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,
|
extensions[extensions_len++] = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME;
|
||||||
VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME,
|
extensions[extensions_len++] = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME;
|
||||||
VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
|
extensions[extensions_len++] = VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME; // or vulkan 1.2
|
||||||
VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, // or vulkan 1.2
|
extensions[extensions_len++] = VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME;
|
||||||
VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, // or vulkan 1.3
|
extensions[extensions_len++] = VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME;
|
||||||
};
|
extensions[extensions_len++] = VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME;
|
||||||
size_t extensions_len = sizeof(extensions) / sizeof(extensions[0]);
|
extensions[extensions_len++] = VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME; // or vulkan 1.2
|
||||||
|
extensions[extensions_len++] = VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME; // or vulkan 1.3
|
||||||
|
|
||||||
for (size_t i = 0; i < extensions_len; i++) {
|
for (size_t i = 0; i < extensions_len; i++) {
|
||||||
if (!check_extension(avail_ext_props, avail_extc, extensions[i])) {
|
if (!check_extension(avail_ext_props, avail_extc, extensions[i])) {
|
||||||
|
@ -551,6 +552,23 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
||||||
.pQueuePriorities = &prio,
|
.pQueuePriorities = &prio,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
VkDeviceQueueGlobalPriorityCreateInfoKHR global_priority;
|
||||||
|
bool has_global_priority = check_extension(avail_ext_props, avail_extc,
|
||||||
|
VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME);
|
||||||
|
if (has_global_priority) {
|
||||||
|
// If global priorities are supported, request a high-priority context
|
||||||
|
global_priority = (VkDeviceQueueGlobalPriorityCreateInfoKHR){
|
||||||
|
.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR,
|
||||||
|
.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR,
|
||||||
|
};
|
||||||
|
qinfo.pNext = &global_priority;
|
||||||
|
extensions[extensions_len++] = VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME;
|
||||||
|
wlr_log(WLR_DEBUG, "Requesting a high-priority device queue");
|
||||||
|
} else {
|
||||||
|
wlr_log(WLR_DEBUG, "Global priorities are not supported, "
|
||||||
|
"falling back to regular queue priority");
|
||||||
|
}
|
||||||
|
|
||||||
VkPhysicalDeviceSamplerYcbcrConversionFeatures sampler_ycbcr_features = {
|
VkPhysicalDeviceSamplerYcbcrConversionFeatures sampler_ycbcr_features = {
|
||||||
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,
|
||||||
.samplerYcbcrConversion = dev->sampler_ycbcr_conversion,
|
.samplerYcbcrConversion = dev->sampler_ycbcr_conversion,
|
||||||
|
@ -574,7 +592,19 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
||||||
.ppEnabledExtensionNames = extensions,
|
.ppEnabledExtensionNames = extensions,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert(extensions_len < sizeof(extensions) / sizeof(extensions[0]));
|
||||||
|
|
||||||
res = vkCreateDevice(phdev, &dev_info, NULL, &dev->dev);
|
res = vkCreateDevice(phdev, &dev_info, NULL, &dev->dev);
|
||||||
|
|
||||||
|
if (has_global_priority && (res == VK_ERROR_NOT_PERMITTED_EXT ||
|
||||||
|
res == VK_ERROR_INITIALIZATION_FAILED)) {
|
||||||
|
// Try to recover from the driver denying a global priority queue
|
||||||
|
wlr_log(WLR_DEBUG, "Failed to obtain a high-priority device queue, "
|
||||||
|
"falling back to regular queue priority");
|
||||||
|
qinfo.pNext = NULL;
|
||||||
|
res = vkCreateDevice(phdev, &dev_info, NULL, &dev->dev);
|
||||||
|
}
|
||||||
|
|
||||||
if (res != VK_SUCCESS) {
|
if (res != VK_SUCCESS) {
|
||||||
wlr_vk_error("Failed to create vulkan device", res);
|
wlr_vk_error("Failed to create vulkan device", res);
|
||||||
goto error;
|
goto error;
|
||||||
|
|
Loading…
Reference in a new issue