diff options
author | Timothy Arceri <[email protected]> | 2016-03-11 23:16:16 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2016-03-31 12:51:38 +1100 |
commit | 99cb5151ed2203842922027fe80512248abad914 (patch) | |
tree | d0e5a3056a2c67ef70f8273951578f203ff618ef | |
parent | 0c66460fc65e1c45ec2268c978ea11b259441212 (diff) |
glsl: sort xfb varyings in offset/buffer order
The existing transform feedback code expects to receive the list
of varyings in increasing buffer order.
Reviewed-by: Dave Airlie <[email protected]>
-rw-r--r-- | src/compiler/glsl/link_varyings.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 33eb7d0e8bc..8aefb7e201d 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -849,6 +849,17 @@ parse_tfeedback_decls(struct gl_context *ctx, struct gl_shader_program *prog, } +static int +cmp_xfb_offset(const void * x_generic, const void * y_generic) +{ + tfeedback_decl *x = (tfeedback_decl *) x_generic; + tfeedback_decl *y = (tfeedback_decl *) y_generic; + + if (x->get_buffer() != y->get_buffer()) + return x->get_buffer() - y->get_buffer(); + return x->get_offset() - y->get_offset(); +} + /** * Store transform feedback location assignments into * prog->LinkedTransformFeedback based on the data stored in tfeedback_decls. @@ -870,6 +881,14 @@ store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog, memset(&prog->LinkedTransformFeedback, 0, sizeof(prog->LinkedTransformFeedback)); + /* The xfb_offset qualifier does not have to be used in increasing order + * however some drivers expect to receive the list of transform feedback + * declarations in order so sort it now for convenience. + */ + if (has_xfb_qualifiers) + qsort(tfeedback_decls, num_tfeedback_decls, sizeof(*tfeedback_decls), + cmp_xfb_offset); + prog->LinkedTransformFeedback.Varyings = rzalloc_array(prog, struct gl_transform_feedback_varying_info, |