zink: fix sparse queue creation

to use an explicit sparse queue, it has to actually be created along with
the device

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18784>
This commit is contained in:
Mike Blumenkrantz
2022-09-19 10:14:26 -04:00
committed by Marge Bot
parent 53004e57d6
commit 60db522ed8

View File

@@ -1459,17 +1459,17 @@ update_queue_props(struct zink_screen *screen)
uint32_t sparse_only = UINT32_MAX; uint32_t sparse_only = UINT32_MAX;
screen->sparse_queue = UINT32_MAX; screen->sparse_queue = UINT32_MAX;
for (uint32_t i = 0; i < num_queues; i++) { for (uint32_t i = 0; i < num_queues; i++) {
if (!found_gfx && (props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)) { if (props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
screen->gfx_queue = i; if (found_gfx)
continue;
screen->sparse_queue = screen->gfx_queue = i;
screen->max_queues = props[i].queueCount; screen->max_queues = props[i].queueCount;
screen->timestamp_valid_bits = props[i].timestampValidBits; screen->timestamp_valid_bits = props[i].timestampValidBits;
found_gfx = true; found_gfx = true;
if (props[i].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)
screen->sparse_queue = i;
} else if (props[i].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) } else if (props[i].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)
sparse_only = i; sparse_only = i;
} }
if (screen->sparse_queue == UINT32_MAX) if (sparse_only != UINT32_MAX)
screen->sparse_queue = sparse_only; screen->sparse_queue = sparse_only;
free(props); free(props);
} }
@@ -1479,12 +1479,10 @@ init_queue(struct zink_screen *screen)
{ {
simple_mtx_init(&screen->queue_lock, mtx_plain); simple_mtx_init(&screen->queue_lock, mtx_plain);
VKSCR(GetDeviceQueue)(screen->dev, screen->gfx_queue, 0, &screen->queue); VKSCR(GetDeviceQueue)(screen->dev, screen->gfx_queue, 0, &screen->queue);
if (screen->sparse_queue != UINT32_MAX) { if (screen->sparse_queue != screen->gfx_queue)
if (screen->sparse_queue != screen->gfx_queue) VKSCR(GetDeviceQueue)(screen->dev, screen->sparse_queue, 0, &screen->queue_sparse);
VKSCR(GetDeviceQueue)(screen->dev, screen->sparse_queue, 0, &screen->queue_sparse); else
else screen->queue_sparse = screen->queue;
screen->queue_sparse = screen->queue;
}
} }
static void static void
@@ -2138,17 +2136,27 @@ zink_create_logical_device(struct zink_screen *screen)
{ {
VkDevice dev = VK_NULL_HANDLE; VkDevice dev = VK_NULL_HANDLE;
VkDeviceQueueCreateInfo qci = {0}; VkDeviceQueueCreateInfo qci[2] = {0};
uint32_t queues[3] = {
screen->gfx_queue,
screen->sparse_queue,
};
float dummy = 0.0f; float dummy = 0.0f;
qci.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; for (unsigned i = 0; i < ARRAY_SIZE(qci); i++) {
qci.queueFamilyIndex = screen->gfx_queue; qci[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
qci.queueCount = screen->threaded && screen->max_queues > 1 ? 2 : 1; qci[i].queueFamilyIndex = queues[i];
qci.pQueuePriorities = &dummy; qci[i].queueCount = 1;
qci[i].pQueuePriorities = &dummy;
}
unsigned num_queues = 1;
if (screen->sparse_queue != screen->gfx_queue)
num_queues++;
VkDeviceCreateInfo dci = {0}; VkDeviceCreateInfo dci = {0};
dci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; dci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
dci.queueCreateInfoCount = 1; dci.queueCreateInfoCount = num_queues;
dci.pQueueCreateInfos = &qci; dci.pQueueCreateInfos = qci;
/* extensions don't have bool members in pEnabledFeatures. /* extensions don't have bool members in pEnabledFeatures.
* this requires us to pass the whole VkPhysicalDeviceFeatures2 struct * this requires us to pass the whole VkPhysicalDeviceFeatures2 struct
*/ */