[Mesa-dev] [PATCH] glsl: don't eliminate texcoords that can be set by GL_COORD_REPLACE
Marek Olšák
maraeo at gmail.com
Mon Aug 19 13:34:22 PDT 2013
Hi Ian,
In case you're interested, I have noticed we have no piglit tests for
GL_ARB_base_instance. For example, baseinstance shouldn't affect
gl_InstanceID, which is currently broken in radeonsi.
Marek
On Sun, Aug 18, 2013 at 5:23 AM, Ian Romanick <idr at freedesktop.org> wrote:
> On 08/09/2013 01:40 PM, Marek Olšák wrote:
>>
>> Tested by examining generated TGSI shaders from piglit/glsl-routing.
>>
>> Cc: mesa-stable at lists.freedesktop.org
>
>
> This patch was in my review-queue, and I forgot about it. Sorry. :(
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
>
> Since this also fixes an application, do you have any idea what could be
> done to make a piglit test to reproduce the failure? We have some folks
> writing piglit tests for us this summer, and this sounds like a good one for
> them. :)
>
>
>> ---
>> src/glsl/ir_optimization.h | 2 +-
>> src/glsl/linker.cpp | 6 +++---
>> src/glsl/opt_dead_builtin_varyings.cpp | 27 +++++++++++++++++++--------
>> 3 files changed, 23 insertions(+), 12 deletions(-)
>>
>> diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h
>> index a61227b..b79c2b7 100644
>> --- a/src/glsl/ir_optimization.h
>> +++ b/src/glsl/ir_optimization.h
>> @@ -77,7 +77,7 @@ bool do_copy_propagation(exec_list *instructions);
>> bool do_copy_propagation_elements(exec_list *instructions);
>> bool do_constant_propagation(exec_list *instructions);
>> void do_dead_builtin_varyings(struct gl_context *ctx,
>> - exec_list *producer, exec_list *consumer,
>> + 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);
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index d36f627..f87ae0e 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -2091,7 +2091,7 @@ link_shaders(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>> goto done;
>> }
>>
>> - do_dead_builtin_varyings(ctx, sh->ir, NULL,
>> + do_dead_builtin_varyings(ctx, sh, NULL,
>> num_tfeedback_decls, tfeedback_decls);
>>
>> demote_shader_inputs_and_outputs(sh, ir_var_shader_out);
>> @@ -2106,7 +2106,7 @@ link_shaders(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>> */
>> gl_shader *const sh = prog->_LinkedShaders[first];
>>
>> - do_dead_builtin_varyings(ctx, NULL, sh->ir,
>> + do_dead_builtin_varyings(ctx, NULL, sh,
>> num_tfeedback_decls, tfeedback_decls);
>>
>> demote_shader_inputs_and_outputs(sh, ir_var_shader_in);
>> @@ -2130,7 +2130,7 @@ link_shaders(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>> tfeedback_decls, gs_input_vertices))
>> goto done;
>>
>> - do_dead_builtin_varyings(ctx, sh_i->ir, sh_next->ir,
>> + do_dead_builtin_varyings(ctx, sh_i, sh_next,
>> next == MESA_SHADER_FRAGMENT ? num_tfeedback_decls : 0,
>> tfeedback_decls);
>>
>> diff --git a/src/glsl/opt_dead_builtin_varyings.cpp
>> b/src/glsl/opt_dead_builtin_varyings.cpp
>> index 2e813d2..6745d5c 100644
>> --- a/src/glsl/opt_dead_builtin_varyings.cpp
>> +++ b/src/glsl/opt_dead_builtin_varyings.cpp
>> @@ -409,7 +409,7 @@ lower_texcoord_array(exec_list *ir, const
>> varying_info_visitor *info)
>>
>> void
>> do_dead_builtin_varyings(struct gl_context *ctx,
>> - exec_list *producer, exec_list *consumer,
>> + gl_shader *producer, gl_shader *consumer,
>> unsigned num_tfeedback_decls,
>> tfeedback_decl *tfeedback_decls)
>> {
>> @@ -431,44 +431,55 @@ do_dead_builtin_varyings(struct gl_context *ctx,
>> varying_info_visitor consumer_info(ir_var_shader_in);
>>
>> if (producer) {
>> - producer_info.get(producer, num_tfeedback_decls, tfeedback_decls);
>> + producer_info.get(producer->ir, num_tfeedback_decls,
>> tfeedback_decls);
>>
>> if (!consumer) {
>> /* At least eliminate unused gl_TexCoord elements. */
>> if (producer_info.lower_texcoord_array) {
>> - lower_texcoord_array(producer, &producer_info);
>> + lower_texcoord_array(producer->ir, &producer_info);
>> }
>> return;
>> }
>> }
>>
>> if (consumer) {
>> - consumer_info.get(consumer, 0, NULL);
>> + consumer_info.get(consumer->ir, 0, NULL);
>>
>> if (!producer) {
>> /* At least eliminate unused gl_TexCoord elements. */
>> if (consumer_info.lower_texcoord_array) {
>> - lower_texcoord_array(consumer, &consumer_info);
>> + lower_texcoord_array(consumer->ir, &consumer_info);
>> }
>> return;
>> }
>> }
>>
>> - /* Eliminate the varyings unused by the other shader. */
>> + /* Eliminate the outputs unused by the consumer. */
>> if (producer_info.lower_texcoord_array ||
>> producer_info.color_usage ||
>> producer_info.has_fog) {
>> - replace_varyings_visitor(producer,
>> + replace_varyings_visitor(producer->ir,
>> &producer_info,
>> consumer_info.texcoord_usage,
>> consumer_info.color_usage,
>> consumer_info.has_fog);
>> }
>>
>> + /* The gl_TexCoord fragment shader inputs can be initialized
>> + * by GL_COORD_REPLACE, so we can't eliminate them.
>> + *
>> + * This doesn't prevent elimination of the gl_TexCoord elements which
>> + * are not read by the fragment shader. We want to eliminate those
>> anyway.
>> + */
>> + if (consumer->Type == GL_FRAGMENT_SHADER) {
>> + producer_info.texcoord_usage = (1 << MAX_TEXTURE_COORD_UNITS) - 1;
>> + }
>> +
>> + /* Eliminate the inputs uninitialized by the producer. */
>> if (consumer_info.lower_texcoord_array ||
>> consumer_info.color_usage ||
>> consumer_info.has_fog) {
>> - replace_varyings_visitor(consumer,
>> + replace_varyings_visitor(consumer->ir,
>> &consumer_info,
>> producer_info.texcoord_usage,
>> producer_info.color_usage,
>>
>
More information about the mesa-dev
mailing list