Could somebody please review this series? Marek
On Thu, Jun 13, 2013 at 2:25 PM, Marek Olšák <mar...@gmail.com> 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. > > 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: > > > 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@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev