[Mesa-dev] [PATCH 1/8] mesa: Record transform feedback strides/offsets in linker output.

Marek Olšák maraeo at gmail.com
Wed Dec 14 12:54:06 PST 2011


Reviewed-by: Marek Olšák <maraeo at gmail.com>

Marek

On Wed, Dec 14, 2011 at 6:00 PM, Paul Berry <stereotype441 at gmail.com> wrote:
> This patch adds two new fields to the gl_transform_feedback_info
> struct:
>
> - BufferStride records the total number of components (per vertex)
>  that transform feedback is being instructed to store in each buffer.
>
> - Outputs[i].DstOffset records the offset within the interleaved
>  structure of each transform feedback output.
>
> These values are needed by the i965 gen6 and r600g back-ends, so it
> seems better to have the linker provide them rather than force each
> back-end to compute them independently.
>
> Also, DstOffset helps pave the way for supporting
> ARB_transform_feedback3, which allows the transform feedback output to
> contain holes between attributes by specifying
> gl_SkipComponents{1,2,3,4} as the varying name.
> ---
>  src/glsl/linker.cpp    |    5 ++++-
>  src/mesa/main/mtypes.h |   10 ++++++++++
>  2 files changed, 14 insertions(+), 1 deletions(-)
>
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index b8a7126..6587008 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -1598,7 +1598,9 @@ tfeedback_decl::store(struct gl_shader_program *prog,
>       info->Outputs[info->NumOutputs].OutputRegister = this->location + v;
>       info->Outputs[info->NumOutputs].NumComponents = this->vector_elements;
>       info->Outputs[info->NumOutputs].OutputBuffer = buffer;
> +      info->Outputs[info->NumOutputs].DstOffset = info->BufferStride[buffer];
>       ++info->NumOutputs;
> +      info->BufferStride[buffer] += this->vector_elements;
>    }
>    return true;
>  }
> @@ -1863,7 +1865,8 @@ store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog,
>                      tfeedback_decl *tfeedback_decls)
>  {
>    unsigned total_tfeedback_components = 0;
> -   prog->LinkedTransformFeedback.NumOutputs = 0;
> +   memset(&prog->LinkedTransformFeedback, 0,
> +          sizeof(prog->LinkedTransformFeedback));
>    for (unsigned i = 0; i < num_tfeedback_decls; ++i) {
>       unsigned buffer =
>          prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS ? i : 0;
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 1934349..e18c5f8 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1821,7 +1821,17 @@ struct gl_transform_feedback_info {
>       unsigned OutputRegister;
>       unsigned OutputBuffer;
>       unsigned NumComponents;
> +
> +      /** offset (in DWORDs) of this output within the interleaved structure */
> +      unsigned DstOffset;
>    } Outputs[MAX_PROGRAM_OUTPUTS];
> +
> +   /**
> +    * Total number of components stored in each buffer.  This may be used by
> +    * hardware back-ends to determine the correct stride when interleaving
> +    * multiple transform feedback outputs in the same buffer.
> +    */
> +   unsigned BufferStride[MAX_FEEDBACK_ATTRIBS];
>  };
>
>  /**
> --
> 1.7.6.4
>


More information about the mesa-dev mailing list