[Mesa-dev] [PATCH 0/3][RFC] Improve GLSL support of GL_ARB_separate_shader_objects

gregory hainaut gregory.hainaut at gmail.com
Wed Sep 30 12:18:43 PDT 2015


On Fri, 25 Sep 2015 16:40:31 -0700
Ian Romanick <idr at freedesktop.org> wrote:

> On 09/20/2015 01:15 PM, Gregory Hainaut wrote:
> > Current GLSL badly optimizes the code making it incompatible with the
> > GL_ARB_separate_shader_objects extension.
> > 
> > Typical example of the current behavior:
> > 
> > VS:
> > out SHADER
> > {
> >     vec4 var_zero; // location will always be 0
> >     vec2 var_one; // location will always be 1
> > } VSout;
> > 
> > FS:
> > in SHADER
> > {
> >     vec4 var_zero;
> >     vec2 var_one; // ERROR: location would be wrongly set to 0 if var_zero is inactive
> > } PSin;
> > 
> > In short, SSO allow to match by name but you can't make any hypothesis on the
> > previous/next stage. Therefore you must consider all inputs as actives.
> 
> Welcome back. :)

Oh, thanks you :)
 
> I think I understand what is happening, but I think the approach is not
> quite right.  My understanding, with the aid of the spec quote in patch
> 3, is that any interstage I/O (i.e., not vertex inputs and not fragment
> outputs) that are explicitly declared in a stage, even if unused in that
> stage, cannot be eliminated.  This is roughly like layout(shared) on UBOs.

Yes
 
> This set of changes only prevents unused interstage inputs from being
> eliminated.  It does nothing for vertex, geometry, or tessellation
> outputs.  It also prevents the elimination of user-declared inputs that
> could previously be eliminated.  It seems that if the VS and FS
> mentioned above were linked together, var_zero would (incorrectly) not
> be eliminated.  Right?

Yes, you're right. I extended my current piglit test to check 
both input and output wrong that are wrongly eliminated. I also made a small
test to check interstage optimization.

> I think patches 1 and 2 should just be dropped.  A new patch 1 should
> add a method that determines whether or not a ir_var_shader_in or
> ir_var_shader_out is interstage.  I thought such a function existed, but
> I could not find it.  The replacement for patch 3 would change the logic
> to "if it's interstage I/O, and there isn't an explicit location, and
> this stage isn't linked with a following stage, do not eliminate the
> variable."
> 
> The "this stage isn't linked with a following stage" part is important
> because we still want to eliminate vertex shader outputs in separable
> shaders if the vertex shader is linked directly with (only) a geometry
> shader, for example.
> 
So far, I manage to annotate the ir with an interstage flag. However some issues
are remaining with explicit location.

Here the bad FS program:

layout(location = 0) in vec4 blue;
in vec4 green;
in vec4 red;

void main()
{
    out_color = vec4(green.xyz, 1);
}

// IR for the FS
(declare (location=26 shader_in ) vec4 green)
(declare (location=27 shader_in ) vec4 red)
(declare (location=4 shader_out ) vec4 out_color)

// IR for the VS (same interface but declared as out)
(declare (location=0 shader_out ) vec4 gl_Position)
(declare (temporary ) vec4 gl_Position)
(declare (location=26 shader_out ) vec4 blue)
(declare (temporary ) vec4 blue)
(declare (location=26 shader_out flat) vec4 green)
(declare (temporary ) vec4 green)
(declare (location=27 shader_out flat) vec4 red)
(declare (temporary ) vec4 red)
(declare (location=17 shader_in ) vec4 piglit_vertex)

As you can see there are 2 problems.
1/ location in the VS overlap, 26 appears 2 times.
I'm not sure that Mesa support it actually (or if it isn't allowed).

2/ FS doesn't reserve slot 26 (VARYING_SLOT_VAR0) for blue and start directly to the slot 26
Technically I could just disable the optimization of those variables too. But sadly
I hit issue number 1 for FS too.

Any idea of where it could be wrong?

Thanks.



More information about the mesa-dev mailing list