radeonsi: add assertion requiring binding vertex elements before vertex_buffers

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27736>
This commit is contained in:
Marek Olšák
2024-02-01 02:15:11 -05:00
committed by Marge Bot
parent 1638d486ff
commit 7bf5d2ce75
4 changed files with 14 additions and 1 deletions

View File

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

View File

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

View File

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

View File

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