mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-29 16:40:13 +01:00
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 <eric@anholt.net>
This commit is contained in:
parent
c62e02000d
commit
be4e9f7a0c
1 changed files with 7 additions and 1 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue