mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-09 12:40:23 +01:00
panvk/utrace: Remove dynamic alloc from utrace clone builder
Based on the previous commit, we can also remove the dynamic allocation for command memory from the submit path and use the new pool instead. Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36609>
This commit is contained in:
parent
05006c21dd
commit
f37cf63880
4 changed files with 35 additions and 51 deletions
|
|
@ -865,7 +865,6 @@ panvk_queue_submit_init_utrace(struct panvk_queue_submit *submit,
|
|||
const struct vk_queue_submit *vk_submit)
|
||||
{
|
||||
MESA_TRACE_FUNC();
|
||||
struct panvk_device *dev = submit->dev;
|
||||
|
||||
if (!submit->utrace.queue_mask)
|
||||
return;
|
||||
|
|
@ -876,6 +875,7 @@ panvk_queue_submit_init_utrace(struct panvk_queue_submit *submit,
|
|||
*/
|
||||
struct panvk_utrace_flush_data *next = submit->utrace.data_storage;
|
||||
submit->utrace.data[submit->utrace.last_subqueue] = next++;
|
||||
submit->utrace.data[submit->utrace.last_subqueue]->free_self = true;
|
||||
|
||||
u_foreach_bit(i, submit->utrace.queue_mask) {
|
||||
if (i != submit->utrace.last_subqueue)
|
||||
|
|
@ -886,13 +886,9 @@ panvk_queue_submit_init_utrace(struct panvk_queue_submit *submit,
|
|||
.subqueue = i,
|
||||
.sync = wait ? submit->queue->utrace.sync : NULL,
|
||||
.wait_value = wait ? submit->queue->utrace.next_value : 0,
|
||||
.free_self = false,
|
||||
};
|
||||
}
|
||||
|
||||
if (submit->utrace.needs_clone) {
|
||||
struct panvk_pool *clone_pool = &submit->utrace.data_storage->clone_pool;
|
||||
panvk_per_arch(utrace_clone_init_pool)(clone_pool, dev);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -964,17 +960,30 @@ panvk_queue_submit_init_cmdbufs(struct panvk_queue_submit *submit,
|
|||
if (!u_trace_has_points(ut))
|
||||
continue;
|
||||
|
||||
const bool free_data = ut == submit->utrace.last_ut;
|
||||
/* The last subqueue frees the flush data itself. */
|
||||
bool free_data = ut == submit->utrace.last_ut;
|
||||
|
||||
struct u_trace clone_ut;
|
||||
if (!(cmdbuf->flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)) {
|
||||
u_trace_init(&clone_ut, &dev->utrace.utctx);
|
||||
|
||||
struct panvk_pool *clone_pool =
|
||||
&submit->utrace.data_storage->clone_pool;
|
||||
const uint64_t root_buf_size = sizeof(uint64_t) * 1024;
|
||||
struct panvk_utrace_buf *cs_root_buf =
|
||||
panvk_utrace_create_buffer(&dev->utrace.utctx, root_buf_size);
|
||||
assert(cs_root_buf);
|
||||
/* For every sq, the cs buffer needs to be freed. */
|
||||
free_data = true;
|
||||
|
||||
const struct cs_buffer cs_root = (struct cs_buffer){
|
||||
.cpu = cs_root_buf->host,
|
||||
.gpu = cs_root_buf->dev,
|
||||
.capacity = root_buf_size / sizeof(uint64_t),
|
||||
};
|
||||
|
||||
submit->utrace.data[j]->clone_cs_root = cs_root_buf;
|
||||
struct cs_builder clone_builder;
|
||||
panvk_per_arch(utrace_clone_init_builder)(&clone_builder,
|
||||
clone_pool);
|
||||
panvk_per_arch(utrace_clone_init_builder)(&clone_builder, dev,
|
||||
&cs_root);
|
||||
|
||||
u_trace_clone_append(
|
||||
u_trace_begin_iterator(ut), u_trace_end_iterator(ut), &clone_ut,
|
||||
|
|
|
|||
|
|
@ -240,48 +240,19 @@ panvk_per_arch(utrace_copy_buffer)(struct u_trace_context *utctx,
|
|||
cmd_copy_data(b, dst_addr, src_addr, size_B, false);
|
||||
}
|
||||
|
||||
void
|
||||
panvk_per_arch(utrace_clone_init_pool)(struct panvk_pool *pool,
|
||||
struct panvk_device *dev)
|
||||
{
|
||||
const struct panvk_pool_properties pool_props = {
|
||||
.slab_size = 64 * 1024,
|
||||
.label = "utrace clone pool",
|
||||
.owns_bos = true,
|
||||
};
|
||||
panvk_pool_init(pool, dev, NULL, NULL, &pool_props);
|
||||
}
|
||||
|
||||
static struct cs_buffer
|
||||
alloc_clone_buffer(void *cookie)
|
||||
{
|
||||
struct panvk_pool *pool = cookie;
|
||||
const uint32_t size = 4 * 1024;
|
||||
const uint32_t alignment = 64;
|
||||
|
||||
struct pan_ptr ptr = pan_pool_alloc_aligned(&pool->base, size, alignment);
|
||||
|
||||
return (struct cs_buffer){
|
||||
.cpu = ptr.cpu,
|
||||
.gpu = ptr.gpu,
|
||||
.capacity = size,
|
||||
};
|
||||
}
|
||||
|
||||
void
|
||||
panvk_per_arch(utrace_clone_init_builder)(struct cs_builder *b,
|
||||
struct panvk_pool *pool)
|
||||
struct panvk_device *dev,
|
||||
const struct cs_buffer *cs_root)
|
||||
{
|
||||
const struct drm_panthor_csif_info *csif_info =
|
||||
panthor_kmod_get_csif_props(pool->dev->kmod.dev);
|
||||
panthor_kmod_get_csif_props(dev->kmod.dev);
|
||||
const struct cs_builder_conf builder_conf = {
|
||||
.nr_registers = csif_info->cs_reg_count,
|
||||
.nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4),
|
||||
.alloc_buffer = alloc_clone_buffer,
|
||||
.cookie = pool,
|
||||
.ls_sb_slot = SB_ID(LS),
|
||||
};
|
||||
cs_builder_init(b, &builder_conf, (struct cs_buffer){0});
|
||||
cs_builder_init(b, &builder_conf, *cs_root);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -111,8 +111,11 @@ panvk_utrace_delete_flush_data(struct u_trace_context *utctx, void *flush_data)
|
|||
{
|
||||
struct panvk_utrace_flush_data *data = flush_data;
|
||||
|
||||
if (data->clone_pool.dev)
|
||||
panvk_pool_cleanup(&data->clone_pool);
|
||||
if (data->clone_cs_root) {
|
||||
panvk_utrace_delete_buffer(utctx, data->clone_cs_root);
|
||||
data->clone_cs_root = NULL;
|
||||
}
|
||||
|
||||
free(data);
|
||||
if (data->free_self)
|
||||
free(data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ struct panvk_utrace_flush_data {
|
|||
struct vk_sync *sync;
|
||||
uint64_t wait_value;
|
||||
|
||||
struct panvk_pool clone_pool;
|
||||
struct panvk_utrace_buf *clone_cs_root;
|
||||
bool free_self;
|
||||
};
|
||||
|
||||
struct panvk_utrace_buf {
|
||||
|
|
@ -68,11 +69,11 @@ void panvk_per_arch(utrace_copy_buffer)(struct u_trace_context *utctx,
|
|||
uint64_t to_offset, uint64_t size_B);
|
||||
|
||||
struct cs_builder;
|
||||
struct cs_buffer;
|
||||
|
||||
void panvk_per_arch(utrace_clone_init_pool)(struct panvk_pool *pool,
|
||||
struct panvk_device *dev);
|
||||
void panvk_per_arch(utrace_clone_init_builder)(struct cs_builder *b,
|
||||
struct panvk_pool *pool);
|
||||
struct panvk_device *dev,
|
||||
const struct cs_buffer *cs_root);
|
||||
void panvk_per_arch(utrace_clone_finish_builder)(struct cs_builder *b);
|
||||
|
||||
#else /* PAN_ARCH >= 10 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue