diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index 02338a071f5..a0bdaf242bb 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -2042,7 +2042,12 @@ void si_shader_pointers_mark_dirty(struct si_context *sctx) { sctx->shader_pointers_dirty = u_bit_consecutive(SI_DESCS_FIRST_SHADER, SI_NUM_DESCS - SI_DESCS_FIRST_SHADER); - sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0; + sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0 && + /* si_draw_rectangle doesn't bind vertex elements, so we shouldn't + * mark vertex buffers as dirty. We can get here due to + * si_need_gfx_cs_space. */ + (!sctx->shader.vs.cso || + !sctx->shader.vs.cso->info.base.vs.blit_sgprs_amd); si_mark_atom_dirty(sctx, &sctx->atoms.s.gfx_shader_pointers); sctx->graphics_internal_bindings_pointer_dirty = sctx->descriptors[SI_DESCS_INTERNAL].buffer != NULL; sctx->compute_internal_bindings_pointer_dirty = sctx->descriptors[SI_DESCS_INTERNAL].buffer != NULL; diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 967e207ea6d..bbe40b75551 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1089,6 +1089,7 @@ struct si_context { unsigned num_vertex_elements; unsigned cs_max_waves_per_sh; uint32_t compute_tmpring_size; + bool vertex_elements_but_no_buffers; bool uses_nontrivial_vs_inputs; bool force_trivial_vs_inputs; bool do_update_shaders; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 6a0be1e8fd9..03a6cf66b57 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -4617,6 +4617,9 @@ static void si_bind_vertex_elements(struct pipe_context *ctx, void *state) sctx->vertex_elements = v; sctx->num_vertex_elements = v->count; sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0; +#ifndef NDEBUG + sctx->vertex_elements_but_no_buffers = v->count > 0; +#endif if (old->instance_divisor_is_one != v->instance_divisor_is_one || old->instance_divisor_is_fetched != v->instance_divisor_is_fetched || @@ -4697,6 +4700,9 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count, sctx->num_vertex_buffers = count; sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0; sctx->vertex_buffer_unaligned = unaligned; +#ifndef NDEBUG + sctx->vertex_elements_but_no_buffers = false; +#endif /* Check whether alignment may have changed in a way that requires * shader changes. This check is conservative: a vertex buffer can only diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index eeb72198656..add080fa27e 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -1817,6 +1817,7 @@ static bool si_upload_and_prefetch_VB_descriptors(struct si_context *sctx, if (sctx->vertex_buffers_dirty || IS_DRAW_VERTEX_STATE) { assert(count || IS_DRAW_VERTEX_STATE); + assert(IS_DRAW_VERTEX_STATE || !sctx->vertex_elements_but_no_buffers); struct si_vertex_elements *velems = sctx->vertex_elements; unsigned alloc_size = IS_DRAW_VERTEX_STATE ?