[Mesa-dev] [PATCH] glsl: fix consumer_stage restriction to separate shader objects
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Fri Jan 15 02:34:16 PST 2016
On Fri, 2016-01-15 at 21:29 +1100, Timothy Arceri wrote:
> On Fri, 2016-01-15 at 10:04 +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
> >
> > 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..96f5946 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) ||
> > !separate_shader))) {
>
>
> I think you can just make the above line:
>
> (!separate_shader || consumer_stage != -1)
>
You are right :-) I am going to change it locally.
Sam
>
> > /* 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 =
>
More information about the mesa-dev
mailing list