[Mesa-dev] [PATCH 2/2] linker: Eliminate more dead code after demoting shader inputs and outputs
Yuanhan Liu
yuanhan.liu at linux.intel.com
Sun Oct 23 19:24:40 PDT 2011
On Fri, Oct 21, 2011 at 11:49:44AM -0700, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Consider the following vertex shader and fragment shader:
>
> // vertex shader
> varying vec4 v;
> uniform vec4 u;
>
> void main() { gl_Position = vec4(0.0); v = u; }
>
> // fragment shader
> void main() { gl_FragColor = vec4(0.0); }
>
> Since the fragment shader does not use 'v', it is demoted from a
> varying to a simple global variable. Once that happens, the
> assignment to 'v' is useless, and it should be removed. In addition,
> 'u' is no longer active, and it should also be removed.
>
> Performing extra dead code elimination after demoting shader inputs
> and outputs takes care of this. This elimination must occur before
> assigning uniform locations, or the declaration of 'u' cannot be
> removed.
>
> This change *breaks* the piglit test getuniform-01, but that test is
> already incorrect. The test uses a vertex shader that assigns to a
> user-defined varying, but it has no fragment shader. Since Mesa does
> not support ARB_separate_shader_objects (we only support the EXT
> version), the linker correctly eliminates the user-defined varying.
> The cascading effect is that the uniform queried by the C code of the
> test is also (correctly) eliminated.
Reviewed-by: Yuanhan Liu <yuanhan.liu at linux.intel.com>
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41980
> Cc: Brian Paul <brianp at vmware.com>
> Cc: Bryan Cain <bryancain3 at gmail.com>
> Cc: Vinson Lee <vlee at vmware.com>
> Cc: José Fonseca <jfonseca at vmware.com>
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/glsl/linker.cpp | 26 ++++++++++++++++++++++----
> 1 files changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index d4d2496..beadec6 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -1746,10 +1746,6 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
> ;
> }
>
> - update_array_sizes(prog);
> -
> - assign_uniform_locations(prog);
> -
> /* FINISHME: The value of the max_attribute_index parameter is
> * FINISHME: implementation dependent based on the value of
> * FINISHME: GL_MAX_VERTEX_ATTRIBS. GL_MAX_VERTEX_ATTRIBS must be
> @@ -1785,6 +1781,12 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
> if (prog->_LinkedShaders[MESA_SHADER_VERTEX] != NULL) {
> demote_shader_inputs_and_outputs(prog->_LinkedShaders[MESA_SHADER_VERTEX],
> ir_var_out);
> +
> + /* Eliminate code that is now dead due to unused vertex outputs being
> + * demoted.
> + */
> + while (do_dead_code(prog->_LinkedShaders[MESA_SHADER_VERTEX]->ir, false))
> + ;
> }
>
> if (prog->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) {
> @@ -1793,14 +1795,30 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
> demote_shader_inputs_and_outputs(sh, ir_var_in);
> demote_shader_inputs_and_outputs(sh, ir_var_inout);
> demote_shader_inputs_and_outputs(sh, ir_var_out);
> +
> + /* Eliminate code that is now dead due to unused geometry outputs being
> + * demoted.
> + */
> + while (do_dead_code(prog->_LinkedShaders[MESA_SHADER_GEOMETRY]->ir, false))
> + ;
> }
>
> if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] != NULL) {
> gl_shader *const sh = prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
>
> demote_shader_inputs_and_outputs(sh, ir_var_in);
> +
> + /* Eliminate code that is now dead due to unused fragment inputs being
> + * demoted. This shouldn't actually do anything other than remove
> + * declarations of the (now unused) global variables.
> + */
> + while (do_dead_code(prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->ir, false))
> + ;
> }
>
> + update_array_sizes(prog);
> + assign_uniform_locations(prog);
> +
> /* OpenGL ES requires that a vertex shader and a fragment shader both be
> * present in a linked program. By checking for use of shading language
> * version 1.00, we also catch the GL_ARB_ES2_compatibility case.
> --
> 1.7.6.4
>
> _______________________________________________
> 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