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:

committed by
Marge Bot

parent
53004e57d6
commit
60db522ed8
@@ -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
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user