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: 48b3ef625e ("vulkan/wsi: handle queue families properly for non-concurrent sharing mode.")
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Acked-by: Jason Ekstrand <jason.ekstrand@collabora.com>
Tested-by: Mike Lothian <mike@fireburn.co.uk>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15331>
(cherry picked from commit 85a94be0fe)
This commit is contained in:
Dave Airlie 2022-03-14 05:54:20 +10:00 committed by Dylan Baker
parent d45ccc05f1
commit 238b018789
2 changed files with 18 additions and 14 deletions

View file

@ -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"
},

View file

@ -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,
};