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 <lionel.g.landwerlin@intel.com>
Reviewed-by: Ivan Briano <ivan.briano@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22151>
This commit is contained in:
Lionel Landwerlin
2024-02-22 16:30:44 +02:00
committed by Marge Bot
parent c6a91f1695
commit 82d772fa9b
8 changed files with 46 additions and 47 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;

View File

@@ -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] = {};

View File

@@ -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: {

View File

@@ -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);
}