From 82d772fa9b3a5eb7809921ca448b6e796a3d92b3 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 22 Feb 2024 16:30:44 +0200 Subject: [PATCH] anv: create new helper for small allocations A number of allocations during command buffer building are sourced from the dynamic state heap. They're not actually access using an offset in the dynamic state heap, it just happens to be a conveninent place. Use different helpers for thoses so we dynamically change the dynamic state heap location in the next commits. Signed-off-by: Lionel Landwerlin Reviewed-by: Ivan Briano Part-of: --- src/intel/vulkan/anv_cmd_buffer.c | 12 +++----- src/intel/vulkan/anv_genX.h | 2 +- src/intel/vulkan/anv_private.h | 14 +++++++++ src/intel/vulkan/genX_blorp_exec.c | 5 ++-- src/intel/vulkan/genX_cmd_buffer.c | 8 ++--- src/intel/vulkan/genX_cmd_compute.c | 37 ++++++++++-------------- src/intel/vulkan/genX_cmd_draw.c | 5 ++-- src/intel/vulkan/genX_cmd_draw_helpers.h | 10 +++---- 8 files changed, 46 insertions(+), 47 deletions(-) diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 5346f82176f..472bb566463 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -485,12 +485,8 @@ anv_cmd_buffer_set_ray_query_buffer(struct anv_cmd_buffer *cmd_buffer, device->ray_query_bo); /* Fill the push constants & mark them dirty. */ - struct anv_state ray_query_global_state = - anv_genX(device->info, cmd_buffer_ray_query_globals)(cmd_buffer); - struct anv_address ray_query_globals_addr = - anv_state_pool_state_address(&device->dynamic_state_pool, - ray_query_global_state); + anv_genX(device->info, cmd_buffer_ray_query_globals)(cmd_buffer); pipeline_state->push_constants.ray_query_globals = anv_address_physical(ray_query_globals_addr); cmd_buffer->state.push_constants_dirty |= stages; @@ -1085,9 +1081,9 @@ anv_cmd_buffer_gfx_push_constants(struct anv_cmd_buffer *cmd_buffer) &cmd_buffer->state.gfx.base.push_constants; struct anv_state state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, - sizeof(struct anv_push_constants), - 32 /* bottom 5 bits MBZ */); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, + sizeof(struct anv_push_constants), + 32 /* bottom 5 bits MBZ */); memcpy(state.map, data, sizeof(struct anv_push_constants)); return state; diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index 0427700fbfb..a601d9969e0 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -171,7 +171,7 @@ void genX(cmd_buffer_mark_image_written)(struct anv_cmd_buffer *cmd_buffer, void genX(cmd_emit_conditional_render_predicate)(struct anv_cmd_buffer *cmd_buffer); -struct anv_state genX(cmd_buffer_ray_query_globals)(struct anv_cmd_buffer *cmd_buffer); +struct anv_address genX(cmd_buffer_ray_query_globals)(struct anv_cmd_buffer *cmd_buffer); void genX(cmd_buffer_ensure_cfe_state)(struct anv_cmd_buffer *cmd_buffer, uint32_t total_scratch); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d7f0aa272cb..db7fa0d5d77 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3929,6 +3929,20 @@ anv_cmd_buffer_alloc_dynamic_state(struct anv_cmd_buffer *cmd_buffer, struct anv_state anv_cmd_buffer_alloc_general_state(struct anv_cmd_buffer *cmd_buffer, uint32_t size, uint32_t alignment); +static inline struct anv_state +anv_cmd_buffer_alloc_temporary_state(struct anv_cmd_buffer *cmd_buffer, + uint32_t size, uint32_t alignment) +{ + return anv_state_stream_alloc(&cmd_buffer->dynamic_state_stream, + size, alignment); +} +static inline struct anv_address +anv_cmd_buffer_temporary_state_address(struct anv_cmd_buffer *cmd_buffer, + struct anv_state state) +{ + return anv_state_pool_state_address( + &cmd_buffer->device->dynamic_state_pool, state); +} void anv_cmd_buffer_chain_command_buffers(struct anv_cmd_buffer **cmd_buffers, diff --git a/src/intel/vulkan/genX_blorp_exec.c b/src/intel/vulkan/genX_blorp_exec.c index e0d20448e4c..ff4b6c5ae16 100644 --- a/src/intel/vulkan/genX_blorp_exec.c +++ b/src/intel/vulkan/genX_blorp_exec.c @@ -193,10 +193,9 @@ blorp_alloc_vertex_buffer(struct blorp_batch *batch, uint32_t size, { struct anv_cmd_buffer *cmd_buffer = batch->driver_batch; struct anv_state vb_state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, size, 64); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, size, 64); struct anv_address vb_addr = - anv_state_pool_state_address(&cmd_buffer->device->dynamic_state_pool, - vb_state); + anv_cmd_buffer_temporary_state_address(cmd_buffer, vb_state); *addr = (struct blorp_address) { .buffer = vb_addr.bo, diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index b194d1d640c..2a88ffba431 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -5572,10 +5572,9 @@ genX(cmd_buffer_begin_companion_rcs_syncpoint)( #if GFX_VERx10 >= 125 const struct intel_device_info *info = cmd_buffer->device->info; struct anv_state syncpoint = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 2 * sizeof(uint32_t), 4); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, 2 * sizeof(uint32_t), 4); struct anv_address xcs_wait_addr = - anv_state_pool_state_address(&cmd_buffer->device->dynamic_state_pool, - syncpoint); + anv_cmd_buffer_temporary_state_address(cmd_buffer, syncpoint); struct anv_address rcs_wait_addr = anv_address_add(xcs_wait_addr, 4); /* Reset the sync point */ @@ -5654,8 +5653,7 @@ genX(cmd_buffer_end_companion_rcs_syncpoint)(struct anv_cmd_buffer *cmd_buffer, { #if GFX_VERx10 >= 125 struct anv_address xcs_wait_addr = - anv_state_pool_state_address(&cmd_buffer->device->dynamic_state_pool, - syncpoint); + anv_cmd_buffer_temporary_state_address(cmd_buffer, syncpoint); struct mi_builder b; diff --git a/src/intel/vulkan/genX_cmd_compute.c b/src/intel/vulkan/genX_cmd_compute.c index 22d9e7ecdc5..fe979fd828c 100644 --- a/src/intel/vulkan/genX_cmd_compute.c +++ b/src/intel/vulkan/genX_cmd_compute.c @@ -468,14 +468,13 @@ void genX(CmdDispatchBase)( if (prog_data->uses_num_work_groups) { struct anv_state state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 12, 4); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, 12, 4); uint32_t *sizes = state.map; sizes[0] = groupCountX; sizes[1] = groupCountY; sizes[2] = groupCountZ; cmd_buffer->state.compute.num_workgroups = - anv_state_pool_state_address(&cmd_buffer->device->dynamic_state_pool, - state); + anv_cmd_buffer_temporary_state_address(cmd_buffer, state); /* The num_workgroups buffer goes in the binding table */ cmd_buffer->state.descriptors_dirty |= VK_SHADER_STAGE_COMPUTE_BIT; @@ -532,16 +531,15 @@ void genX(CmdDispatchIndirect)( trace_intel_end_compute(&cmd_buffer->trace, 0, 0, 0); } -struct anv_state +struct anv_address genX(cmd_buffer_ray_query_globals)(struct anv_cmd_buffer *cmd_buffer) { #if GFX_VERx10 >= 125 struct anv_device *device = cmd_buffer->device; struct anv_state state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, - BRW_RT_DISPATCH_GLOBALS_SIZE, - 64); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, + BRW_RT_DISPATCH_GLOBALS_SIZE, 64); struct brw_rt_scratch_layout layout; uint32_t stack_ids_per_dss = 2048; /* TODO: can we use a lower value in * some cases? @@ -567,7 +565,7 @@ genX(cmd_buffer_ray_query_globals)(struct anv_cmd_buffer *cmd_buffer) }; GENX(RT_DISPATCH_GLOBALS_pack)(NULL, state.map, &rtdg); - return state; + return anv_cmd_buffer_temporary_state_address(cmd_buffer, state); #else unreachable("Not supported"); #endif @@ -734,10 +732,10 @@ cmd_buffer_emit_rt_dispatch_globals(struct anv_cmd_buffer *cmd_buffer, struct anv_cmd_ray_tracing_state *rt = &cmd_buffer->state.rt; struct anv_state rtdg_state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, - BRW_RT_PUSH_CONST_OFFSET + - sizeof(struct anv_push_constants), - 64); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, + BRW_RT_PUSH_CONST_OFFSET + + sizeof(struct anv_push_constants), + 64); struct GENX(RT_DISPATCH_GLOBALS) rtdg = { .MemBaseAddress = (struct anv_address) { @@ -782,10 +780,10 @@ cmd_buffer_emit_rt_dispatch_globals_indirect(struct anv_cmd_buffer *cmd_buffer, struct anv_cmd_ray_tracing_state *rt = &cmd_buffer->state.rt; struct anv_state rtdg_state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, - BRW_RT_PUSH_CONST_OFFSET + - sizeof(struct anv_push_constants), - 64); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, + BRW_RT_PUSH_CONST_OFFSET + + sizeof(struct anv_push_constants), + 64); struct GENX(RT_DISPATCH_GLOBALS) rtdg = { .MemBaseAddress = (struct anv_address) { @@ -803,9 +801,7 @@ cmd_buffer_emit_rt_dispatch_globals_indirect(struct anv_cmd_buffer *cmd_buffer, GENX(RT_DISPATCH_GLOBALS_pack)(NULL, rtdg_state.map, &rtdg); struct anv_address rtdg_addr = - anv_state_pool_state_address( - &cmd_buffer->device->dynamic_state_pool, - rtdg_state); + anv_cmd_buffer_temporary_state_address(cmd_buffer, rtdg_state); struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); @@ -912,8 +908,7 @@ cmd_buffer_trace_rays(struct anv_cmd_buffer *cmd_buffer, sizeof(struct anv_push_constants)); struct anv_address rtdg_addr = - anv_state_pool_state_address(&cmd_buffer->device->dynamic_state_pool, - rtdg_state); + anv_cmd_buffer_temporary_state_address(cmd_buffer, rtdg_state); uint8_t local_size_log2[3]; uint32_t global_size[3] = {}; diff --git a/src/intel/vulkan/genX_cmd_draw.c b/src/intel/vulkan/genX_cmd_draw.c index b2181bb7ac7..94e17fa3e1b 100644 --- a/src/intel/vulkan/genX_cmd_draw.c +++ b/src/intel/vulkan/genX_cmd_draw.c @@ -195,9 +195,8 @@ get_push_range_address(struct anv_cmd_buffer *cmd_buffer, gfx_state->base.push_constants_state = anv_cmd_buffer_gfx_push_constants(cmd_buffer); } - return anv_state_pool_state_address( - &cmd_buffer->device->dynamic_state_pool, - gfx_state->base.push_constants_state); + return anv_cmd_buffer_temporary_state_address( + cmd_buffer, gfx_state->base.push_constants_state); } default: { diff --git a/src/intel/vulkan/genX_cmd_draw_helpers.h b/src/intel/vulkan/genX_cmd_draw_helpers.h index 75956f1b9a7..2c370909ef1 100644 --- a/src/intel/vulkan/genX_cmd_draw_helpers.h +++ b/src/intel/vulkan/genX_cmd_draw_helpers.h @@ -73,14 +73,13 @@ emit_base_vertex_instance(struct anv_cmd_buffer *cmd_buffer, } struct anv_state id_state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 8, 4); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, 8, 4); ((uint32_t *)id_state.map)[0] = base_vertex; ((uint32_t *)id_state.map)[1] = base_instance; struct anv_address addr = - anv_state_pool_state_address(&cmd_buffer->device->dynamic_state_pool, - id_state); + anv_cmd_buffer_temporary_state_address(cmd_buffer, id_state); emit_base_vertex_instance_bo(cmd_buffer, addr); } @@ -89,13 +88,12 @@ static void emit_draw_index(struct anv_cmd_buffer *cmd_buffer, uint32_t draw_index) { struct anv_state state = - anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 4, 4); + anv_cmd_buffer_alloc_temporary_state(cmd_buffer, 4, 4); ((uint32_t *)state.map)[0] = draw_index; struct anv_address addr = - anv_state_pool_state_address(&cmd_buffer->device->dynamic_state_pool, - state); + anv_cmd_buffer_temporary_state_address(cmd_buffer, state); emit_vertex_bo(cmd_buffer, addr, 4, ANV_DRAWID_VB_INDEX); }