anv: fix broken ray tracing dynamic descriptors

We completely missed that handling.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: e76ed91d3f ("anv: switch over to runtime pipelines")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/14284
Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38678>
This commit is contained in:
Lionel Landwerlin 2025-11-26 15:30:02 +02:00 committed by Marge Bot
parent 5c53c6e693
commit 0ca870c6f3
5 changed files with 62 additions and 1 deletions

View file

@ -520,6 +520,26 @@ update_push_descriptor_flags(struct anv_cmd_pipeline_state *state,
} }
} }
static bool
maybe_update_dynamic_buffers_indices(struct anv_cmd_pipeline_state *state,
const uint8_t *offsets)
{
struct anv_push_constants *push = &state->push_constants;
bool modified = false;
for (uint32_t i = 0; i < MAX_SETS; i++) {
if ((push->desc_surface_offsets[i] &
ANV_DESCRIPTOR_SET_DYNAMIC_INDEX_MASK) !=
offsets[i]) {
push->desc_surface_offsets[i] &= ~ANV_DESCRIPTOR_SET_DYNAMIC_INDEX_MASK;
push->desc_surface_offsets[i] |= offsets[i];
modified = true;
}
}
return modified;
}
static struct anv_cmd_pipeline_state * static struct anv_cmd_pipeline_state *
anv_cmd_buffer_get_pipeline_layout_state(struct anv_cmd_buffer *cmd_buffer, anv_cmd_buffer_get_pipeline_layout_state(struct anv_cmd_buffer *cmd_buffer,
VkPipelineBindPoint bind_point, VkPipelineBindPoint bind_point,
@ -1259,6 +1279,12 @@ anv_cmd_buffer_set_rt_state(struct vk_command_buffer *vk_cmd_buffer,
anv_cmd_buffer_set_rt_query_buffer(cmd_buffer, &rt->base, ray_queries, anv_cmd_buffer_set_rt_query_buffer(cmd_buffer, &rt->base, ray_queries,
ANV_RT_STAGE_BITS); ANV_RT_STAGE_BITS);
} }
if (maybe_update_dynamic_buffers_indices(&rt->base,
dynamic_descriptor_offsets)) {
cmd_buffer->state.push_constants_dirty |= ANV_RT_STAGE_BITS;
rt->base.push_constants_data_dirty = true;
}
} }
void void
@ -1550,6 +1576,7 @@ bind_graphics_shaders(struct anv_cmd_buffer *cmd_buffer,
#undef diff_fix_state_stage #undef diff_fix_state_stage
#undef diff_var_state_stage #undef diff_var_state_stage
uint8_t dynamic_descriptors[MAX_SETS] = {};
for (uint32_t s = 0; s < ANV_GRAPHICS_SHADER_STAGE_COUNT; s++) { for (uint32_t s = 0; s < ANV_GRAPHICS_SHADER_STAGE_COUNT; s++) {
struct anv_shader *shader = new_shaders[s]; struct anv_shader *shader = new_shaders[s];
@ -1559,6 +1586,13 @@ bind_graphics_shaders(struct anv_cmd_buffer *cmd_buffer,
ray_queries = MAX2(ray_queries, shader->vk.ray_queries); ray_queries = MAX2(ray_queries, shader->vk.ray_queries);
if (gfx->shaders[s] != shader) if (gfx->shaders[s] != shader)
set_dirty_for_bind_map(cmd_buffer, s, &shader->bind_map); set_dirty_for_bind_map(cmd_buffer, s, &shader->bind_map);
for (uint32_t i = 0; i < MAX_SETS; i++) {
assert(dynamic_descriptors[i] == 0 ||
dynamic_descriptors[i] ==
shader->bind_map.dynamic_descriptors[i]);
dynamic_descriptors[i] = shader->bind_map.dynamic_descriptors[i];
}
} }
if (gfx->shaders[s] != shader) if (gfx->shaders[s] != shader)
@ -1683,10 +1717,22 @@ bind_graphics_shaders(struct anv_cmd_buffer *cmd_buffer,
cmd_buffer->state.gfx.shaders, cmd_buffer->state.gfx.shaders,
ARRAY_SIZE(cmd_buffer->state.gfx.shaders)); ARRAY_SIZE(cmd_buffer->state.gfx.shaders));
uint8_t dynamic_descriptor_count = 0;
uint8_t dynamic_descriptor_offsets[MAX_SETS] = {};
for (uint32_t i = 0; i < MAX_SETS; i++) {
dynamic_descriptor_offsets[i] = dynamic_descriptor_count;
dynamic_descriptor_count += dynamic_descriptors[i];
}
if (maybe_update_dynamic_buffers_indices(&gfx->base,
dynamic_descriptor_offsets)) {
cmd_buffer->state.push_constants_dirty |= gfx->active_stages;
gfx->base.push_constants_data_dirty = true;
}
if (ray_queries > 0) { if (ray_queries > 0) {
assert(cmd_buffer->device->info->verx10 >= 125); assert(cmd_buffer->device->info->verx10 >= 125);
anv_cmd_buffer_set_rt_query_buffer(cmd_buffer, &gfx->base, ray_queries, anv_cmd_buffer_set_rt_query_buffer(cmd_buffer, &gfx->base, ray_queries,
cmd_buffer->state.gfx.active_stages); gfx->active_stages);
} }
} }

