[Mesa-dev] [PATCH v2] glsl: fix consumer_stage restriction to separate shader objects

Tapani Pälli tapani.palli at intel.com
Tue Jan 26 23:17:04 PST 2016


On 01/26/2016 05:59 AM, Timothy Arceri wrote:
> On Tue, 2016-01-19 at 07:20 +0100, Samuel Iglesias Gonsálvez wrote:
>> Commit 781d278 did not restrict consumer_stage only to separate
>> shader
>> objects, which is when we don't know if the consumer stage would be a
>> fragment shader added later. In normal programs, when
>> consumer_stage == -1, it is because they are not consumed.
>>
>> Fixes 4 piglit regressions added by commit 781d278 in radeonsi:
>>
>> arb_gpu_shader_fp64-double-gettransformfeedbackvarying
>> arb_gpu_shader_fp64-tf-interleaved
>> arb_gpu_shader_fp64-tf-interleaved-aligned
>> arb_gpu_shader_fp64-tf-separate
> But what happens if you change these tests to also make use of SSO? I'm
> assuming they would fall over again. That's not saying this patch isn't
> correct but that the original likely wasn't a full solution.

IMO that is a different problem. SSO needs some bigger changes, like 
moving packing to happen only later when both consumer and producer are 
known.

> It looks a lot like the issue I'm seeing with this [1] workaround for
> SSO. Transform feedback depends on packing, it seems any change in
> rules in the varying location assignment code should also be reflected
> in the transform feedback code, I don't know the correct fix yet but
> more piglit tests is probably the first step.
>
> [1] http://lists.freedesktop.org/archives/mesa-dev/2016-January/105764.
> html
>
>> v2:
>> - Simplify condition expression (Timothy).
>>
>> Signed-off-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
>> Tested-by: Michel Dänzer <michel.daenzer at amd.com>
>> ---
>>   src/glsl/link_varyings.cpp | 15 +++++++++------
>>   1 file changed, 9 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
>> index 09f80d0..a27589d 100644
>> --- a/src/glsl/link_varyings.cpp
>> +++ b/src/glsl/link_varyings.cpp
>> @@ -824,7 +824,8 @@ public:
>>                      gl_shader_stage producer_stage,
>>                      gl_shader_stage consumer_stage);
>>      ~varying_matches();
>> -   void record(ir_variable *producer_var, ir_variable
>> *consumer_var);
>> +   void record(ir_variable *producer_var, ir_variable *consumer_var,
>> +               bool separate_shader);
>>      unsigned assign_locations(struct gl_shader_program *prog,
>>                                uint64_t reserved_slots, bool
>> separate_shader);
>>      void store_locations() const;
>> @@ -952,7 +953,8 @@ varying_matches::~varying_matches()
>>    * rendering.
>>    */
>>   void
>> -varying_matches::record(ir_variable *producer_var, ir_variable
>> *consumer_var)
>> +varying_matches::record(ir_variable *producer_var, ir_variable
>> *consumer_var,
>> +                        bool separate_shader)
>>   {
>>      assert(producer_var != NULL || consumer_var != NULL);
>>   
>> @@ -968,7 +970,8 @@ varying_matches::record(ir_variable
>> *producer_var, ir_variable *consumer_var)
>>      }
>>   
>>      if ((consumer_var == NULL && producer_var->type-
>>> contains_integer()) ||
>> -       (consumer_stage != -1 && consumer_stage !=
>> MESA_SHADER_FRAGMENT)) {
>> +       (consumer_stage != MESA_SHADER_FRAGMENT &&
>> +        (!separate_shader || consumer_stage != -1))) {
>
>
>
>>         /* Since this varying is not being consumed by the fragment
>> shader, its
>>          * interpolation type varying cannot possibly affect
>> rendering.
>>          * Also, this variable is non-flat and is (or contains) an
>> integer.
>> @@ -1667,7 +1670,7 @@ assign_varying_locations(struct gl_context
>> *ctx,
>>             */
>>            if (input_var || (prog->SeparateShader && consumer == NULL)
>> ||
>>                producer->Type == GL_TESS_CONTROL_SHADER) {
>> -            matches.record(output_var, input_var);
>> +            matches.record(output_var, input_var, prog-
>>> SeparateShader);
>>            }
>>   
>>            /* Only stream 0 outputs can be consumed in the next stage
>> */
>> @@ -1692,7 +1695,7 @@ assign_varying_locations(struct gl_context
>> *ctx,
>>                (input_var->data.mode != ir_var_shader_in))
>>               continue;
>>   
>> -         matches.record(NULL, input_var);
>> +         matches.record(NULL, input_var, prog->SeparateShader);
>>         }
>>      }
>>   
>> @@ -1711,7 +1714,7 @@ assign_varying_locations(struct gl_context
>> *ctx,
>>         }
>>   
>>         if (matched_candidate->toplevel_var-
>>> data.is_unmatched_generic_inout)
>> -         matches.record(matched_candidate->toplevel_var, NULL);
>> +         matches.record(matched_candidate->toplevel_var, NULL, prog-
>>> SeparateShader);
>>      }
>>   
>>      const uint64_t reserved_slots =
> _______________________________________________
> 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