pvr: factor out pvr_rt_dataset to separate module

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-12-11 14:35:46 +01:00
parent 9b3ab2c8cf
commit 5c70230c49
8 changed files with 167 additions and 122 deletions

View file

@ -54,6 +54,7 @@ pvr_files = files(
'pvr_query_compute.c',
'pvr_queue.c',
'pvr_robustness.c',
'pvr_rt_dataset.c',
'pvr_sampler.c',
'pvr_spm.c',
'pvr_tex_state.c',

View file

@ -56,6 +56,7 @@
#include "pvr_physical_device.h"
#include "pvr_pipeline.h"
#include "pvr_query.h"
#include "pvr_rt_dataset.h"
#include "pvr_tex_state.h"
#include "pvr_types.h"
#include "pvr_usc.h"

View file

@ -637,20 +637,6 @@ void pvr_compute_update_kernel_private(
VkResult pvr_add_query_program(struct pvr_cmd_buffer *cmd_buffer,
const struct pvr_query_info *query_info);
static inline void
pvr_render_targets_datasets_destroy(struct pvr_render_target *render_target)
{
u_foreach_bit (valid_idx, render_target->valid_mask) {
struct pvr_rt_dataset *rt_dataset = render_target->rt_dataset[valid_idx];
if (rt_dataset && render_target->valid_mask & BITFIELD_BIT(valid_idx))
pvr_render_target_dataset_destroy(rt_dataset);
render_target->rt_dataset[valid_idx] = NULL;
render_target->valid_mask &= ~BITFIELD_BIT(valid_idx);
}
}
void pvr_reset_graphics_dirty_state(struct pvr_cmd_buffer *const cmd_buffer,
bool start_geom);

View file

@ -47,7 +47,6 @@
#include "pvr_border.h"
#include "pvr_buffer.h"
#include "pvr_clear.h"
#include "pvr_cmd_buffer.h"
#include "pvr_csb.h"
#include "pvr_csb_enum_helpers.h"
#include "pvr_debug.h"
@ -67,6 +66,7 @@
#include "pvr_query.h"
#include "pvr_queue.h"
#include "pvr_robustness.h"
#include "pvr_rt_dataset.h"
#include "pvr_tex_state.h"
#include "pvr_types.h"
#include "pvr_usc.h"

View file

@ -45,6 +45,7 @@
#include "pvr_physical_device.h"
#include "pvr_query.h"
#include "pvr_rogue_fw.h"
#include "pvr_rt_dataset.h"
#include "pvr_types.h"
#include "pvr_winsys.h"
#include "util/compiler.h"
@ -81,46 +82,6 @@ static_assert(ROGUE_NUM_CR_PDS_BGRND_WORDS == 3,
#define ROGUE_NUM_PT_ENTRIES_PER_PAGE 0x200U
struct pvr_rt_dataset {
struct pvr_device *device;
/* RT dataset information */
uint32_t width;
uint32_t height;
uint32_t samples;
uint32_t layers;
struct pvr_free_list *global_free_list;
struct pvr_free_list *local_free_list;
struct pvr_bo *vheap_rtc_bo;
pvr_dev_addr_t vheap_dev_addr;
pvr_dev_addr_t rtc_dev_addr;
struct pvr_bo *tpc_bo;
uint64_t tpc_stride;
uint64_t tpc_size;
struct pvr_winsys_rt_dataset *ws_rt_dataset;
/* RT data information */
struct pvr_bo *mta_bo;
struct pvr_bo *mlist_bo;
struct pvr_bo *rgn_headers_bo;
uint64_t rgn_headers_stride;
bool need_frag;
uint8_t rt_data_idx;
struct {
pvr_dev_addr_t mta_dev_addr;
pvr_dev_addr_t mlist_dev_addr;
pvr_dev_addr_t rgn_headers_dev_addr;
} rt_datas[ROGUE_NUM_RTDATAS];
};
static inline void pvr_get_samples_in_xy(uint32_t samples,
uint32_t *const x_out,
uint32_t *const y_out)
@ -286,14 +247,6 @@ static VkResult pvr_rt_vheap_rtc_data_init(struct pvr_device *device,
return VK_SUCCESS;
}
static void pvr_rt_vheap_rtc_data_fini(struct pvr_rt_dataset *rt_dataset)
{
rt_dataset->rtc_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->vheap_rtc_bo);
rt_dataset->vheap_rtc_bo = NULL;
}
static void
pvr_rt_get_tail_ptr_stride_size(const struct pvr_device *device,
const struct pvr_rt_mtile_info *mtile_info,
@ -361,12 +314,6 @@ static VkResult pvr_rt_tpc_data_init(struct pvr_device *device,
&rt_dataset->tpc_bo);
}
static void pvr_rt_tpc_data_fini(struct pvr_rt_dataset *rt_dataset)
{
pvr_bo_free(rt_dataset->device, rt_dataset->tpc_bo);
rt_dataset->tpc_bo = NULL;
}
static uint32_t
pvr_rt_get_mlist_size(const struct pvr_free_list *global_free_list,
const struct pvr_free_list *local_free_list)
@ -480,18 +427,6 @@ static VkResult pvr_rt_mta_data_init(struct pvr_device *device,
return VK_SUCCESS;
}
static void pvr_rt_mta_data_fini(struct pvr_rt_dataset *rt_dataset)
{
if (rt_dataset->mta_bo == NULL)
return;
for (uint32_t i = 0; i < ARRAY_SIZE(rt_dataset->rt_datas); i++)
rt_dataset->rt_datas[i].mta_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->mta_bo);
rt_dataset->mta_bo = NULL;
}
static VkResult
pvr_rt_mlist_data_init(struct pvr_device *device,
struct pvr_rt_dataset *rt_dataset,
@ -527,15 +462,6 @@ pvr_rt_mlist_data_init(struct pvr_device *device,
return VK_SUCCESS;
}
static void pvr_rt_mlist_data_fini(struct pvr_rt_dataset *rt_dataset)
{
for (uint32_t i = 0; i < ARRAY_SIZE(rt_dataset->rt_datas); i++)
rt_dataset->rt_datas[i].mlist_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->mlist_bo);
rt_dataset->mlist_bo = NULL;
}
static VkResult
pvr_rt_rgn_headers_data_init(struct pvr_device *device,
struct pvr_rt_dataset *rt_dataset,
@ -572,15 +498,6 @@ pvr_rt_rgn_headers_data_init(struct pvr_device *device,
return VK_SUCCESS;
}
static void pvr_rt_rgn_headers_data_fini(struct pvr_rt_dataset *rt_dataset)
{
for (uint32_t i = 0; i < ARRAY_SIZE(rt_dataset->rt_datas); i++)
rt_dataset->rt_datas[i].rgn_headers_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->rgn_headers_bo);
rt_dataset->rgn_headers_bo = NULL;
}
static VkResult pvr_rt_datas_init(struct pvr_device *device,
struct pvr_rt_dataset *rt_dataset,
const struct pvr_free_list *global_free_list,
@ -617,13 +534,6 @@ err_pvr_rt_mta_data_fini:
return result;
}
static void pvr_rt_datas_fini(struct pvr_rt_dataset *rt_dataset)
{
pvr_rt_rgn_headers_data_fini(rt_dataset);
pvr_rt_mlist_data_fini(rt_dataset);
pvr_rt_mta_data_fini(rt_dataset);
}
static void pvr_rt_dataset_ws_create_info_init(
struct pvr_rt_dataset *rt_dataset,
const struct pvr_rt_mtile_info *mtile_info,
@ -807,21 +717,6 @@ err_vk_free_rt_dataset:
return result;
}
void pvr_render_target_dataset_destroy(struct pvr_rt_dataset *rt_dataset)
{
struct pvr_device *device = rt_dataset->device;
device->ws->ops->render_target_dataset_destroy(rt_dataset->ws_rt_dataset);
pvr_rt_datas_fini(rt_dataset);
pvr_rt_tpc_data_fini(rt_dataset);
pvr_rt_vheap_rtc_data_fini(rt_dataset);
pvr_free_list_destroy(rt_dataset->local_free_list);
vk_free(&device->vk.alloc, rt_dataset);
}
static void pvr_geom_state_stream_init(struct pvr_render_ctx *ctx,
struct pvr_render_job *job,
struct pvr_winsys_geometry_state *state)

View file

@ -178,7 +178,6 @@ pvr_render_target_dataset_create(struct pvr_device *device,
uint32_t samples,
uint32_t layers,
struct pvr_rt_dataset **const rt_dataset_out);
void pvr_render_target_dataset_destroy(struct pvr_rt_dataset *dataset);
VkResult pvr_render_job_submit(struct pvr_render_ctx *ctx,
struct pvr_render_job *job,

View file

@ -0,0 +1,76 @@
/*
* Copyright © 2023 Imagination Technologies Ltd.
*
* SPDX-License-Identifier: MIT
*/
#include "pvr_rt_dataset.h"
#include "pvr_device.h"
#include "pvr_free_list.h"
static void pvr_rt_rgn_headers_data_fini(struct pvr_rt_dataset *rt_dataset)
{
for (uint32_t i = 0; i < ARRAY_SIZE(rt_dataset->rt_datas); i++)
rt_dataset->rt_datas[i].rgn_headers_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->rgn_headers_bo);
rt_dataset->rgn_headers_bo = NULL;
}
void pvr_rt_mlist_data_fini(struct pvr_rt_dataset *rt_dataset)
{
for (uint32_t i = 0; i < ARRAY_SIZE(rt_dataset->rt_datas); i++)
rt_dataset->rt_datas[i].mlist_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->mlist_bo);
rt_dataset->mlist_bo = NULL;
}
void pvr_rt_mta_data_fini(struct pvr_rt_dataset *rt_dataset)
{
if (rt_dataset->mta_bo == NULL)
return;
for (uint32_t i = 0; i < ARRAY_SIZE(rt_dataset->rt_datas); i++)
rt_dataset->rt_datas[i].mta_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->mta_bo);
rt_dataset->mta_bo = NULL;
}
void pvr_rt_datas_fini(struct pvr_rt_dataset *rt_dataset)
{
pvr_rt_rgn_headers_data_fini(rt_dataset);
pvr_rt_mlist_data_fini(rt_dataset);
pvr_rt_mta_data_fini(rt_dataset);
}
void pvr_rt_tpc_data_fini(struct pvr_rt_dataset *rt_dataset)
{
pvr_bo_free(rt_dataset->device, rt_dataset->tpc_bo);
rt_dataset->tpc_bo = NULL;
}
void pvr_rt_vheap_rtc_data_fini(struct pvr_rt_dataset *rt_dataset)
{
rt_dataset->rtc_dev_addr = PVR_DEV_ADDR_INVALID;
pvr_bo_free(rt_dataset->device, rt_dataset->vheap_rtc_bo);
rt_dataset->vheap_rtc_bo = NULL;
}
void pvr_render_target_dataset_destroy(struct pvr_rt_dataset *rt_dataset)
{
struct pvr_device *device = rt_dataset->device;
device->ws->ops->render_target_dataset_destroy(rt_dataset->ws_rt_dataset);
pvr_rt_datas_fini(rt_dataset);
pvr_rt_tpc_data_fini(rt_dataset);
pvr_rt_vheap_rtc_data_fini(rt_dataset);
pvr_free_list_destroy(rt_dataset->local_free_list);
vk_free(&device->vk.alloc, rt_dataset);
}

