[Mesa-dev] [PATCH 1/2] mesa: Fix glGetTransformFeedbackVarying().
Paul Berry
stereotype441 at gmail.com
Tue Jan 3 19:26:05 PST 2012
On 3 January 2012 19:19, Ian Romanick <idr at freedesktop.org> wrote:
> On 01/03/2012 06:52 PM, Eric Anholt wrote:
>
>> The current implementation was totally broken -- it was looking in an
>> unpopulated structure for varyings, and trying to do so using the
>> current list of varying names, not the list used at link time.
>> ---
>> src/glsl/linker.cpp | 37 ++++++++++++++++++++++++++++++*
>> *+------
>> src/mesa/main/mtypes.h | 21 ++++++++++++++++++++-
>> src/mesa/main/**transformfeedback.c | 37
>> +++++++++++-------------------**-------
>> 3 files changed, 62 insertions(+), 33 deletions(-)
>>
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index 6587008..bf72a55 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -1382,7 +1382,8 @@ public:
>> bool assign_location(struct gl_context *ctx, struct gl_shader_program
>> *prog,
>> ir_variable *output_var);
>> bool store(struct gl_shader_program *prog,
>> - struct gl_transform_feedback_info *info, unsigned buffer)
>> const;
>> + struct gl_transform_feedback_info *info, unsigned buffer,
>> + unsigned varying) const;
>>
>>
>> /**
>> @@ -1413,7 +1414,7 @@ public:
>> private:
>> /**
>> * The name that was supplied to glTransformFeedbackVaryings. Used
>> for
>> - * error reporting.
>> + * error reporting and glGetTransformFeedbackVarying(**).
>> */
>> const char *orig_name;
>>
>> @@ -1449,6 +1450,9 @@ private:
>> * if this variable is not a matrix.
>> */
>> unsigned matrix_columns;
>> +
>> + /** Type of the varying returned by glGetTransformFeedbackVarying(**)
>> */
>> + GLenum type;
>> };
>>
>>
>> @@ -1520,8 +1524,9 @@ tfeedback_decl::assign_**location(struct
>> gl_context *ctx,
>> /* Array variable */
>> if (!this->is_array) {
>> linker_error(prog, "Transform feedback varying %s found, "
>> - "but it's not an array ([] not expected).",
>> - this->orig_name);
>> + "but array dereference required for varying
>> %s[%d]).",
>> + this->orig_name,
>> + output_var->name, output_var->type->length);
>> return false;
>> }
>> /* Check array bounds. */
>> @@ -1538,6 +1543,7 @@ tfeedback_decl::assign_**location(struct
>> gl_context *ctx,
>> this->location = output_var->location + this->array_index *
>> matrix_cols;
>> this->vector_elements = output_var->type->fields.**
>> array->vector_elements;
>> this->matrix_columns = matrix_cols;
>> + this->type = GL_NONE;
>> } else {
>> /* Regular variable (scalar, vector, or matrix) */
>> if (this->is_array) {
>> @@ -1549,6 +1555,7 @@ tfeedback_decl::assign_**location(struct
>> gl_context *ctx,
>> this->location = output_var->location;
>> this->vector_elements = output_var->type->vector_**elements;
>> this->matrix_columns = output_var->type->matrix_**columns;
>> + this->type = output_var->type->gl_type;
>> }
>> /* From GL_EXT_transform_feedback:
>> * A program will fail to link if:
>> @@ -1580,7 +1587,7 @@ tfeedback_decl::assign_**location(struct
>> gl_context *ctx,
>> bool
>> tfeedback_decl::store(struct gl_shader_program *prog,
>> struct gl_transform_feedback_info *info,
>> - unsigned buffer) const
>> + unsigned buffer, unsigned varying) const
>> {
>> if (!this->is_assigned()) {
>> /* From GL_EXT_transform_feedback:
>> @@ -1602,6 +1609,16 @@ tfeedback_decl::store(struct gl_shader_program
>> *prog,
>> ++info->NumOutputs;
>> info->BufferStride[buffer] += this->vector_elements;
>> }
>> +
>> + info->Varyings[varying].Name = ralloc_strdup(prog, this->orig_name);
>>
>
> Judging from the ralloc_free in the next hunk, is prog the right context?
> It seems like info->Varyings is better.
>
I was just about to make a similar comment. With that change, these two
patches are
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120103/88a77b87/attachment.html>
More information about the mesa-dev
mailing list