View file

@ -1175,6 +1175,9 @@ struct anv_pipeline_bind_map {
BITSET_DECLARE(input_attachments, MAX_DESCRIPTOR_SET_INPUT_ATTACHMENTS + 1); BITSET_DECLARE(input_attachments, MAX_DESCRIPTOR_SET_INPUT_ATTACHMENTS + 1);
struct anv_push_range push_ranges[4]; struct anv_push_range push_ranges[4];
/* Number of dynamic descriptor in each set */
uint8_t dynamic_descriptors[MAX_SETS];
}; };
struct anv_push_descriptor_info { struct anv_push_descriptor_info {

View file

@ -82,6 +82,8 @@ anv_shader_deserialize(struct vk_device *vk_device,
blob_copy_bytes(blob, data.bind_map.input_attachments, blob_copy_bytes(blob, data.bind_map.input_attachments,
sizeof(data.bind_map.input_attachments)); sizeof(data.bind_map.input_attachments));
blob_copy_bytes(blob, data.bind_map.push_ranges, sizeof(data.bind_map.push_ranges)); blob_copy_bytes(blob, data.bind_map.push_ranges, sizeof(data.bind_map.push_ranges));
blob_copy_bytes(blob, data.bind_map.dynamic_descriptors,
sizeof(data.bind_map.dynamic_descriptors));
if (blob->overrun) if (blob->overrun)
return vk_error(device, VK_ERROR_UNKNOWN); return vk_error(device, VK_ERROR_UNKNOWN);
@ -159,6 +161,8 @@ anv_shader_serialize(struct vk_device *device,
sizeof(shader->bind_map.input_attachments)); sizeof(shader->bind_map.input_attachments));
blob_write_bytes(blob, shader->bind_map.push_ranges, blob_write_bytes(blob, shader->bind_map.push_ranges,
sizeof(shader->bind_map.push_ranges)); sizeof(shader->bind_map.push_ranges));
blob_write_bytes(blob, shader->bind_map.dynamic_descriptors,
sizeof(shader->bind_map.dynamic_descriptors));
return !blob->out_of_memory; return !blob->out_of_memory;
} }

View file

@ -108,6 +108,8 @@ struct anv_shader_data {
struct anv_pipeline_push_map push_map; struct anv_pipeline_push_map push_map;
uint8_t dynamic_descriptors[MAX_SETS];
bool uses_bt_for_push_descs; bool uses_bt_for_push_descs;
unsigned *code; unsigned *code;

View file

@ -1900,6 +1900,12 @@ anv_shader_compile(struct vk_device *vk_device,
shader_data->source_hash = ((uint32_t*)info->nir->info.source_blake3)[0]; shader_data->source_hash = ((uint32_t*)info->nir->info.source_blake3)[0];
for (uint32_t i = 0; i < info->set_layout_count; i++) {
shader_data->dynamic_descriptors[i] =
info->set_layouts[i] != NULL ?
info->set_layouts[i]->dynamic_descriptor_count : 0;
}
shader_data->bind_map.layout_type = shader_data->bind_map.layout_type =
set_layouts_get_layout_type((struct anv_descriptor_set_layout * const *)info->set_layouts, set_layouts_get_layout_type((struct anv_descriptor_set_layout * const *)info->set_layouts,
info->set_layout_count); info->set_layout_count);