diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index cb4cc4dbb0a..3db28a729d8 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -2042,12 +2042,7 @@ 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 && - /* 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); + sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0; 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 a66a752163e..06e8934fd18 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1084,7 +1084,7 @@ struct si_context { /* shader information */ uint64_t ps_inputs_read_or_disabled; struct si_vertex_elements *vertex_elements; - unsigned num_vertex_elements; + unsigned num_vertex_elements; /* 0 if the VS uses blit SGPRs to compute VS inputs */ unsigned cs_max_waves_per_sh; uint32_t compute_tmpring_size; bool vertex_elements_but_no_buffers; @@ -2224,6 +2224,11 @@ static inline bool si_is_buffer_idle(struct si_context *sctx, struct si_resource sctx->ws->buffer_wait(sctx->ws, buf->buf, 0, usage | RADEON_USAGE_DISALLOW_SLOW_REPLY); } +static inline bool si_vs_uses_vbos(struct si_shader_selector *sel) +{ + return !sel || !sel->info.base.vs.blit_sgprs_amd; +} + #define PRINT_ERR(fmt, args...) \ fprintf(stderr, "EE %s:%d %s - " fmt, __FILE__, __LINE__, __func__, ##args) diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 23bbf540688..dc8c4aa0ca0 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -4617,7 +4617,7 @@ static void si_bind_vertex_elements(struct pipe_context *ctx, void *state) v = sctx->no_velems_state; sctx->vertex_elements = v; - sctx->num_vertex_elements = v->count; + sctx->num_vertex_elements = si_vs_uses_vbos(sctx->shader.vs.cso) ? v->count : 0; sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0; sctx->vertex_buffer_unaligned = 0; #ifndef NDEBUG diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index 93d11327acc..746a57b0e19 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -3820,18 +3820,26 @@ static void si_update_last_vgt_stage_state(struct si_context *sctx, static void si_bind_vs_shader(struct pipe_context *ctx, void *state) { struct si_context *sctx = (struct si_context *)ctx; - struct si_shader_selector *old_hw_vs = si_get_vs(sctx)->cso; - struct si_shader *old_hw_vs_variant = si_get_vs(sctx)->current; struct si_shader_selector *sel = (struct si_shader_selector*)state; if (sctx->shader.vs.cso == sel) return; + struct si_shader_selector *old_hw_vs = si_get_vs(sctx)->cso; + struct si_shader *old_hw_vs_variant = si_get_vs(sctx)->current; + bool old_uses_vbos = si_vs_uses_vbos(sctx->shader.vs.cso); + bool new_uses_vbos = si_vs_uses_vbos(sel); + sctx->shader.vs.cso = sel; sctx->shader.vs.current = (sel && sel->variants_count) ? sel->variants[0] : NULL; sctx->num_vs_blit_sgprs = sel ? sel->info.base.vs.blit_sgprs_amd : 0; sctx->vs_uses_draw_id = sel ? sel->info.uses_drawid : false; + if (old_uses_vbos != new_uses_vbos) { + sctx->num_vertex_elements = new_uses_vbos ? sctx->vertex_elements->count : 0; + sctx->vertex_buffers_dirty = new_uses_vbos; + } + if (si_update_ngg(sctx)) si_shader_change_notify(sctx);