<html>
    <head>
      <base href="https://bugs.freedesktop.org/">
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED - [GEN6+] arb_program_interface_query.arb_program_interface_query-getprogramresourceindex regression"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=92822#c11">Comment # 11</a>
              on <a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED - [GEN6+] arb_program_interface_query.arb_program_interface_query-getprogramresourceindex regression"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=92822">bug 92822</a>
              from <span class="vcard"><a class="email" href="mailto:t_arceri@yahoo.com.au" title="Timothy Arceri <t_arceri@yahoo.com.au>"> <span class="fn">Timothy Arceri</span></a>
</span></b>
        <pre>Just to update this bug report. I ended up suggesting against the solution
proposed by Andrii because it was too much code for something that didn't
actually remove the unused components, but just hid them from the resource
list.

I think if we actually want to fix this properly then we could do it by finally
hooking up a NIR linker for GLSL.

For example after the linking (i.e. when we produce the resource list) the GLSL
IR is converted to this NIR form:

shader: MESA_SHADER_VERTEX
name: GLSL3
inputs: 0
outputs: 0
uniforms: 0
shared: 0
decl_var shader_in INTERP_MODE_NONE vec4[2][2] vs_input2 (VERT_ATTRIB_GENERIC8,
0, 0)
decl_var shader_in INTERP_MODE_NONE vec4[2][2][2] vs_input3
(VERT_ATTRIB_GENERIC0, 0, 0)
decl_var shader_out INTERP_MODE_NONE vec4 gl_Position (VARYING_SLOT_POS, 0, 0)
decl_function main (0 params)

impl main {
        block block_0:
        /* preds: */
        vec1 32 ssa_0 = deref_var &vs_input2 (shader_in vec4[2][2]) 
        vec1 32 ssa_1 = load_const (0x00000000 /* 0.000000 */)
        vec1 32 ssa_2 = deref_array &(*ssa_0)[0] (shader_in vec4[2]) /*
&vs_input2[0] */
        vec1 32 ssa_3 = deref_array &(*ssa_2)[0] (shader_in vec4) /*
&vs_input2[0][0] */
        vec4 32 ssa_4 = intrinsic load_deref (ssa_3) (0) /* access=0 */
        vec1 32 ssa_5 = deref_var &vs_input3 (shader_in vec4[2][2][2]) 
        vec1 32 ssa_6 = deref_array &(*ssa_5)[0] (shader_in vec4[2][2]) /*
&vs_input3[0] */
        vec1 32 ssa_7 = deref_array &(*ssa_6)[0] (shader_in vec4[2]) /*
&vs_input3[0][0] */
        vec1 32 ssa_8 = deref_array &(*ssa_7)[0] (shader_in vec4) /*
&vs_input3[0][0][0] */
        vec4 32 ssa_9 = intrinsic load_deref (ssa_8) (0) /* access=0 */
        vec1 32 ssa_10 = fadd ssa_4.x, ssa_9.x
        vec1 32 ssa_11 = fadd ssa_4.y, ssa_9.y
        vec1 32 ssa_12 = fadd ssa_4.z, ssa_9.z
        vec1 32 ssa_13 = fadd ssa_4.w, ssa_9.w
        vec1 32 ssa_14 = deref_var &gl_Position (shader_out vec4) 
        vec4 32 ssa_15 = vec4 ssa_10, ssa_11, ssa_12, ssa_13
        intrinsic store_deref (ssa_14, ssa_15) (15, 0) /* wrmask=xyzw */ /*
access=0 */
        /* succs: block_1 */
        block block_1:
}


But due to better NIR having better optimisations this ends up as:

shader: MESA_SHADER_VERTEX
name: GLSL3
inputs: 2
outputs: 1
uniforms: 0
shared: 0
decl_var shader_in INTERP_MODE_NONE vec4 vs_input2 (VERT_ATTRIB_GENERIC8, 4, 0)
decl_var shader_in INTERP_MODE_NONE vec4 vs_input3 (VERT_ATTRIB_GENERIC0, 0, 0)
decl_var shader_out INTERP_MODE_NONE vec4 gl_Position (VARYING_SLOT_POS, 0, 0)
decl_function main (0 params)

impl main {
        block block_0:
        /* preds: */
        vec1 32 ssa_0 = deref_var &vs_input2 (shader_in vec4) 
        vec4 32 ssa_1 = intrinsic load_deref (ssa_0) (0) /* access=0 */
        vec1 32 ssa_2 = deref_var &vs_input3 (shader_in vec4) 
        vec4 32 ssa_3 = intrinsic load_deref (ssa_2) (0) /* access=0 */
        vec1 32 ssa_4 = fadd ssa_1.x, ssa_3.x
        vec1 32 ssa_5 = fadd ssa_1.y, ssa_3.y
        vec1 32 ssa_6 = fadd ssa_1.z, ssa_3.z
        vec1 32 ssa_7 = fadd ssa_1.w, ssa_3.w
        vec1 32 ssa_8 = deref_var &gl_Position (shader_out vec4) 
        vec4 32 ssa_9 = vec4 ssa_4, ssa_5, ssa_6, ssa_7
        intrinsic store_deref (ssa_8, ssa_9) (15, 0) /* wrmask=xyzw */ /*
access=0 */
        /* succs: block_1 */
        block block_1:
}


If we were to build the resource list from a NIR linker this piglit test would
pass this test just like the Nvidia blob.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are the QA Contact for the bug.</li>
      </ul>
    </body>
</html>