mesa: Record transform feedback strides/offsets in linker output.
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.
Reviewed-by: Marek Olšák <maraeo@gmail.com>
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 @@
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 @@
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;