From 238b0187897ab4eacbfd1293bbc3a560b456216c Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Mon, 14 Mar 2022 05:54:20 +1000 Subject: [PATCH] vulkan/wsi: keep allocate queue families in image, just don't fill them This changes the code so that it only looks at the passed in families when concurrent, otherwise it always allocates one. Fixes: 48b3ef625e19 ("vulkan/wsi: handle queue families properly for non-concurrent sharing mode.") Acked-by: Bas Nieuwenhuizen Acked-by: Jason Ekstrand Tested-by: Mike Lothian Part-of: (cherry picked from commit 85a94be0fec1dad9b22ee346383a4abb46a6e990) --- .pick_status.json | 2 +- src/vulkan/wsi/wsi_common.c | 30 +++++++++++++++++------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 03c5730d152..264ad5c91e3 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1228,7 +1228,7 @@ "description": "vulkan/wsi: keep allocate queue families in image, just don't fill them", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "48b3ef625e1909c1be31fbe10adb53734af38eb4" }, diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 5c89e7ceb1f..10f98844098 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -362,22 +362,26 @@ wsi_configure_image(const struct wsi_swapchain *chain, struct wsi_image_info *info) { memset(info, 0, sizeof(*info)); - uint32_t *queue_family_indices; + uint32_t queue_family_count = 1; - if (pCreateInfo->imageSharingMode == VK_SHARING_MODE_CONCURRENT) { - queue_family_indices = - vk_alloc(&chain->alloc, - sizeof(*queue_family_indices) * - pCreateInfo->queueFamilyIndexCount, - 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (!queue_family_indices) - goto err_oom; + if (pCreateInfo->imageSharingMode == VK_SHARING_MODE_CONCURRENT) + queue_family_count = pCreateInfo->queueFamilyIndexCount; + /* + * TODO: there should be no reason to allocate this, but + * 15331 shows that games crashed without doing this. + */ + uint32_t *queue_family_indices = + vk_alloc(&chain->alloc, + sizeof(*queue_family_indices) * + queue_family_count, + 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!queue_family_indices) + goto err_oom; + + if (pCreateInfo->imageSharingMode == VK_SHARING_MODE_CONCURRENT) for (uint32_t i = 0; i < pCreateInfo->queueFamilyIndexCount; i++) queue_family_indices[i] = pCreateInfo->pQueueFamilyIndices[i]; - } else { - queue_family_indices = NULL; - } info->create = (VkImageCreateInfo) { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, @@ -395,7 +399,7 @@ wsi_configure_image(const struct wsi_swapchain *chain, .tiling = VK_IMAGE_TILING_OPTIMAL, .usage = pCreateInfo->imageUsage, .sharingMode = pCreateInfo->imageSharingMode, - .queueFamilyIndexCount = pCreateInfo->queueFamilyIndexCount, + .queueFamilyIndexCount = queue_family_count, .pQueueFamilyIndices = queue_family_indices, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, };