radeonsi/gfx10: implement si_update_shaders

Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Nicolai Hähnle 2017-11-16 17:02:41 +01:00 committed by Marek Olšák
parent 5726ec0d24
commit 40b12c0f5a

View file

@ -3410,25 +3410,30 @@ bool si_update_shaders(struct si_context *sctx)
key.index = 0; key.index = 0;
/* Update stages before GS. */ if (sctx->tes_shader.cso)
if (sctx->tes_shader.cso) {
key.u.tess = 1; key.u.tess = 1;
if (sctx->gs_shader.cso)
key.u.gs = 1;
if (sctx->chip_class >= GFX10) {
key.u.ngg = sctx->ngg;
if (sctx->gs_shader.cso)
key.u.streamout = !!sctx->gs_shader.cso->so.num_outputs;
else if (sctx->tes_shader.cso)
key.u.streamout = !!sctx->tes_shader.cso->so.num_outputs;
else
key.u.streamout = !!sctx->vs_shader.cso->so.num_outputs;
}
/* Update TCS and TES. */
if (sctx->tes_shader.cso) {
if (!sctx->tess_rings) { if (!sctx->tess_rings) {
si_init_tess_factor_ring(sctx); si_init_tess_factor_ring(sctx);
if (!sctx->tess_rings) if (!sctx->tess_rings)
return false; return false;
} }
/* VS as LS */
if (sctx->chip_class <= GFX8) {
r = si_shader_select(ctx, &sctx->vs_shader,
&compiler_state);
if (r)
return false;
si_pm4_bind_state(sctx, ls, sctx->vs_shader.current->pm4);
}
if (sctx->tcs_shader.cso) { if (sctx->tcs_shader.cso) {
r = si_shader_select(ctx, &sctx->tcs_shader, r = si_shader_select(ctx, &sctx->tcs_shader,
&compiler_state); &compiler_state);
@ -3451,62 +3456,69 @@ bool si_update_shaders(struct si_context *sctx)
sctx->fixed_func_tcs_shader.current->pm4); sctx->fixed_func_tcs_shader.current->pm4);
} }
if (!sctx->gs_shader.cso || sctx->chip_class <= GFX8) {
r = si_shader_select(ctx, &sctx->tes_shader, &compiler_state);
if (r)
return false;
if (sctx->gs_shader.cso) { if (sctx->gs_shader.cso) {
/* TES as ES */ /* TES as ES */
if (sctx->chip_class <= GFX8) { assert(sctx->chip_class <= GFX8);
r = si_shader_select(ctx, &sctx->tes_shader,
&compiler_state);
if (r)
return false;
si_pm4_bind_state(sctx, es, sctx->tes_shader.current->pm4); si_pm4_bind_state(sctx, es, sctx->tes_shader.current->pm4);
} } else if (key.u.ngg) {
si_pm4_bind_state(sctx, gs, sctx->tes_shader.current->pm4);
} else { } else {
/* TES as VS */
r = si_shader_select(ctx, &sctx->tes_shader,
&compiler_state);
if (r)
return false;
si_pm4_bind_state(sctx, vs, sctx->tes_shader.current->pm4); si_pm4_bind_state(sctx, vs, sctx->tes_shader.current->pm4);
} }
} else if (sctx->gs_shader.cso) {
if (sctx->chip_class <= GFX8) {
/* VS as ES */
r = si_shader_select(ctx, &sctx->vs_shader,
&compiler_state);
if (r)
return false;
si_pm4_bind_state(sctx, es, sctx->vs_shader.current->pm4);
si_pm4_bind_state(sctx, ls, NULL);
si_pm4_bind_state(sctx, hs, NULL);
} }
} else { } else {
/* VS as VS */ if (sctx->chip_class <= GFX8)
r = si_shader_select(ctx, &sctx->vs_shader, &compiler_state);
if (r)
return false;
si_pm4_bind_state(sctx, vs, sctx->vs_shader.current->pm4);
si_pm4_bind_state(sctx, ls, NULL); si_pm4_bind_state(sctx, ls, NULL);
si_pm4_bind_state(sctx, hs, NULL); si_pm4_bind_state(sctx, hs, NULL);
} }
/* Update GS. */ /* Update GS. */
if (sctx->gs_shader.cso) { if (sctx->gs_shader.cso) {
key.u.gs = 1;
r = si_shader_select(ctx, &sctx->gs_shader, &compiler_state); r = si_shader_select(ctx, &sctx->gs_shader, &compiler_state);
if (r) if (r)
return false; return false;
si_pm4_bind_state(sctx, gs, sctx->gs_shader.current->pm4); si_pm4_bind_state(sctx, gs, sctx->gs_shader.current->pm4);
if (!key.u.ngg) {
si_pm4_bind_state(sctx, vs, sctx->gs_shader.cso->gs_copy_shader->pm4); si_pm4_bind_state(sctx, vs, sctx->gs_shader.cso->gs_copy_shader->pm4);
if (!si_update_gs_ring_buffers(sctx)) if (!si_update_gs_ring_buffers(sctx))
return false; return false;
} else { } else {
si_pm4_bind_state(sctx, vs, NULL);
}
} else {
if (!key.u.ngg) {
si_pm4_bind_state(sctx, gs, NULL); si_pm4_bind_state(sctx, gs, NULL);
if (sctx->chip_class <= GFX8) if (sctx->chip_class <= GFX8)
si_pm4_bind_state(sctx, es, NULL); si_pm4_bind_state(sctx, es, NULL);
} }
}
/* Update VS. */
if ((!key.u.tess && !key.u.gs) || sctx->chip_class <= GFX8) {
r = si_shader_select(ctx, &sctx->vs_shader, &compiler_state);
if (r)
return false;
if (!key.u.tess && !key.u.gs) {
if (key.u.ngg) {
si_pm4_bind_state(sctx, gs, sctx->vs_shader.current->pm4);
si_pm4_bind_state(sctx, vs, NULL);
} else {
si_pm4_bind_state(sctx, vs, sctx->vs_shader.current->pm4);
}
} else if (sctx->tes_shader.cso) {
si_pm4_bind_state(sctx, ls, sctx->vs_shader.current->pm4);
} else {
assert(sctx->gs_shader.cso);
si_pm4_bind_state(sctx, es, sctx->vs_shader.current->pm4);
}
}
si_update_vgt_shader_config(sctx, key); si_update_vgt_shader_config(sctx, key);