summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/radeonsi/si_state_shaders.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 032d7a09cc4..2a2b5077398 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -2960,6 +2960,8 @@ static void si_update_common_shader_state(struct si_context *sctx)
sctx->do_update_shaders = true;
}
+static bool si_update_ngg(struct si_context *sctx);
+
static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
{
struct si_context *sctx = (struct si_context *)ctx;
@@ -2974,6 +2976,9 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
sctx->vs_shader.current = sel ? sel->first_variant : NULL;
sctx->num_vs_blit_sgprs = sel ? sel->info.properties[TGSI_PROPERTY_VS_BLIT_SGPRS_AMD] : 0;
+ if (si_update_ngg(sctx))
+ si_shader_change_notify(sctx);
+
si_update_common_shader_state(sctx);
si_update_vs_viewport_state(sctx);
si_set_active_descriptors_for_shader(sctx, sel);
@@ -2997,14 +3002,22 @@ static void si_update_tess_uses_prim_id(struct si_context *sctx)
static bool si_update_ngg(struct si_context *sctx)
{
- if (!sctx->screen->use_ngg)
+ if (!sctx->screen->use_ngg) {
+ assert(!sctx->ngg);
return false;
+ }
bool new_ngg = true;
if (sctx->gs_shader.cso && sctx->tes_shader.cso &&
- sctx->gs_shader.cso->tess_turns_off_ngg)
+ sctx->gs_shader.cso->tess_turns_off_ngg) {
new_ngg = false;
+ } else if (!sctx->screen->use_ngg_streamout) {
+ struct si_shader_selector *last = si_get_vs(sctx)->cso;
+
+ if (last && last->so.num_outputs)
+ new_ngg = false;
+ }
if (new_ngg != sctx->ngg) {
/* Transitioning from NGG to legacy GS requires VGT_FLUSH on Navi10-14.
@@ -3097,11 +3110,11 @@ static void si_bind_tes_shader(struct pipe_context *ctx, void *state)
si_update_common_shader_state(sctx);
sctx->last_rast_prim = -1; /* reset this so that it gets updated */
- if (enable_changed) {
- si_update_ngg(sctx);
+ bool ngg_changed = si_update_ngg(sctx);
+ if (ngg_changed || enable_changed)
si_shader_change_notify(sctx);
+ if (enable_changed)
sctx->last_tes_sh_base = -1; /* invalidate derived tess state */
- }
si_update_vs_viewport_state(sctx);
si_set_active_descriptors_for_shader(sctx, sel);
si_update_streamout_state(sctx);