diff --git a/src/imagination/vulkan/meson.build b/src/imagination/vulkan/meson.build index b42b2464a7f..656524ba477 100644 --- a/src/imagination/vulkan/meson.build +++ b/src/imagination/vulkan/meson.build @@ -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', diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index a5b55827f09..e58738eb1d0 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -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" diff --git a/src/imagination/vulkan/pvr_cmd_buffer.h b/src/imagination/vulkan/pvr_cmd_buffer.h index 217d3cb9c68..03742ccc8f9 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.h +++ b/src/imagination/vulkan/pvr_cmd_buffer.h @@ -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); diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index c36bae8a3bf..4e822da3a65 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -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" diff --git a/src/imagination/vulkan/pvr_job_render.c b/src/imagination/vulkan/pvr_job_render.c index 5ac7767adec..b0aa1f704dd 100644 --- a/src/imagination/vulkan/pvr_job_render.c +++ b/src/imagination/vulkan/pvr_job_render.c @@ -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) diff --git a/src/imagination/vulkan/pvr_job_render.h b/src/imagination/vulkan/pvr_job_render.h index 8babb2fe178..ad83930f142 100644 --- a/src/imagination/vulkan/pvr_job_render.h +++ b/src/imagination/vulkan/pvr_job_render.h @@ -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, diff --git a/src/imagination/vulkan/pvr_rt_dataset.c b/src/imagination/vulkan/pvr_rt_dataset.c new file mode 100644 index 00000000000..8f110ce707b --- /dev/null +++ b/src/imagination/vulkan/pvr_rt_dataset.c @@ -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); +} diff --git a/src/imagination/vulkan/pvr_rt_dataset.h b/src/imagination/vulkan/pvr_rt_dataset.h new file mode 100644 index 00000000000..c0e56aaf1bf --- /dev/null +++ b/src/imagination/vulkan/pvr_rt_dataset.h @@ -0,0 +1,87 @@ +/* + * Copyright © 2023 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef PVR_RT_DATASET_H +#define PVR_RT_DATASET_H + +#include +#include + +#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 */