pvr: prepare pvr_winsys_render_ctx_create_info for multi-arch

Reviewed-by: Ashish Chauhan <ashish.chauhan@imgtec.com
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39348>
This commit is contained in:
Erik Faye-Lund 2026-01-19 17:19:15 +01:00 committed by Marge Bot
parent 2736dd1220
commit a98e22d0f7
5 changed files with 43 additions and 21 deletions

View file

@ -771,7 +771,7 @@ pvr_rogue_get_geom_state_stream_out_words(struct pvr_pds_upload *pds_program,
static void pvr_render_ctx_ws_static_state_init(
struct pvr_render_ctx *ctx,
struct pvr_winsys_render_ctx_static_state *static_state)
struct PVR_PER_ARCH(winsys_render_ctx_static_state) * static_state)
{
uint64_t *q_dst;
uint32_t *d_dst;
@ -850,7 +850,11 @@ static void pvr_render_ctx_ws_create_info_init(
create_info->priority = priority;
create_info->vdm_callstack_addr = ctx->vdm_callstack_bo->vma->dev_addr;
pvr_render_ctx_ws_static_state_init(ctx, &create_info->static_state);
#if defined(PVR_BUILD_ARCH_ROGUE)
pvr_render_ctx_ws_static_state_init(ctx, &create_info->static_state.rogue);
#else
# error "Missing arch"
#endif
}
VkResult pvr_arch_render_ctx_create(struct pvr_device *device,

View file

@ -143,12 +143,16 @@ void pvr_drm_winsys_free_list_destroy(struct pvr_winsys_free_list *free_list)
}
static void pvr_drm_render_ctx_static_state_init(
enum pvr_device_arch arch,
struct pvr_winsys_render_ctx_create_info *create_info,
uint8_t *stream_ptr_start,
uint32_t *stream_len_ptr)
{
struct pvr_winsys_render_ctx_static_state *ws_static_state =
&create_info->static_state;
/* TODO: handle non-rogue GPUs */
assert(arch == PVR_DEVICE_ARCH_ROGUE);
struct pvr_rogue_winsys_render_ctx_static_state *ws_static_state =
&create_info->static_state.rogue;
uint64_t *stream_ptr = (uint64_t *)stream_ptr_start;
/* Leave space for stream header. */
@ -231,7 +235,8 @@ VkResult pvr_drm_winsys_render_ctx_create(
goto err_free_ctx;
}
pvr_drm_render_ctx_static_state_init(create_info,
pvr_drm_render_ctx_static_state_init(dev_info->ident.arch,
create_info,
static_ctx_state_fw_stream,
&ctx_args.static_context_state_len);

View file

@ -190,19 +190,21 @@ struct pvr_winsys_render_ctx_create_info {
enum pvr_winsys_ctx_priority priority;
pvr_dev_addr_t vdm_callstack_addr;
struct pvr_winsys_render_ctx_static_state {
uint64_t vdm_ctx_state_base_addr;
uint64_t geom_ctx_state_base_addr;
union {
struct pvr_rogue_winsys_render_ctx_static_state {
uint64_t vdm_ctx_state_base_addr;
uint64_t geom_ctx_state_base_addr;
struct {
uint64_t vdm_ctx_store_task0;
uint32_t vdm_ctx_store_task1;
uint64_t vdm_ctx_store_task2;
struct {
uint64_t vdm_ctx_store_task0;
uint32_t vdm_ctx_store_task1;
uint64_t vdm_ctx_store_task2;
uint64_t vdm_ctx_resume_task0;
uint32_t vdm_ctx_resume_task1;
uint64_t vdm_ctx_resume_task2;
} geom_state[2];
uint64_t vdm_ctx_resume_task0;
uint32_t vdm_ctx_resume_task1;
uint64_t vdm_ctx_resume_task2;
} geom_state[2];
} rogue;
} static_state;
};

View file

@ -432,8 +432,13 @@ static void pvr_srv_render_ctx_fw_static_state_init(
struct pvr_winsys_render_ctx_create_info *create_info,
struct rogue_fwif_static_rendercontext_state *static_state)
{
struct pvr_winsys_render_ctx_static_state *ws_static_state =
&create_info->static_state;
#if defined(PVR_BUILD_ARCH_ROGUE)
struct pvr_rogue_winsys_render_ctx_static_state *ws_static_state =
&create_info->static_state.rogue;
#else
# error "Missing arch"
#endif
struct rogue_fwif_ta_regs_cswitch *regs =
&static_state->ctx_switch_geom_regs[0];

View file

@ -186,11 +186,15 @@ void pvr_srv_render_target_dataset_destroy(
}
static void pvr_srv_render_ctx_fw_static_state_init(
enum pvr_device_arch arch,
struct pvr_winsys_render_ctx_create_info *create_info,
struct rogue_fwif_static_rendercontext_state *static_state)
{
struct pvr_winsys_render_ctx_static_state *ws_static_state =
&create_info->static_state;
/* TODO: handle non-rogue GPUs */
assert(arch == PVR_DEVICE_ARCH_ROGUE);
struct pvr_rogue_winsys_render_ctx_static_state *ws_static_state =
&create_info->static_state.rogue;
struct rogue_fwif_ta_regs_cswitch *regs =
&static_state->ctx_switch_geom_regs[0];
@ -247,7 +251,9 @@ VkResult pvr_srv_winsys_render_ctx_create(
if (result != VK_SUCCESS)
goto err_close_timeline_geom;
pvr_srv_render_ctx_fw_static_state_init(create_info, &static_state);
pvr_srv_render_ctx_fw_static_state_init(dev_info->ident.arch,
create_info,
&static_state);
/* TODO: Add support for reset framework. Currently we subtract
* reset_cmd.regs size from reset_cmd size to only pass empty flags field.