From: Timothy Arceri <timothy.arc...@collabora.com> We do however allow unused builtins to be removed.
Cc: Ian Romanick <ian.d.roman...@intel.com> Cc: Gregory Hainaut <gregory.hain...@gmail.com> https://bugs.freedesktop.org/show_bug.cgi?id=79783 --- src/glsl/glsl_parser_extras.cpp | 8 +++++--- src/glsl/ir_optimization.h | 5 +++-- src/glsl/linker.cpp | 11 ++++++----- src/glsl/lower_named_interface_blocks.cpp | 1 + src/glsl/opt_dead_code.cpp | 10 ++++++++-- src/glsl/test_optpass.cpp | 5 +++-- src/mesa/drivers/dri/i965/brw_link.cpp | 3 ++- src/mesa/main/ff_fragment_shader.cpp | 3 ++- src/mesa/program/ir_to_mesa.cpp | 3 ++- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 3 ++- 10 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 0dbef67..6348ac0 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -1798,7 +1798,7 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, * and reduce later work if the same shader is linked multiple times */ while (do_common_optimization(shader->ir, false, false, options, - ctx->Const.NativeIntegers)) + ctx->Const.NativeIntegers, false)) ; validate_ir_tree(shader->ir); @@ -1896,7 +1896,8 @@ bool do_common_optimization(exec_list *ir, bool linked, bool uniform_locations_assigned, const struct gl_shader_compiler_options *options, - bool native_integers) + bool native_integers, + bool separate_shader) { GLboolean progress = GL_FALSE; @@ -1921,7 +1922,8 @@ do_common_optimization(exec_list *ir, bool linked, } if (linked) - progress = do_dead_code(ir, uniform_locations_assigned) || progress; + progress = do_dead_code(ir, uniform_locations_assigned, separate_shader) + || progress; else progress = do_dead_code_unlinked(ir) || progress; progress = do_dead_code_local(ir) || progress; diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h index 2fee81c..c2628f1 100644 --- a/src/glsl/ir_optimization.h +++ b/src/glsl/ir_optimization.h @@ -75,7 +75,7 @@ enum lower_packing_builtins_op { bool do_common_optimization(exec_list *ir, bool linked, bool uniform_locations_assigned, const struct gl_shader_compiler_options *options, - bool native_integers); + bool native_integers, bool separate_shader); bool do_rebalance_tree(exec_list *instructions); bool do_algebraic(exec_list *instructions, bool native_integers, @@ -91,7 +91,8 @@ void do_dead_builtin_varyings(struct gl_context *ctx, gl_shader *producer, gl_shader *consumer, unsigned num_tfeedback_decls, class tfeedback_decl *tfeedback_decls); -bool do_dead_code(exec_list *instructions, bool uniform_locations_assigned); +bool do_dead_code(exec_list *instructions, bool uniform_locations_assigned, + bool separate_shader); bool do_dead_code_local(exec_list *instructions); bool do_dead_code_unlinked(exec_list *instructions); bool do_dead_functions(exec_list *instructions); diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 8e7d92e..49f181f 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -4224,7 +4224,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, false, &ctx->Const.ShaderCompilerOptions[i], - ctx->Const.NativeIntegers)) + ctx->Const.NativeIntegers, + prog->SeparateShader)) ; lower_const_arrays_to_uniforms(prog->_LinkedShaders[i]->ir); @@ -4338,7 +4339,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) /* Eliminate code that is now dead due to unused outputs being demoted. */ - while (do_dead_code(sh->ir, false)) + while (do_dead_code(sh->ir, false, prog->SeparateShader)) ; } else if (first == MESA_SHADER_FRAGMENT) { @@ -4359,7 +4360,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) } else demote_shader_inputs_and_outputs(sh, ir_var_shader_in); - while (do_dead_code(sh->ir, false)) + while (do_dead_code(sh->ir, false, prog->SeparateShader)) ; } @@ -4387,9 +4388,9 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) /* Eliminate code that is now dead due to unused outputs being * demoted. */ - while (do_dead_code(sh_i->ir, false)) + while (do_dead_code(sh_i->ir, false, prog->SeparateShader)) ; - while (do_dead_code(sh_next->ir, false)) + while (do_dead_code(sh_next->ir, false, prog->SeparateShader)) ; } diff --git a/src/glsl/lower_named_interface_blocks.cpp b/src/glsl/lower_named_interface_blocks.cpp index 114bb58..f29eba4 100644 --- a/src/glsl/lower_named_interface_blocks.cpp +++ b/src/glsl/lower_named_interface_blocks.cpp @@ -187,6 +187,7 @@ flatten_named_interface_blocks_declarations::run(exec_list *instructions) new_var->data.sample = iface_t->fields.structure[i].sample; new_var->data.patch = iface_t->fields.structure[i].patch; new_var->data.stream = var->data.stream; + new_var->data.how_declared = var->data.how_declared; new_var->init_interface_type(iface_t); hash_table_insert(interface_namespace, new_var, diff --git a/src/glsl/opt_dead_code.cpp b/src/glsl/opt_dead_code.cpp index c5be166..8685d0f 100644 --- a/src/glsl/opt_dead_code.cpp +++ b/src/glsl/opt_dead_code.cpp @@ -43,7 +43,8 @@ static bool debug = false; * for usage on an unlinked instruction stream. */ bool -do_dead_code(exec_list *instructions, bool uniform_locations_assigned) +do_dead_code(exec_list *instructions, bool uniform_locations_assigned, + bool separate_shader) { ir_variable_refcount_visitor v; bool progress = false; @@ -139,6 +140,11 @@ do_dead_code(exec_list *instructions, bool uniform_locations_assigned) continue; } + /* For SSO only remove builtin inputs */ + if (separate_shader && entry->var->data.mode == ir_var_shader_in && + entry->var->data.how_declared != ir_var_declared_implicitly) { + continue; +} entry->var->remove(); progress = true; @@ -173,7 +179,7 @@ do_dead_code_unlinked(exec_list *instructions) * inside the body of the function, something has already gone * terribly, terribly wrong. */ - if (do_dead_code(&sig->body, false)) + if (do_dead_code(&sig->body, false, false)) progress = true; } } diff --git a/src/glsl/test_optpass.cpp b/src/glsl/test_optpass.cpp index fed1fab..4413a60 100644 --- a/src/glsl/test_optpass.cpp +++ b/src/glsl/test_optpass.cpp @@ -63,7 +63,8 @@ do_optimization(struct exec_list *ir, const char *optimization, int int_4; if (sscanf(optimization, "do_common_optimization ( %d ) ", &int_0) == 1) { - return do_common_optimization(ir, int_0 != 0, false, options, true); + return do_common_optimization(ir, int_0 != 0, false, options, true, + false); } else if (strcmp(optimization, "do_algebraic") == 0) { return do_algebraic(ir, true, options); } else if (strcmp(optimization, "do_constant_folding") == 0) { @@ -79,7 +80,7 @@ do_optimization(struct exec_list *ir, const char *optimization, } else if (strcmp(optimization, "do_constant_propagation") == 0) { return do_constant_propagation(ir); } else if (strcmp(optimization, "do_dead_code") == 0) { - return do_dead_code(ir, false); + return do_dead_code(ir, false, false); } else if (strcmp(optimization, "do_dead_code_local") == 0) { return do_dead_code_local(ir); } else if (strcmp(optimization, "do_dead_code_unlinked") == 0) { diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp index 2991173..def550f 100644 --- a/src/mesa/drivers/dri/i965/brw_link.cpp +++ b/src/mesa/drivers/dri/i965/brw_link.cpp @@ -173,7 +173,8 @@ process_glsl_ir(gl_shader_stage stage, ) || progress; progress = do_common_optimization(shader->ir, true, true, - options, ctx->Const.NativeIntegers) || progress; + options, ctx->Const.NativeIntegers, + shader_prog->SeparateShader) || progress; } while (progress); validate_ir_tree(shader->ir); diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp index e63d0f1..f6093a6 100644 --- a/src/mesa/main/ff_fragment_shader.cpp +++ b/src/mesa/main/ff_fragment_shader.cpp @@ -1250,7 +1250,8 @@ create_new_program(struct gl_context *ctx, struct state_key *key) &ctx->Const.ShaderCompilerOptions[MESA_SHADER_FRAGMENT]; while (do_common_optimization(p.shader->ir, false, false, options, - ctx->Const.NativeIntegers)) + ctx->Const.NativeIntegers, + p.shader_program->SeparateShader)) ; reparent_ir(p.shader->ir, p.shader->ir); diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 61a5064..7c97fe2 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -2897,7 +2897,8 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress; progress = do_common_optimization(ir, true, true, - options, ctx->Const.NativeIntegers) + options, ctx->Const.NativeIntegers, + prog->SeparateShader) || progress; progress = lower_quadop_vector(ir, true) || progress; diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 3ad1afd..98cd564 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -5839,7 +5839,8 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress; progress = do_common_optimization(ir, true, true, options, - ctx->Const.NativeIntegers) + ctx->Const.NativeIntegers, + prog->SeparateShader) || progress; progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress; -- 2.4.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev