Module: Mesa Branch: main Commit: 18fb8d3b55a38b10be56639787de3ab331c89a61 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=18fb8d3b55a38b10be56639787de3ab331c89a61
Author: Jarred Davies <[email protected]> Date: Tue Jan 31 07:18:59 2023 +0000 pvr: Enable threaded submit when supported Adds a winsys feature flag to enable threaded submit. Currently pvrsrvkm can't support threaded submit as pvrsrvkm syncs don't support VK_SYNC_FEATURE_WAIT_PENDING. Signed-off-by: Jarred Davies <[email protected]> Reviewed-by: Karmjit Mahil <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21577> --- src/imagination/vulkan/pvr_device.c | 7 +++++++ src/imagination/vulkan/pvr_queue.c | 6 ++++++ src/imagination/vulkan/winsys/pvr_winsys.h | 4 ++++ src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c | 5 +++++ 4 files changed, 22 insertions(+) diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index b1465b2b8d8..0dffb7aeaa9 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -1767,6 +1767,13 @@ VkResult pvr_CreateDevice(VkPhysicalDevice physicalDevice, goto err_close_master_fd; } + if (device->ws->features.supports_threaded_submit) { + /* Queue submission can be blocked if the kernel CCBs become full, + * so enable threaded submit to not block the submitter. + */ + vk_device_enable_threaded_submit(&device->vk); + } + device->ws->ops->get_heaps_info(device->ws, &device->heaps); result = pvr_bo_store_create(device); diff --git a/src/imagination/vulkan/pvr_queue.c b/src/imagination/vulkan/pvr_queue.c index 00acb32cdee..e2941cd9a76 100644 --- a/src/imagination/vulkan/pvr_queue.c +++ b/src/imagination/vulkan/pvr_queue.c @@ -75,6 +75,12 @@ static VkResult pvr_queue_init(struct pvr_device *device, if (result != VK_SUCCESS) return result; + if (device->ws->features.supports_threaded_submit) { + result = vk_queue_enable_submit_thread(&queue->vk); + if (result != VK_SUCCESS) + goto err_vk_queue_finish; + } + result = pvr_transfer_ctx_create(device, PVR_WINSYS_CTX_PRIORITY_MEDIUM, &transfer_ctx); diff --git a/src/imagination/vulkan/winsys/pvr_winsys.h b/src/imagination/vulkan/winsys/pvr_winsys.h index 8c33737cad5..1fa8650d410 100644 --- a/src/imagination/vulkan/winsys/pvr_winsys.h +++ b/src/imagination/vulkan/winsys/pvr_winsys.h @@ -485,6 +485,10 @@ struct pvr_winsys { struct vk_sync_type syncobj_type; struct vk_sync_timeline_type timeline_syncobj_type; + struct { + bool supports_threaded_submit : 1; + } features; + const struct pvr_winsys_ops *ops; }; diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c index a67ad9ebb37..5f05464f087 100644 --- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c +++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c @@ -684,6 +684,11 @@ struct pvr_winsys *pvr_srv_winsys_create(int master_fd, srv_ws->base.sync_types[1] = &srv_ws->base.timeline_syncobj_type.sync; srv_ws->base.sync_types[2] = NULL; + /* Threaded submit requires VK_SYNC_FEATURE_WAIT_PENDING which pvrsrv + * doesn't support. + */ + srv_ws->base.features.supports_threaded_submit = false; + result = pvr_srv_memctx_init(srv_ws); if (result != VK_SUCCESS) goto err_vk_free_srv_ws;
