From d26993a22836a55467e7efae478529a1a5a45530 Mon Sep 17 00:00:00 2001 From: Oleh Kuznetsov Date: Thu, 13 Aug 2026 14:11:46 +0100 Subject: [PATCH] vulkan: Fix queue retrieval and family selection for frame warm up When initializing VulkanFrameWarmUp, vkGetDeviceQueue was previously called directly with hardcoded family 0 and queue 0. If the application created the device with queue flags (such as VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT) or non-zero family indices, calling vkGetDeviceQueue causes a crash in Vulkan drivers (such as on Android). This change: - Uses FindComputeQueueFamilyIndex to find the compute-capable queue family. - Uses GetDeviceQueue helper to properly dispatch vkGetDeviceQueue2 when queue creation flags are present. - Sets cmd_pool_info.queueFamilyIndex to the resolved queue family. --- framework/decode/vulkan_frame_warm_up.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/framework/decode/vulkan_frame_warm_up.cpp b/framework/decode/vulkan_frame_warm_up.cpp index b3297ac891..e75d216f69 100644 --- a/framework/decode/vulkan_frame_warm_up.cpp +++ b/framework/decode/vulkan_frame_warm_up.cpp @@ -23,9 +23,11 @@ #include "vulkan_frame_warm_up.h" +#include "decoder_util.h" #include "generated/generated_vulkan_enum_to_string.h" #include "graphics/vulkan_device_util.h" #include "graphics/vulkan_resources_util.h" +#include "graphics/vulkan_util.h" #include "util/callbacks.h" #include "util/logging.h" #include "util/platform.h" @@ -51,11 +53,24 @@ VulkanFrameWarmUp::VulkanFrameWarmUp(const VulkanDeviceInfo* device device_ = device_info->handle; GFXRECON_ASSERT(device_ != VK_NULL_HANDLE); - device_table->GetDeviceQueue(device_, 0, 0, &queue_); + uint32_t queue_family_index = graphics::FindComputeQueueFamilyIndex(device_info->enabled_queue_family_flags); + if (queue_family_index == VK_QUEUE_FAMILY_IGNORED) + { + if (!device_info->enabled_queue_family_flags.queue_family_creation_flags.empty()) + { + queue_family_index = device_info->enabled_queue_family_flags.queue_family_creation_flags.begin()->first; + } + else + { + queue_family_index = 0; + } + } + + queue_ = GetDeviceQueue(device_table, device_info, queue_family_index, 0); GFXRECON_ASSERT(queue_ != VK_NULL_HANDLE); VkCommandPoolCreateInfo cmd_pool_info = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO }; - cmd_pool_info.queueFamilyIndex = 0; + cmd_pool_info.queueFamilyIndex = queue_family_index; cmd_pool_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT; VkResult result = device_table->CreateCommandPool(device_, &cmd_pool_info, nullptr, &command_pool_);