View file

@ -0,0 +1,87 @@
/*
* Copyright © 2023 Imagination Technologies Ltd.
*
* SPDX-License-Identifier: MIT
*/
#ifndef PVR_RT_DATASET_H
#define PVR_RT_DATASET_H
#include <stdint.h>
#include <stdbool.h>
#include "util/bitscan.h"
#include "pvr_framebuffer.h"
#include "pvr_rogue_fw.h"
#include "pvr_types.h"
struct pvr_bo;
struct pvr_device;
struct pvr_free_list;
struct pvr_winsys_rt_dataset;
struct pvr_rt_dataset {
struct pvr_device *device;
/* RT dataset information */
uint32_t width;
uint32_t height;
uint32_t samples;
uint32_t layers;
struct pvr_free_list *global_free_list;
struct pvr_free_list *local_free_list;
struct pvr_bo *vheap_rtc_bo;
pvr_dev_addr_t vheap_dev_addr;
pvr_dev_addr_t rtc_dev_addr;
struct pvr_bo *tpc_bo;
uint64_t tpc_stride;
uint64_t tpc_size;
struct pvr_winsys_rt_dataset *ws_rt_dataset;
/* RT data information */
struct pvr_bo *mta_bo;
struct pvr_bo *mlist_bo;
struct pvr_bo *rgn_headers_bo;
uint64_t rgn_headers_stride;
bool need_frag;
uint8_t rt_data_idx;
struct {
pvr_dev_addr_t mta_dev_addr;
pvr_dev_addr_t mlist_dev_addr;
pvr_dev_addr_t rgn_headers_dev_addr;
} rt_datas[ROGUE_NUM_RTDATAS];
};
void pvr_rt_datas_fini(struct pvr_rt_dataset *rt_dataset);
void pvr_rt_mlist_data_fini(struct pvr_rt_dataset *rt_dataset);
void pvr_rt_mta_data_fini(struct pvr_rt_dataset *rt_dataset);
void pvr_rt_tpc_data_fini(struct pvr_rt_dataset *rt_dataset);
void pvr_rt_vheap_rtc_data_fini(struct pvr_rt_dataset *rt_dataset);
void pvr_render_target_dataset_destroy(struct pvr_rt_dataset *rt_dataset);
static inline void
pvr_render_targets_datasets_destroy(struct pvr_render_target *render_target)
{
u_foreach_bit (valid_idx, render_target->valid_mask) {
struct pvr_rt_dataset *rt_dataset = render_target->rt_dataset[valid_idx];
if (rt_dataset && render_target->valid_mask & BITFIELD_BIT(valid_idx))
pvr_render_target_dataset_destroy(rt_dataset);
render_target->rt_dataset[valid_idx] = NULL;
render_target->valid_mask &= ~BITFIELD_BIT(valid_idx);
}
}
#endif /* PVR_RT_DATASET_H */