pvr: make some winsys files multi-arch

Acked-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38922>
This commit is contained in:
Erik Faye-Lund
2025-11-25 16:29:38 +01:00
parent e762592bff
commit 13d12b33c0
16 changed files with 180 additions and 62 deletions
+23 -21
View File
@@ -17,8 +17,6 @@ pvr_entrypoints = custom_target(
)
pvr_files = files(
'winsys/powervr/pvr_arch_drm_job_compute.c',
'winsys/powervr/pvr_arch_drm_job_render.c',
'winsys/powervr/pvr_drm.c',
'winsys/powervr/pvr_drm_bo.c',
'winsys/powervr/pvr_drm_job_compute.c',
@@ -67,25 +65,6 @@ pvr_flags = [
no_override_init_args,
]
if with_imagination_srv
pvr_files += files(
'winsys/pvrsrvkm/pvr_arch_srv_job_compute.c',
'winsys/pvrsrvkm/pvr_arch_srv_job_render.c',
'winsys/pvrsrvkm/pvr_arch_srv_job_transfer.c',
'winsys/pvrsrvkm/pvr_srv.c',
'winsys/pvrsrvkm/pvr_srv_bo.c',
'winsys/pvrsrvkm/pvr_srv_bridge.c',
'winsys/pvrsrvkm/pvr_srv_job_common.c',
'winsys/pvrsrvkm/pvr_srv_job_compute.c',
'winsys/pvrsrvkm/pvr_srv_job_null.c',
'winsys/pvrsrvkm/pvr_srv_job_render.c',
'winsys/pvrsrvkm/pvr_srv_job_transfer.c',
'winsys/pvrsrvkm/pvr_srv_sync.c',
'winsys/pvrsrvkm/pvr_srv_sync_prim.c',
)
pvr_flags += '-DPVR_SUPPORT_SERVICES_DRIVER'
endif
common_per_arch_files = [
pvr_entrypoints[0],
sha1_h,
@@ -115,8 +94,31 @@ common_per_arch_files += files(
'pvr_arch_sampler.c',
'pvr_arch_spm.c',
'pvr_arch_tex_state.c',
'winsys/powervr/pvr_arch_drm_job_compute.c',
'winsys/powervr/pvr_arch_drm_job_render.c',
)
if with_imagination_srv
pvr_files += files(
'winsys/pvrsrvkm/pvr_srv.c',
'winsys/pvrsrvkm/pvr_srv_bo.c',
'winsys/pvrsrvkm/pvr_srv_bridge.c',
'winsys/pvrsrvkm/pvr_srv_job_common.c',
'winsys/pvrsrvkm/pvr_srv_job_compute.c',
'winsys/pvrsrvkm/pvr_srv_job_null.c',
'winsys/pvrsrvkm/pvr_srv_job_render.c',
'winsys/pvrsrvkm/pvr_srv_job_transfer.c',
'winsys/pvrsrvkm/pvr_srv_sync.c',
'winsys/pvrsrvkm/pvr_srv_sync_prim.c',
)
common_per_arch_files += files(
'winsys/pvrsrvkm/pvr_arch_srv_job_compute.c',
'winsys/pvrsrvkm/pvr_arch_srv_job_render.c',
'winsys/pvrsrvkm/pvr_arch_srv_job_transfer.c',
)
pvr_flags += '-DPVR_SUPPORT_SERVICES_DRIVER'
endif
rogue_files = files(
'rogue/pvr_blit.c',
'rogue/pvr_clear.c',
@@ -8,7 +8,7 @@
#include "pvr_csb.h"
void pvr_drm_compute_ctx_static_state_init(
void PVR_PER_ARCH(drm_compute_ctx_static_state_init)(
const struct pvr_winsys_compute_ctx_create_info *create_info,
uint8_t *stream_ptr_start,
uint32_t *stream_len_ptr)
@@ -8,7 +8,7 @@
#include "pvr_csb.h"
void pvr_drm_render_ctx_static_state_init(
void PVR_PER_ARCH(drm_render_ctx_static_state_init)(
struct pvr_winsys_render_ctx_create_info *create_info,
uint8_t *stream_ptr_start,
uint32_t *stream_len_ptr)
@@ -44,6 +44,14 @@ struct pvr_drm_winsys_compute_ctx {
#define to_pvr_drm_winsys_compute_ctx(ctx) \
container_of(ctx, struct pvr_drm_winsys_compute_ctx, base)
#define PER_ARCH_FUNCS(arch) \
void pvr_##arch##_drm_compute_ctx_static_state_init( \
const struct pvr_winsys_compute_ctx_create_info *create_info, \
uint8_t *stream_ptr_start, \
uint32_t *stream_len_ptr);
PER_ARCH_FUNCS(rogue);
VkResult pvr_drm_winsys_compute_ctx_create(
struct pvr_winsys *ws,
const struct pvr_winsys_compute_ctx_create_info *create_info,
@@ -72,9 +80,12 @@ VkResult pvr_drm_winsys_compute_ctx_create(
goto err_out;
}
pvr_drm_compute_ctx_static_state_init(create_info,
static_ctx_state_fw_stream,
&ctx_args.static_context_state_len);
enum pvr_device_arch arch = dev_info->ident.arch;
PVR_ARCH_DISPATCH(drm_compute_ctx_static_state_init,
arch,
create_info,
static_ctx_state_fw_stream,
&ctx_args.static_context_state_len);
result = pvr_ioctlf(ws->render_fd,
DRM_IOCTL_PVR_CREATE_CONTEXT,
@@ -26,6 +26,8 @@
#include <vulkan/vulkan.h>
#include "pvr_macros.h"
struct pvr_device_info;
struct pvr_winsys;
struct pvr_winsys_compute_ctx;
@@ -50,9 +52,11 @@ VkResult pvr_drm_winsys_compute_submit(
const struct pvr_device_info *dev_info,
struct vk_sync *signal_sync);
void pvr_drm_compute_ctx_static_state_init(
#ifdef PVR_PER_ARCH
void PVR_PER_ARCH(drm_compute_ctx_static_state_init)(
const struct pvr_winsys_compute_ctx_create_info *create_info,
uint8_t *stream_ptr_start,
uint32_t *stream_len_ptr);
#endif
#endif /* PVR_DRM_JOB_COMPUTE_H */
@@ -155,6 +155,14 @@ struct pvr_drm_winsys_render_ctx {
#define to_pvr_drm_winsys_render_ctx(ctx) \
container_of(ctx, struct pvr_drm_winsys_render_ctx, base)
#define PER_ARCH_FUNCS(arch) \
void pvr_##arch##_drm_render_ctx_static_state_init( \
struct pvr_winsys_render_ctx_create_info *create_info, \
uint8_t *stream_ptr_start, \
uint32_t *stream_len_ptr)
PER_ARCH_FUNCS(rogue);
VkResult pvr_drm_winsys_render_ctx_create(
struct pvr_winsys *ws,
struct pvr_winsys_render_ctx_create_info *create_info,
@@ -194,9 +202,12 @@ VkResult pvr_drm_winsys_render_ctx_create(
goto err_free_ctx;
}
pvr_drm_render_ctx_static_state_init(create_info,
static_ctx_state_fw_stream,
&ctx_args.static_context_state_len);
enum pvr_device_arch arch = dev_info->ident.arch;
PVR_ARCH_DISPATCH(drm_render_ctx_static_state_init,
arch,
create_info,
static_ctx_state_fw_stream,
&ctx_args.static_context_state_len);
result = pvr_ioctlf(ws->render_fd,
DRM_IOCTL_PVR_CREATE_CONTEXT,
@@ -77,9 +77,11 @@ VkResult pvr_drm_winsys_render_submit(
struct vk_sync *signal_sync_geom,
struct vk_sync *signal_sync_frag);
void pvr_drm_render_ctx_static_state_init(
#ifdef PVR_PER_ARCH
void PVR_PER_ARCH(drm_render_ctx_static_state_init)(
struct pvr_winsys_render_ctx_create_info *create_info,
uint8_t *stream_ptr_start,
uint32_t *stream_len_ptr);
#endif
#endif /* PVR_DRM_JOB_RENDER_H */
@@ -104,7 +104,7 @@ static void pvr_srv_compute_cmd_ext_stream_load(
assert((const uint8_t *)ext_stream_ptr - stream == stream_len);
}
void pvr_srv_compute_cmd_init(
void PVR_PER_ARCH(srv_compute_cmd_init)(
const struct pvr_winsys_compute_submit_info *submit_info,
struct rogue_fwif_cmd_compute *cmd,
const struct pvr_device_info *const dev_info)
@@ -299,7 +299,7 @@ static void pvr_rogue_ct_te_init(const struct pvr_device_info *dev_info,
te_regs->mtile_stride = mtile_info->mtile_x1 * mtile_info->mtile_y1;
}
VkResult pvr_srv_render_target_dataset_create(
VkResult PVR_PER_ARCH(srv_render_target_dataset_create)(
struct pvr_winsys *ws,
const struct pvr_winsys_rt_dataset_create_info *create_info,
const struct pvr_device_info *dev_info,
@@ -523,7 +523,7 @@ static void pvr_srv_geometry_cmd_ext_stream_load(
assert((const uint8_t *)ext_stream_ptr - stream == stream_len);
}
void pvr_srv_geometry_cmd_init(
void PVR_PER_ARCH(srv_geometry_cmd_init)(
const struct pvr_winsys_render_submit_info *submit_info,
const struct pvr_srv_sync_prim *sync_prim,
struct rogue_fwif_cmd_ta *cmd,
@@ -706,10 +706,11 @@ static void pvr_srv_fragment_cmd_ext_stream_load(
assert((const uint8_t *)ext_stream_ptr - stream == stream_len);
}
void pvr_srv_fragment_cmd_init(struct rogue_fwif_cmd_3d *cmd,
const struct pvr_winsys_fragment_state *state,
const struct pvr_device_info *dev_info,
uint32_t frame_num)
void PVR_PER_ARCH(srv_fragment_cmd_init)(
struct rogue_fwif_cmd_3d *cmd,
const struct pvr_winsys_fragment_state *state,
const struct pvr_device_info *dev_info,
uint32_t frame_num)
{
uint32_t ext_stream_offset;
@@ -27,7 +27,7 @@
#include "pvr_csb.h"
#include "pvr_device_info.h"
void pvr_srv_transfer_cmd_stream_load(
void PVR_PER_ARCH(srv_transfer_cmd_stream_load)(
struct rogue_fwif_cmd_transfer *const cmd,
const uint8_t *const stream,
const uint32_t stream_len,
@@ -139,6 +139,14 @@ void pvr_srv_winsys_compute_ctx_destroy(struct pvr_winsys_compute_ctx *ctx)
vk_free(srv_ws->base.alloc, srv_ctx);
}
#define PER_ARCH_FUNCS(arch) \
void pvr_##arch##_srv_compute_cmd_init( \
const struct pvr_winsys_compute_submit_info *submit_info, \
struct rogue_fwif_cmd_compute *cmd, \
const struct pvr_device_info *const dev_info)
PER_ARCH_FUNCS(rogue);
VkResult pvr_srv_winsys_compute_submit(
const struct pvr_winsys_compute_ctx *ctx,
const struct pvr_winsys_compute_submit_info *submit_info,
@@ -154,7 +162,12 @@ VkResult pvr_srv_winsys_compute_submit(
int in_fd = -1;
int fence;
pvr_srv_compute_cmd_init(submit_info, &compute_cmd, dev_info);
enum pvr_device_arch arch = dev_info->ident.arch;
PVR_ARCH_DISPATCH(srv_compute_cmd_init,
arch,
submit_info,
&compute_cmd,
dev_info);
if (submit_info->wait) {
struct pvr_srv_sync *srv_wait_sync = to_srv_sync(submit_info->wait);
@@ -26,6 +26,8 @@
#include <vulkan/vulkan.h>
#include "pvr_macros.h"
struct rogue_fwif_cmd_compute;
struct pvr_device_info;
struct pvr_winsys;
@@ -51,9 +53,11 @@ VkResult pvr_srv_winsys_compute_submit(
const struct pvr_device_info *dev_info,
struct vk_sync *signal_sync);
void pvr_srv_compute_cmd_init(
#ifdef PVR_PER_ARCH
void PVR_PER_ARCH(srv_compute_cmd_init)(
const struct pvr_winsys_compute_submit_info *submit_info,
struct rogue_fwif_cmd_compute *cmd,
const struct pvr_device_info *const dev_info);
#endif
#endif /* PVR_SRV_JOB_COMPUTE_H */
@@ -166,6 +166,45 @@ void pvr_srv_winsys_free_list_destroy(struct pvr_winsys_free_list *free_list)
vk_free(srv_ws->base.alloc, srv_free_list);
}
#define PER_ARCH_FUNCS(arch) \
VkResult pvr_##arch##_srv_render_target_dataset_create( \
struct pvr_winsys *ws, \
const struct pvr_winsys_rt_dataset_create_info *create_info, \
const struct pvr_device_info *dev_info, \
struct pvr_winsys_rt_dataset **const rt_dataset_out); \
\
void pvr_##arch##_srv_fragment_cmd_init( \
struct rogue_fwif_cmd_3d *cmd, \
const struct pvr_winsys_fragment_state *state, \
const struct pvr_device_info *dev_info, \
uint32_t frame_num); \
\
void pvr_##arch##_srv_geometry_cmd_init( \
const struct pvr_winsys_render_submit_info *submit_info, \
const struct pvr_srv_sync_prim *sync_prim, \
struct rogue_fwif_cmd_ta *cmd, \
const struct pvr_device_info *const dev_info)
PER_ARCH_FUNCS(rogue);
VkResult pvr_srv_render_target_dataset_create(
struct pvr_winsys *ws,
const struct pvr_winsys_rt_dataset_create_info *create_info,
const struct pvr_device_info *dev_info,
struct pvr_winsys_rt_dataset **const rt_dataset_out)
{
VkResult result = VK_SUCCESS;
enum pvr_device_arch arch = dev_info->ident.arch;
PVR_ARCH_DISPATCH_RET(srv_render_target_dataset_create,
arch,
result,
ws,
create_info,
dev_info,
rt_dataset_out);
return result;
}
void pvr_srv_render_target_dataset_destroy(
struct pvr_winsys_rt_dataset *rt_dataset)
{
@@ -341,19 +380,28 @@ VkResult pvr_srv_winsys_render_submit(
int fence_geom;
VkResult result;
enum pvr_device_arch arch = dev_info->ident.arch;
PVR_ARCH_DISPATCH(srv_geometry_cmd_init,
arch,
submit_info,
sync_prim,
&geom_cmd,
dev_info);
pvr_srv_geometry_cmd_init(submit_info, sync_prim, &geom_cmd, dev_info);
pvr_srv_fragment_cmd_init(&pr_cmd,
&submit_info->fragment_pr,
dev_info,
submit_info->frame_num);
PVR_ARCH_DISPATCH(srv_fragment_cmd_init,
arch,
&pr_cmd,
&submit_info->fragment_pr,
dev_info,
submit_info->frame_num);
if (submit_info->has_fragment_job) {
pvr_srv_fragment_cmd_init(&frag_cmd,
&submit_info->fragment,
dev_info,
submit_info->frame_num);
PVR_ARCH_DISPATCH(srv_fragment_cmd_init,
arch,
&frag_cmd,
&submit_info->fragment,
dev_info,
submit_info->frame_num);
frag_cmd_ptr = (uint8_t *)&frag_cmd;
frag_cmd_size = sizeof(frag_cmd);
@@ -27,6 +27,8 @@
#include <stdint.h>
#include <vulkan/vulkan.h>
#include "pvr_macros.h"
struct rogue_fwif_cmd_3d;
struct rogue_fwif_cmd_ta;
struct pvr_device_info;
@@ -62,6 +64,7 @@ VkResult pvr_srv_render_target_dataset_create(
const struct pvr_winsys_rt_dataset_create_info *create_info,
const struct pvr_device_info *dev_info,
struct pvr_winsys_rt_dataset **const rt_dataset_out);
void pvr_srv_render_target_dataset_destroy(
struct pvr_winsys_rt_dataset *rt_dataset);
@@ -79,21 +82,24 @@ VkResult pvr_srv_winsys_render_submit(
struct vk_sync *signal_sync_geom,
struct vk_sync *signal_sync_frag);
VkResult pvr_srv_render_target_dataset_create(
#ifdef PVR_PER_ARCH
VkResult PVR_PER_ARCH(srv_render_target_dataset_create)(
struct pvr_winsys *ws,
const struct pvr_winsys_rt_dataset_create_info *create_info,
const struct pvr_device_info *dev_info,
struct pvr_winsys_rt_dataset **const rt_dataset_out);
void pvr_srv_fragment_cmd_init(struct rogue_fwif_cmd_3d *cmd,
const struct pvr_winsys_fragment_state *state,
const struct pvr_device_info *dev_info,
uint32_t frame_num);
void PVR_PER_ARCH(srv_fragment_cmd_init)(
struct rogue_fwif_cmd_3d *cmd,
const struct pvr_winsys_fragment_state *state,
const struct pvr_device_info *dev_info,
uint32_t frame_num);
void pvr_srv_geometry_cmd_init(
void PVR_PER_ARCH(srv_geometry_cmd_init)(
const struct pvr_winsys_render_submit_info *submit_info,
const struct pvr_srv_sync_prim *sync_prim,
struct rogue_fwif_cmd_ta *cmd,
const struct pvr_device_info *const dev_info);
#endif
#endif /* PVR_SRV_JOB_RENDER_H */
@@ -132,6 +132,15 @@ void pvr_srv_winsys_transfer_ctx_destroy(struct pvr_winsys_transfer_ctx *ctx)
vk_free(srv_ws->base.alloc, srv_ctx);
}
#define PER_ARCH_FUNCS(arch) \
void pvr_##arch##_srv_transfer_cmd_stream_load( \
struct rogue_fwif_cmd_transfer *const cmd, \
const uint8_t *const stream, \
const uint32_t stream_len, \
const struct pvr_device_info *const dev_info)
PER_ARCH_FUNCS(rogue);
static void pvr_srv_transfer_cmds_init(
const struct pvr_winsys_transfer_submit_info *submit_info,
struct rogue_fwif_cmd_transfer *cmds,
@@ -140,16 +149,19 @@ static void pvr_srv_transfer_cmds_init(
{
memset(cmds, 0, sizeof(*cmds) * submit_info->cmd_count);
enum pvr_device_arch arch = dev_info->ident.arch;
for (uint32_t i = 0; i < cmd_count; i++) {
const struct pvr_winsys_transfer_cmd *submit_cmd = &submit_info->cmds[i];
struct rogue_fwif_cmd_transfer *cmd = &cmds[i];
cmd->cmn.frame_num = submit_info->frame_num;
pvr_srv_transfer_cmd_stream_load(cmd,
submit_cmd->fw_stream,
submit_cmd->fw_stream_len,
dev_info);
PVR_ARCH_DISPATCH(srv_transfer_cmd_stream_load,
arch,
cmd,
submit_cmd->fw_stream,
submit_cmd->fw_stream_len,
dev_info);
if (submit_info->cmds[i].flags.use_single_core)
cmd->flags |= ROGUE_FWIF_CMDTRANSFER_SINGLE_CORE;
@@ -26,6 +26,8 @@
#include <vulkan/vulkan.h>
#include "pvr_macros.h"
struct rogue_fwif_cmd_transfer;
struct pvr_device_info;
struct pvr_winsys;
@@ -50,10 +52,12 @@ VkResult pvr_srv_winsys_transfer_submit(
const struct pvr_device_info *dev_info,
struct vk_sync *signal_sync);
void pvr_srv_transfer_cmd_stream_load(
#ifdef PVR_PER_ARCH
void PVR_PER_ARCH(srv_transfer_cmd_stream_load)(
struct rogue_fwif_cmd_transfer *const cmd,
const uint8_t *const stream,
const uint32_t stream_len,
const struct pvr_device_info *const dev_info);
#endif
#endif /* PVR_SRV_JOB_TRANSFER_H */