[Mesa-dev] [PATCH v2 04/23] glsl: Assign GLSL StreamIds to transform feedback outputs.

Iago Toral itoral at igalia.com
Wed Jun 18 23:13:40 PDT 2014


On Wed, 2014-06-18 at 12:56 -0700, Ian Romanick wrote:
> On 06/18/2014 02:51 AM, Iago Toral Quiroga wrote:
> > Inter-shader outputs must be on stream 0, which is the default.
> > ---
> >  src/glsl/link_varyings.cpp | 12 +++++++++---
> >  src/glsl/link_varyings.h   |  7 +++++++
> >  2 files changed, 16 insertions(+), 3 deletions(-)
> > 
> > diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
> > index f765d37..9725a43 100644
> > --- a/src/glsl/link_varyings.cpp
> > +++ b/src/glsl/link_varyings.cpp
> > @@ -291,6 +291,7 @@ tfeedback_decl::init(struct gl_context *ctx, const void *mem_ctx,
> >     this->skip_components = 0;
> >     this->next_buffer_separator = false;
> >     this->matched_candidate = NULL;
> > +   this->stream_id = 0;
> >  
> >     if (ctx->Extensions.ARB_transform_feedback3) {
> >        /* Parse gl_NextBuffer. */
> > @@ -355,8 +356,8 @@ tfeedback_decl::is_same(const tfeedback_decl &x, const tfeedback_decl &y)
> >  
> >  
> >  /**
> > - * Assign a location for this tfeedback_decl object based on the transform
> > - * feedback candidate found by find_candidate.
> > + * Assign a location and stream ID for this tfeedback_decl object based on the
> > + * transform feedback candidate found by find_candidate.
> >   *
> >   * If an error occurs, the error is reported through linker_error() and false
> >   * is returned.
> > @@ -437,6 +438,11 @@ tfeedback_decl::assign_location(struct gl_context *ctx,
> >        return false;
> >     }
> >  
> > +   /* Only transform feedback varyings can be assigned to non-zero streams,
> > +    * so assign the stream id here.
> > +    */
> > +   this->stream_id = this->matched_candidate->toplevel_var->data.stream;
> > +
> >     return true;
> >  }
> >  
> > @@ -495,7 +501,7 @@ tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog,
> >        info->Outputs[info->NumOutputs].ComponentOffset = location_frac;
> >        info->Outputs[info->NumOutputs].OutputRegister = location;
> >        info->Outputs[info->NumOutputs].NumComponents = output_size;
> > -      info->Outputs[info->NumOutputs].StreamId = 0;
> > +      info->Outputs[info->NumOutputs].StreamId = stream_id;
> >        info->Outputs[info->NumOutputs].OutputBuffer = buffer;
> >        info->Outputs[info->NumOutputs].DstOffset = info->BufferStride[buffer];
> >        ++info->NumOutputs;
> > diff --git a/src/glsl/link_varyings.h b/src/glsl/link_varyings.h
> > index 6fa2681..4e485c3 100644
> > --- a/src/glsl/link_varyings.h
> > +++ b/src/glsl/link_varyings.h
> > @@ -210,6 +210,13 @@ private:
> >      * data structure that was found.  Otherwise NULL.
> >      */
> >     const tfeedback_candidate *matched_candidate;
> > +
> > +   /**
> > +    * StreamId assigned to this varying (defaults to 0). Can only be set to
> > +    * values other than 0 in geometry shaders that use the stream layout
> > +    * modifier. Accepted values must be in the range [0, MAX_VERTEX_STREAMS].
> 
> MAX_VERTEX_STREAMS-1, right?

Ooops, right. I'll fix that.

> > +    */
> > +   unsigned stream_id;
> >  };
> >  
> >  
> > 
> 
> 




More information about the mesa-dev mailing list