From: Dave Airlie <airl...@redhat.com> fs outputs don't start above VARYING_SLOT_VAR0, but I assume that is there for a reason, so make an exception for fragment outputs.
This fixes with NIR: tests/spec/arb_enhanced_layouts/execution/component-layout/fs-output.shader_test Signed-off-by: Dave Airlie <airl...@redhat.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 765c827d93..4e7d54e11d 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -123,13 +123,13 @@ st_nir_assign_vs_in_locations(struct gl_program *prog, nir_shader *nir) static void st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, - gl_shader_stage stage) + gl_shader_stage stage, bool outputs) { unsigned location = 0; unsigned assigned_locations[VARYING_SLOT_TESS_MAX]; uint64_t processed_locs = 0; uint32_t processed_patch_locs = 0; - + bool is_fs_output = outputs && (stage == MESA_SHADER_FRAGMENT); nir_foreach_variable(var, var_list) { const struct glsl_type *type = var->type; @@ -159,7 +159,7 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, /* Because component packing allows varyings to share the same location * we may have already have processed this location. */ - if (processed && var->data.location >= VARYING_SLOT_VAR0) { + if (processed && (var->data.location >= VARYING_SLOT_VAR0 || is_fs_output)) { var->data.driver_location = assigned_locations[var->data.location]; *size += type_size(type); continue; @@ -687,7 +687,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, sort_varyings(&nir->outputs); st_nir_assign_var_locations(&nir->outputs, &nir->num_outputs, - nir->info.stage); + nir->info.stage, true); st_nir_fixup_varying_slots(st, &nir->outputs); } else if (nir->info.stage == MESA_SHADER_GEOMETRY || nir->info.stage == MESA_SHADER_TESS_CTRL || @@ -695,23 +695,23 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, sort_varyings(&nir->inputs); st_nir_assign_var_locations(&nir->inputs, &nir->num_inputs, - nir->info.stage); + nir->info.stage, false); st_nir_fixup_varying_slots(st, &nir->inputs); sort_varyings(&nir->outputs); st_nir_assign_var_locations(&nir->outputs, &nir->num_outputs, - nir->info.stage); + nir->info.stage, true); st_nir_fixup_varying_slots(st, &nir->outputs); } else if (nir->info.stage == MESA_SHADER_FRAGMENT) { sort_varyings(&nir->inputs); st_nir_assign_var_locations(&nir->inputs, &nir->num_inputs, - nir->info.stage); + nir->info.stage, false); st_nir_fixup_varying_slots(st, &nir->inputs); st_nir_assign_var_locations(&nir->outputs, &nir->num_outputs, - nir->info.stage); + nir->info.stage, true); } else if (nir->info.stage == MESA_SHADER_COMPUTE) { /* TODO? */ } else { -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev