From d53c7513285cdcd9b5f89bc5fc801c7777b36c92 Mon Sep 17 00:00:00 2001 From: Karmjit Mahil Date: Wed, 14 Jun 2023 15:44:10 +0100 Subject: [PATCH] pvr: Change winsys flag defines to bitfields Makes it easier to see which flags are set while debugging, and prevent errors where the `BITFIELD_BIT()` is missing or using the wrong flag for something. Some fields have also been renamed to better fit with the naming scheme around the code base. Signed-off-by: Karmjit Mahil Reviewed-by: Frank Binns Part-of: --- src/imagination/vulkan/pvr_job_compute.c | 16 +++--- src/imagination/vulkan/pvr_job_render.c | 52 +++++++------------ src/imagination/vulkan/pvr_job_transfer.c | 8 ++- src/imagination/vulkan/winsys/pvr_winsys.h | 44 +++++++--------- .../winsys/pvrsrvkm/pvr_srv_job_compute.c | 4 +- .../winsys/pvrsrvkm/pvr_srv_job_render.c | 20 +++---- .../winsys/pvrsrvkm/pvr_srv_job_transfer.c | 2 +- 7 files changed, 61 insertions(+), 85 deletions(-) diff --git a/src/imagination/vulkan/pvr_job_compute.c b/src/imagination/vulkan/pvr_job_compute.c index ef00dd6d5d3..0436dcdc05c 100644 --- a/src/imagination/vulkan/pvr_job_compute.c +++ b/src/imagination/vulkan/pvr_job_compute.c @@ -162,17 +162,13 @@ static void pvr_submit_info_ext_stream_init( static void pvr_submit_info_flags_init(const struct pvr_device_info *const dev_info, const struct pvr_sub_cmd_compute *const sub_cmd, - uint32_t *const flags) + struct pvr_winsys_compute_submit_flags *flags) { - *flags = 0; - - if (sub_cmd->uses_barrier) - *flags |= PVR_WINSYS_COMPUTE_FLAG_PREVENT_ALL_OVERLAP; - - if (PVR_HAS_FEATURE(dev_info, gpu_multicore_support) && - sub_cmd->uses_atomic_ops) { - *flags |= PVR_WINSYS_COMPUTE_FLAG_SINGLE_CORE; - } + *flags = (struct pvr_winsys_compute_submit_flags){ + .prevent_all_overlap = sub_cmd->uses_barrier, + .use_single_core = PVR_HAS_FEATURE(dev_info, gpu_multicore_support) && + sub_cmd->uses_atomic_ops, + }; } static void pvr_compute_job_ws_submit_info_init( diff --git a/src/imagination/vulkan/pvr_job_render.c b/src/imagination/vulkan/pvr_job_render.c index d325e1ff2e6..7f8d1697f94 100644 --- a/src/imagination/vulkan/pvr_job_render.c +++ b/src/imagination/vulkan/pvr_job_render.c @@ -1028,19 +1028,15 @@ pvr_geom_state_stream_ext_init(struct pvr_render_ctx *ctx, state->fw_ext_stream_len = 0; } -static void pvr_geom_state_flags_init(const struct pvr_render_job *const job, - uint32_t *const flags) +static void +pvr_geom_state_flags_init(const struct pvr_render_job *const job, + struct pvr_winsys_geometry_state_flags *flags) { - *flags = 0; - - if (!job->rt_dataset->need_frag) - *flags |= PVR_WINSYS_GEOM_FLAG_FIRST_GEOMETRY; - - if (job->geometry_terminate) - *flags |= PVR_WINSYS_GEOM_FLAG_LAST_GEOMETRY; - - if (job->frag_uses_atomic_ops) - *flags |= PVR_WINSYS_GEOM_FLAG_SINGLE_CORE; + *flags = (struct pvr_winsys_geometry_state_flags){ + .is_first_geometry = !job->rt_dataset->need_frag, + .is_last_geometry = job->geometry_terminate, + .use_single_core = job->frag_uses_atomic_ops, + }; } static void @@ -1405,28 +1401,18 @@ pvr_frag_state_stream_ext_init(struct pvr_render_ctx *ctx, state->fw_ext_stream_len = 0; } -static void pvr_frag_state_flags_init(const struct pvr_render_job *const job, - uint32_t *const flags) +static void +pvr_frag_state_flags_init(const struct pvr_render_job *const job, + struct pvr_winsys_fragment_state_flags *flags) { - *flags = 0; - - if (job->has_depth_attachment) - *flags |= PVR_WINSYS_FRAG_FLAG_DEPTH_BUFFER_PRESENT; - - if (job->has_stencil_attachment) - *flags |= PVR_WINSYS_FRAG_FLAG_STENCIL_BUFFER_PRESENT; - - if (job->disable_compute_overlap) - *flags |= PVR_WINSYS_FRAG_FLAG_PREVENT_CDM_OVERLAP; - - if (job->frag_uses_atomic_ops) - *flags |= PVR_WINSYS_FRAG_FLAG_SINGLE_CORE; - - if (job->get_vis_results) - *flags |= PVR_WINSYS_FRAG_FLAG_GET_VIS_RESULTS; - - if (job->requires_spm_scratch_buffer) - *flags |= PVR_WINSYS_FRAG_FLAG_SPMSCRATCHBUFFER; + *flags = (struct pvr_winsys_fragment_state_flags){ + .has_depth_buffer = job->has_depth_attachment, + .has_stencil_buffer = job->has_stencil_attachment, + .prevent_cdm_overlap = job->disable_compute_overlap, + .use_single_core = job->frag_uses_atomic_ops, + .get_vis_results = job->get_vis_results, + .has_spm_scratch_buffer = job->requires_spm_scratch_buffer, + }; } static void diff --git a/src/imagination/vulkan/pvr_job_transfer.c b/src/imagination/vulkan/pvr_job_transfer.c index f40eac779b0..e316c009f46 100644 --- a/src/imagination/vulkan/pvr_job_transfer.c +++ b/src/imagination/vulkan/pvr_job_transfer.c @@ -163,7 +163,7 @@ struct pvr_transfer_3d_state { }; struct pvr_transfer_prep_data { - uint32_t flags; + struct pvr_winsys_transfer_cmd_flags flags; struct pvr_transfer_3d_state state; }; @@ -5740,12 +5740,10 @@ pvr_submit_info_stream_init(struct pvr_transfer_ctx *ctx, 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) + struct pvr_winsys_transfer_cmd_flags *flags) { *flags = prep_data->flags; - - if (PVR_HAS_FEATURE(dev_info, gpu_multicore_support)) - *flags |= PVR_WINSYS_TRANSFER_FLAG_SINGLE_CORE; + flags->use_single_core = PVR_HAS_FEATURE(dev_info, gpu_multicore_support); } static void pvr_transfer_job_ws_submit_info_init( diff --git a/src/imagination/vulkan/winsys/pvr_winsys.h b/src/imagination/vulkan/winsys/pvr_winsys.h index f20a277bc24..64ffa7b9821 100644 --- a/src/imagination/vulkan/winsys/pvr_winsys.h +++ b/src/imagination/vulkan/winsys/pvr_winsys.h @@ -240,8 +240,6 @@ 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 @@ -277,8 +275,9 @@ struct pvr_winsys_transfer_cmd { uint8_t fw_stream[172]; uint32_t fw_stream_len; - /* Must be 0 or a combination of PVR_WINSYS_TRANSFER_FLAG_* flags. */ - uint32_t flags; + struct pvr_winsys_transfer_cmd_flags { + bool use_single_core : 1; + } flags; }; struct pvr_winsys_transfer_submit_info { @@ -291,9 +290,6 @@ struct pvr_winsys_transfer_submit_info { struct pvr_winsys_transfer_cmd cmds[PVR_TRANSFER_MAX_PREPARES_PER_SUBMIT]; }; -#define PVR_WINSYS_COMPUTE_FLAG_PREVENT_ALL_OVERLAP BITFIELD_BIT(0U) -#define PVR_WINSYS_COMPUTE_FLAG_SINGLE_CORE BITFIELD_BIT(1U) - struct pvr_winsys_compute_submit_info { uint32_t frame_num; uint32_t job_num; @@ -312,21 +308,12 @@ struct pvr_winsys_compute_submit_info { uint8_t fw_ext_stream[8]; uint32_t fw_ext_stream_len; - /* Must be 0 or a combination of PVR_WINSYS_COMPUTE_FLAG_* flags. */ - uint32_t flags; + struct pvr_winsys_compute_submit_flags { + bool prevent_all_overlap : 1; + bool use_single_core : 1; + } flags; }; -#define PVR_WINSYS_GEOM_FLAG_FIRST_GEOMETRY BITFIELD_BIT(0U) -#define PVR_WINSYS_GEOM_FLAG_LAST_GEOMETRY BITFIELD_BIT(1U) -#define PVR_WINSYS_GEOM_FLAG_SINGLE_CORE BITFIELD_BIT(2U) - -#define PVR_WINSYS_FRAG_FLAG_DEPTH_BUFFER_PRESENT BITFIELD_BIT(0U) -#define PVR_WINSYS_FRAG_FLAG_STENCIL_BUFFER_PRESENT BITFIELD_BIT(1U) -#define PVR_WINSYS_FRAG_FLAG_PREVENT_CDM_OVERLAP BITFIELD_BIT(2U) -#define PVR_WINSYS_FRAG_FLAG_SINGLE_CORE BITFIELD_BIT(3U) -#define PVR_WINSYS_FRAG_FLAG_GET_VIS_RESULTS BITFIELD_BIT(4U) -#define PVR_WINSYS_FRAG_FLAG_SPMSCRATCHBUFFER BITFIELD_BIT(5U) - struct pvr_winsys_render_submit_info { struct pvr_winsys_rt_dataset *rt_dataset; uint8_t rt_data_idx; @@ -350,8 +337,11 @@ struct pvr_winsys_render_submit_info { uint8_t fw_ext_stream[12]; uint32_t fw_ext_stream_len; - /* Must be 0 or a combination of PVR_WINSYS_GEOM_FLAG_* flags. */ - uint32_t flags; + struct pvr_winsys_geometry_state_flags { + bool is_first_geometry : 1; + bool is_last_geometry : 1; + bool use_single_core : 1; + } flags; struct vk_sync *wait; } geometry; @@ -369,8 +359,14 @@ struct pvr_winsys_render_submit_info { uint8_t fw_ext_stream[8]; uint32_t fw_ext_stream_len; - /* Must be 0 or a combination of PVR_WINSYS_FRAG_FLAG_* flags. */ - uint32_t flags; + struct pvr_winsys_fragment_state_flags { + bool has_depth_buffer : 1; + bool has_stencil_buffer : 1; + bool prevent_cdm_overlap : 1; + bool use_single_core : 1; + bool get_vis_results : 1; + bool has_spm_scratch_buffer : 1; + } flags; struct vk_sync *wait; } fragment; diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_compute.c b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_compute.c index b468c587dbb..89cc9cb0ec3 100644 --- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_compute.c +++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_compute.c @@ -219,10 +219,10 @@ static void pvr_srv_compute_cmd_init( dev_info); } - if (submit_info->flags & PVR_WINSYS_COMPUTE_FLAG_PREVENT_ALL_OVERLAP) + if (submit_info->flags.prevent_all_overlap) cmd->flags |= ROGUE_FWIF_COMPUTE_FLAG_PREVENT_ALL_OVERLAP; - if (submit_info->flags & PVR_WINSYS_COMPUTE_FLAG_SINGLE_CORE) + if (submit_info->flags.use_single_core) cmd->flags |= ROGUE_FWIF_COMPUTE_FLAG_SINGLE_CORE; } diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_render.c b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_render.c index 8c62cf87475..4fa6dc7cea8 100644 --- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_render.c +++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_render.c @@ -711,13 +711,13 @@ static void pvr_srv_geometry_cmd_init( dev_info); } - if (state->flags & PVR_WINSYS_GEOM_FLAG_FIRST_GEOMETRY) + if (state->flags.is_first_geometry) cmd->flags |= ROGUE_FWIF_TAFLAGS_FIRSTKICK; - if (state->flags & PVR_WINSYS_GEOM_FLAG_LAST_GEOMETRY) + if (state->flags.is_last_geometry) cmd->flags |= ROGUE_FWIF_TAFLAGS_LASTKICK; - if (state->flags & PVR_WINSYS_GEOM_FLAG_SINGLE_CORE) + if (state->flags.use_single_core) cmd->flags |= ROGUE_FWIF_TAFLAGS_SINGLE_CORE; cmd->partial_render_ta_3d_fence.ufo_addr.addr = @@ -880,22 +880,22 @@ static void pvr_srv_fragment_cmd_init( dev_info); } - if (state->flags & PVR_WINSYS_FRAG_FLAG_DEPTH_BUFFER_PRESENT) + if (state->flags.has_depth_buffer) cmd->flags |= ROGUE_FWIF_RENDERFLAGS_DEPTHBUFFER; - if (state->flags & PVR_WINSYS_FRAG_FLAG_STENCIL_BUFFER_PRESENT) + if (state->flags.has_stencil_buffer) cmd->flags |= ROGUE_FWIF_RENDERFLAGS_STENCILBUFFER; - if (state->flags & PVR_WINSYS_FRAG_FLAG_PREVENT_CDM_OVERLAP) + if (state->flags.prevent_cdm_overlap) cmd->flags |= ROGUE_FWIF_RENDERFLAGS_PREVENT_CDM_OVERLAP; - if (state->flags & PVR_WINSYS_FRAG_FLAG_SINGLE_CORE) + if (state->flags.use_single_core) cmd->flags |= ROGUE_FWIF_RENDERFLAGS_SINGLE_CORE; - if (state->flags & PVR_WINSYS_FRAG_FLAG_GET_VIS_RESULTS) + if (state->flags.get_vis_results) cmd->flags |= ROGUE_FWIF_RENDERFLAGS_GETVISRESULTS; - if (state->flags & PVR_WINSYS_FRAG_FLAG_SPMSCRATCHBUFFER) + if (state->flags.has_spm_scratch_buffer) cmd->flags |= ROGUE_FWIF_RENDERFLAGS_SPMSCRATCHBUFFER; } @@ -973,7 +973,7 @@ VkResult pvr_srv_winsys_render_submit( } } - if (submit_info->geometry.flags & PVR_WINSYS_GEOM_FLAG_FIRST_GEOMETRY) { + if (submit_info->geometry.flags.is_first_geometry) { frag_to_geom_fence_count = 1; frag_to_geom_fence_value = current_sync_value; } diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_transfer.c b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_transfer.c index 437bd68c484..d33abc90f7e 100644 --- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_transfer.c +++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_job_transfer.c @@ -230,7 +230,7 @@ static void pvr_srv_transfer_cmds_init( submit_cmd->fw_stream_len, dev_info); - if (submit_info->cmds[i].flags & PVR_WINSYS_TRANSFER_FLAG_SINGLE_CORE) + if (submit_info->cmds[i].flags.use_single_core) cmd->flags |= ROGUE_FWIF_CMDTRANSFER_SINGLE_CORE; } }