anv: allocate fsr states for descriptor buffer

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 2023-10-25 23:39:00 +03:00 committed by Marge Bot
parent 44bf552704
commit ec73db3b8c
4 changed files with 46 additions and 5 deletions

View file

@ -3627,6 +3627,17 @@ VkResult anv_CreateDevice(
goto fail_trivial_batch;
anv_genX(device->info, init_cps_device_state)(device);
if (device->vk.enabled_extensions.EXT_descriptor_buffer) {
device->cps_states_db =
anv_state_pool_alloc(&device->dynamic_state_db_pool,
device->cps_states.alloc_size, 32);
if (device->cps_states_db.map == NULL)
goto fail_trivial_batch;
memcpy(device->cps_states_db.map, device->cps_states.map,
device->cps_states.alloc_size);
}
}
if (device->physical->indirect_descriptors) {
@ -3933,6 +3944,7 @@ void anv_DestroyDevice(
anv_state_pool_free(&device->dynamic_state_pool, device->cps_states);
anv_state_pool_free(&device->dynamic_state_pool, device->breakpoint);
if (device->vk.enabled_extensions.EXT_descriptor_buffer) {
anv_state_pool_free(&device->dynamic_state_db_pool, device->cps_states_db);
anv_state_pool_free(&device->dynamic_state_db_pool, device->slice_hash_db);
anv_state_pool_free(&device->dynamic_state_db_pool, device->border_colors_db);
anv_state_reserved_pool_finish(&device->custom_border_colors_db);

View file

@ -1789,6 +1789,7 @@ struct anv_device {
* array.
*/
struct anv_state cps_states;
struct anv_state cps_states_db;
uint32_t queue_count;
struct anv_queue * queues;
@ -3584,6 +3585,12 @@ struct anv_cmd_ray_tracing_state {
size_t build_priv_mem_size;
};
enum anv_cmd_descriptor_buffer_mode {
ANV_CMD_DESCRIPTOR_BUFFER_MODE_UNKNOWN,
ANV_CMD_DESCRIPTOR_BUFFER_MODE_LEGACY,
ANV_CMD_DESCRIPTOR_BUFFER_MODE_BUFFER,
};
/** State required while building cmd buffer */
struct anv_cmd_state {
/* PIPELINE_SELECT.PipelineSelection */
@ -3597,6 +3604,13 @@ struct anv_cmd_state {
enum anv_pipe_bits pending_pipe_bits;
/**
* Whether the last programmed STATE_BASE_ADDRESS references
* anv_device::dynamic_state_pool or anv_device::dynamic_state_pool_db for
* the dynamic state heap.
*/
enum anv_cmd_descriptor_buffer_mode current_db_mode;
struct {
/**
* Tracks operations susceptible to interfere with queries in the

View file

@ -2482,6 +2482,8 @@ genX(BeginCommandBuffer)(
cmd_buffer->usage_flags = pBeginInfo->flags;
cmd_buffer->state.current_db_mode = ANV_CMD_DESCRIPTOR_BUFFER_MODE_LEGACY;
/* VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT must be ignored for
* primary level command buffers.
*

View file

@ -93,11 +93,19 @@ genX(streamout_prologue)(struct anv_cmd_buffer *cmd_buffer)
#if GFX_VER >= 12
static uint32_t
get_cps_state_offset(struct anv_device *device, bool cps_enabled,
get_cps_state_offset(struct anv_cmd_buffer *cmd_buffer, bool cps_enabled,
const struct vk_fragment_shading_rate_state *fsr)
{
if (!cps_enabled)
return device->cps_states.offset;
struct anv_device *device = cmd_buffer->device;
if (!cps_enabled) {
assert(cmd_buffer->state.current_db_mode !=
ANV_CMD_DESCRIPTOR_BUFFER_MODE_UNKNOWN);
return cmd_buffer->state.current_db_mode ==
ANV_CMD_DESCRIPTOR_BUFFER_MODE_BUFFER ?
device->cps_states_db.offset :
device->cps_states.offset;
}
uint32_t offset;
static const uint32_t size_index[] = {
@ -122,7 +130,12 @@ get_cps_state_offset(struct anv_device *device, bool cps_enabled,
offset *= MAX_VIEWPORTS * GENX(CPS_STATE_length) * 4;
return device->cps_states.offset + offset;
assert(cmd_buffer->state.current_db_mode !=
ANV_CMD_DESCRIPTOR_BUFFER_MODE_UNKNOWN);
return (cmd_buffer->state.current_db_mode ==
ANV_CMD_DESCRIPTOR_BUFFER_MODE_BUFFER ?
device->cps_states_db.offset :
device->cps_states.offset) + offset;
}
#endif /* GFX_VER >= 12 */
@ -589,7 +602,7 @@ genX(cmd_buffer_flush_gfx_runtime_state)(struct anv_cmd_buffer *cmd_buffer)
SET(CPS, cps.MinCPSizeY, dyn->fsr.fragment_size.height);
#elif GFX_VER >= 12
SET(CPS, cps.CoarsePixelShadingStateArrayPointer,
get_cps_state_offset(device, cps_enable, &dyn->fsr));
get_cps_state_offset(cmd_buffer, cps_enable, &dyn->fsr));
#endif
}
#endif /* GFX_VER >= 11 */