summaryrefslogtreecommitdiffstats
path: root/src/glsl/linker.cpp
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2012-01-04 12:21:55 -0800
committerPaul Berry <[email protected]>2012-01-11 07:57:56 -0800
commitbe4e9f7a0ccb7aa0edef5e5b589bdbbfd4eab3cb (patch)
tree3c9e367606a58cdbf86da35ffc04d2f7ccb4a97e /src/glsl/linker.cpp
parentc62e02000d11e29e70a1000d32cb08d9a450485f (diff)
mesa: Fix computation of transform feedback num_components.
The function tfeedback_decl::num_components() was not correctly accounting for transform feedback of whole arrays and gl_ClipDistance. The bug was hard to notice in tests, because it only affected the checks for MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS and MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS. This patch fixes the computation, and adds an assertion to verify num_components() even when MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS and MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS are not exceeded. The assertion requires keeping track of components_so_far in tfeedback_decl::store(); this will be useful in a future patch to fix non-multiple-of-4-sized gl_ClipDistance. Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/glsl/linker.cpp')
-rw-r--r--src/glsl/linker.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index e8472d44697..f32c2175f59 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1408,7 +1408,10 @@ public:
*/
unsigned num_components() const
{
- return this->vector_elements * this->matrix_columns;
+ if (this->single_component == -1)
+ return this->vector_elements * this->matrix_columns * this->size;
+ else
+ return 1;
}
private:
@@ -1631,6 +1634,7 @@ tfeedback_decl::store(struct gl_shader_program *prog,
this->orig_name);
return false;
}
+ unsigned components_so_far = 0;
for (unsigned index = 0; index < this->size; ++index) {
for (unsigned v = 0; v < this->matrix_columns; ++v) {
unsigned num_components =
@@ -1644,8 +1648,10 @@ tfeedback_decl::store(struct gl_shader_program *prog,
this->single_component >= 0 ? this->single_component : 0;
++info->NumOutputs;
info->BufferStride[buffer] += num_components;
+ components_so_far += num_components;
}
}
+ assert(components_so_far == this->num_components());
info->Varyings[varying].Name = ralloc_strdup(prog, this->orig_name);
info->Varyings[varying].Type = this->type;