This actually tries to pack any output with an explicit location we just let the optimisiation passes clean up the extra assignments if there was no actual packing done. --- src/glsl/link_varyings.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index dd96c03..2908af7 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -1849,6 +1849,23 @@ assign_varying_locations(struct gl_context *ctx, } if (consumer) { + if (consumer->Stage == MESA_SHADER_FRAGMENT) { + /* Since we only pack frag shader outputs with an explicit location + * we only need to count those inputs. + */ + const uint64_t reserved_slots = + reserved_varying_slot(consumer, ir_var_shader_out, + FRAG_RESULT_DATA0); + + /* Pack frag outputs with the component layout qualifier */ + unsigned frag_outs = _mesa_bitcount_64(reserved_slots); + if (frag_outs > 0) + lower_packed_varyings(mem_ctx, frag_outs, + ir_var_shader_out, 0, consumer, + FRAG_RESULT_DATA0, true, + ctx->Extensions.ARB_enhanced_layouts); + } + remove_unused_shader_inputs_and_outputs(prog, consumer, ir_var_shader_in); lower_packed_varyings(mem_ctx, slots_used, ir_var_shader_in, -- 2.4.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev