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;

Reply via email to