pvr: Support single core transfer queue commands on multicore GPUs
authorSarah Walker <sarah.walker@imgtec.com>
Wed, 16 Nov 2022 17:15:28 +0000 (17:15 +0000)
committerMarge Bot <emma+marge@anholt.net>
Wed, 19 Apr 2023 11:01:06 +0000 (11:01 +0000)
Co-authored-by: Matt Coster <matt.coster@imgtec.com>
Signed-off-by: Sarah Walker <sarah.walker@imgtec.com>
Signed-off-by: Matt Coster <matt.coster@imgtec.com>
Acked-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21550>

src/imagination/vulkan/pvr_job_transfer.c
src/imagination/vulkan/winsys/pvr_winsys.h
src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_transfer.c

index 30effb0..96988f3 100644 (file)
@@ -5038,6 +5038,17 @@ pvr_submit_info_stream_init(struct pvr_transfer_ctx *ctx,
    assert(cmd->fw_stream_len <= ARRAY_SIZE(cmd->fw_stream));
 }
 
+static void
+pvr_submit_info_flags_init(const struct pvr_device_info *const dev_info,
+                           const struct pvr_transfer_prep_data *const prep_data,
+                           uint32_t *const flags)
+{
+   *flags = prep_data->flags;
+
+   if (PVR_HAS_FEATURE(dev_info, gpu_multicore_support))
+      *flags |= PVR_WINSYS_TRANSFER_FLAG_SINGLE_CORE;
+}
+
 static void pvr_transfer_job_ws_submit_info_init(
    struct pvr_transfer_ctx *ctx,
    struct pvr_transfer_submit *submit,
@@ -5045,6 +5056,7 @@ static void pvr_transfer_job_ws_submit_info_init(
    struct pvr_winsys_transfer_submit_info *submit_info)
 {
    const struct pvr_device *const device = ctx->device;
+   const struct pvr_device_info *const dev_info = &device->pdevice->dev_info;
 
    submit_info->frame_num = device->global_queue_present_count;
    submit_info->job_num = device->global_cmd_buffer_submit_count;
@@ -5056,8 +5068,7 @@ static void pvr_transfer_job_ws_submit_info_init(
       struct pvr_transfer_prep_data *prep_data = &submit->prep_array[i];
 
       pvr_submit_info_stream_init(ctx, prep_data, cmd);
-
-      cmd->flags = prep_data->flags;
+      pvr_submit_info_flags_init(dev_info, prep_data, &cmd->flags);
    }
 }
 
index 08d4989..469d41d 100644 (file)
@@ -251,6 +251,8 @@ struct pvr_winsys_transfer_ctx {
    struct pvr_winsys *ws;
 };
 
+#define PVR_WINSYS_TRANSFER_FLAG_SINGLE_CORE BITFIELD_BIT(0U)
+
 #define PVR_TRANSFER_MAX_PREPARES_PER_SUBMIT 16U
 #define PVR_TRANSFER_MAX_RENDER_TARGETS 3U
 
index 3e925f3..31daa69 100644 (file)
@@ -228,6 +228,9 @@ static void pvr_srv_transfer_cmds_init(
                                        submit_cmd->fw_stream,
                                        submit_cmd->fw_stream_len,
                                        dev_info);
+
+      if (submit_info->cmds[i].flags & PVR_WINSYS_TRANSFER_FLAG_SINGLE_CORE)
+         cmd->flags |= ROGUE_FWIF_CMDTRANSFER_SINGLE_CORE;
    }
 }