[Mesa-dev] [PATCH 0/6] Eliminating unused built-in varyings

Ian Romanick idr at freedesktop.org
Fri Jun 28 08:42:59 PDT 2013


On 06/13/2013 05:25 AM, Marek Olšák wrote:
> Hi everyone,
>
> this series adds a new GLSL compiler optimization pass which eliminates unused and set-but-unused built-in varyings and adds a few improvements to the GLSL linker in the process.
>
> Before I show you how it works, I wanna say that there are patches which are related to and will most probably conflict with the geometry shader work, but they are necessary because the linkage of varyings is largely suboptimal.
>
> Also, the GL_EXT_separate_shader_objects extension must be disabled
> for this optimization to be enabled. The reason is a program object with
> both a VS and FS can be bound partially, e.g. by
> glUseShaderProgramEXT(GL_VERTEX_SHADER, prog), so the extension makes
> every program object be just a set of "separate shaders". The extension
> is not important anyway.

Could you elaborate on this a bit?  The problem already exists that 
shader can be par-linked (e.g., just a vertex shader) and used with 
fixed-function.  A big part of the reason that I implemented EXT_sso 
back in the day was to generate infrastructure, etc. for better using 
shaders with fixed function.

> Now, to illustrate how the optimization works, consider these 2 shader IR dumps:
>
>
> Vertex shader (8 varyings):
> ...
> (declare (shader_out ) vec4 gl_FrontColor)
> (declare (shader_out ) vec4 gl_FrontSecondaryColor)
> (declare (shader_out ) (array vec4 6) gl_TexCoord)
> (function main
>    (signature void
>      (parameters
>      )
>      (
>        ...
>        (assign  (xyzw) (var_ref gl_FrontColor)  (var_ref gl_Color) )
>        (assign  (xyzw) (var_ref gl_FrontSecondaryColor)  (var_ref gl_SecondaryColor) )
>        (assign  (xyzw) (array_ref (var_ref gl_TexCoord) (constant int (1)) )  (var_ref gl_MultiTexCoord1) )
>        (assign  (xyzw) (array_ref (var_ref gl_TexCoord) (constant int (4)) )  (var_ref gl_MultiTexCoord4) )
>        (assign  (xyzw) (array_ref (var_ref gl_TexCoord) (constant int (5)) )  (var_ref gl_MultiTexCoord5) )
>      ))
> )
>
> Fragment shader (6 varyings):
> ...
> (declare (shader_in ) vec4 gl_SecondaryColor)
> (declare (shader_in ) (array vec4 5) gl_TexCoord)
> (function main
>    (signature void
>      (parameters
>      )
>      (
>        (declare () vec4 r)
>        (assign  (xyzw) (var_ref r)  ... (var_ref gl_SecondaryColor) ) )
>        (assign  (xyzw) (var_ref r)  ... (array_ref (var_ref gl_TexCoord) (constant int (1)) ) ) ) )
>        (assign  (xyzw) (var_ref r)  ... (array_ref (var_ref gl_TexCoord) (constant int (2)) ) ) ) )
>        (assign  (xyzw) (var_ref r)  ... (array_ref (var_ref gl_TexCoord) (constant int (3)) ) ) ) )
>        (declare (temporary ) vec4 assignment_tmp)
>        (assign  (xyzw) (var_ref assignment_tmp)  ... (array_ref (var_ref gl_TexCoord) (constant int (4)) ) ) ) )
>        ...
>      ))
> )
>
>
> Note that only gl_TexCoord[1], gl_TexCoord[4], and gl_SecondaryColor
> are used by both shaders. The optimization replaces all occurences of
> varyings which are unused by the other stage by temporary variables. It
> also breaks down the gl_TexCoord array into separate vec4 variables if
> needed. Here's the result:

This sounds similar to the way Paul's varying packing works.  Is there 
synergy there?  Also, since variables are renamed, does this interact 
with transform feedback?  The queries of GL_ARB_program_interface_query? 
  I suspect that it won't since this only affects built-in varyings, and 
built-in varyings aren't usable with those interfaces.

> Vertex shader (3 varyings instead of 8):
> ...
> (declare (shader_out ) vec4 gl_out_TexCoord1)
> (declare (shader_out ) vec4 gl_out_TexCoord4)
> (declare (temporary ) vec4 gl_out_TexCoord5_dummy)
> (declare (temporary ) vec4 gl_out_FrontColor0_dummy)
> (declare (shader_out ) vec4 gl_FrontSecondaryColor)
> (function main
>    (signature void
>      (parameters
>      )
>      (
>        ...
>        (assign  (xyzw) (var_ref gl_out_FrontColor0_dummy)  (var_ref gl_Color) )
>        (assign  (xyzw) (var_ref gl_FrontSecondaryColor)  (var_ref gl_SecondaryColor) )
>        (assign  (xyzw) (var_ref gl_out_TexCoord1)  (var_ref gl_MultiTexCoord1) )
>        (assign  (xyzw) (var_ref gl_out_TexCoord4)  (var_ref gl_MultiTexCoord4) )
>        (assign  (xyzw) (var_ref gl_out_TexCoord5_dummy)  (var_ref gl_MultiTexCoord5) )
>      ))
> )
>
> Fragment shader (3 varyings instead of 6):
> ...
> (declare (shader_in ) vec4 gl_in_TexCoord1)
> (declare (temporary ) vec4 gl_in_TexCoord2_dummy)
> (declare (temporary ) vec4 gl_in_TexCoord3_dummy)
> (declare (shader_in ) vec4 gl_in_TexCoord4)
> (declare (shader_in ) vec4 gl_SecondaryColor)
> (function main
>    (signature void
>      (parameters
>      )
>      (
>        (declare () vec4 r)
>        (assign  (xyzw) (var_ref r)  ... (var_ref gl_SecondaryColor) ) )
>        (assign  (xyzw) (var_ref r)  ... (var_ref gl_in_TexCoord1) ) ) )
>        (assign  (xyzw) (var_ref r)  ... (var_ref gl_in_TexCoord2_dummy) ) ) )
>        (assign  (xyzw) (var_ref r)  ... (var_ref gl_in_TexCoord3_dummy) ) ) )
>        (declare (temporary ) vec4 assignment_tmp)
>        (assign  (xyzw) (var_ref assignment_tmp)  ... (var_ref gl_in_TexCoord4) ) ) )
>        ...
>      ))
> )
>
> The locations of varyings remain the same. That's all. Please review.
>
> Marek
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>



More information about the mesa-dev mailing list