agx: Remap varyings to match AGX ABI
It's not clear if this is software or hardware defined, but until we know more about linkage, let's match the blob. Fixes dEQP issues with gl_PointSize. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Acked-by: Jason Ekstrand <jason@jlekstrand.net> Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10582>
This commit is contained in:

committed by
Alyssa Rosenzweig

parent
2470a080d2
commit
8b8c1a2827
@@ -133,6 +133,36 @@ agx_optimize_nir(nir_shader *nir)
|
||||
NIR_PASS_V(nir, nir_opt_move, move_all);
|
||||
}
|
||||
|
||||
/* ABI: position first, then user, then psiz */
|
||||
static void
|
||||
agx_remap_varyings(nir_shader *nir)
|
||||
{
|
||||
unsigned base = 0;
|
||||
|
||||
nir_variable *pos = nir_find_variable_with_location(nir, nir_var_shader_out, VARYING_SLOT_POS);
|
||||
if (pos) {
|
||||
pos->data.driver_location = base;
|
||||
base += 4;
|
||||
}
|
||||
|
||||
nir_foreach_shader_out_variable(var, nir) {
|
||||
unsigned loc = var->data.location;
|
||||
|
||||
if(loc == VARYING_SLOT_POS || loc == VARYING_SLOT_PSIZ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var->data.driver_location = base;
|
||||
base += 4;
|
||||
}
|
||||
|
||||
nir_variable *psiz = nir_find_variable_with_location(nir, nir_var_shader_out, VARYING_SLOT_PSIZ);
|
||||
if (psiz) {
|
||||
psiz->data.driver_location = base;
|
||||
base += 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
agx_compile_shader_nir(nir_shader *nir,
|
||||
struct agx_shader_key *key,
|
||||
@@ -155,6 +185,9 @@ agx_compile_shader_nir(nir_shader *nir,
|
||||
glsl_get_natural_size_align_bytes);
|
||||
NIR_PASS_V(nir, nir_lower_indirect_derefs, nir_var_function_temp, ~0);
|
||||
|
||||
if (ctx->stage == MESA_SHADER_VERTEX)
|
||||
agx_remap_varyings(nir);
|
||||
|
||||
NIR_PASS_V(nir, nir_split_var_copies);
|
||||
NIR_PASS_V(nir, nir_lower_global_vars_to_local);
|
||||
NIR_PASS_V(nir, nir_lower_var_copies);
|
||||
|
Reference in New Issue
Block a user