From a5319d9fde79937ac467007951f358ab1a08176b Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 24 Aug 2017 14:47:15 +0200 Subject: [PATCH] mesa: add transform_feedback_varyings() helper Signed-off-by: Samuel Pitoiset Reviewed-by: Timothy Arceri --- src/mesa/main/transformfeedback.c | 63 ++++++++++++++++++------------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c index b2cf30cedbd..b529834fc70 100644 --- a/src/mesa/main/transformfeedback.c +++ b/src/mesa/main/transformfeedback.c @@ -832,6 +832,42 @@ _mesa_BindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer, * This function specifies the transform feedback outputs to be written * to the feedback buffer(s), and in what order. */ +static ALWAYS_INLINE void +transform_feedback_varyings(struct gl_context *ctx, + struct gl_shader_program *shProg, GLsizei count, + const GLchar *const *varyings, GLenum bufferMode) +{ + GLint i; + + /* free existing varyings, if any */ + for (i = 0; i < (GLint) shProg->TransformFeedback.NumVarying; i++) { + free(shProg->TransformFeedback.VaryingNames[i]); + } + free(shProg->TransformFeedback.VaryingNames); + + /* allocate new memory for varying names */ + shProg->TransformFeedback.VaryingNames = + malloc(count * sizeof(GLchar *)); + + if (!shProg->TransformFeedback.VaryingNames) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTransformFeedbackVaryings()"); + return; + } + + /* Save the new names and the count */ + for (i = 0; i < count; i++) { + shProg->TransformFeedback.VaryingNames[i] = strdup(varyings[i]); + } + shProg->TransformFeedback.NumVarying = count; + + shProg->TransformFeedback.BufferMode = bufferMode; + + /* No need to invoke FLUSH_VERTICES or flag NewTransformFeedback since + * the varyings won't be used until shader link time. + */ +} + + void GLAPIENTRY _mesa_TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar * const *varyings, @@ -907,32 +943,7 @@ _mesa_TransformFeedbackVaryings(GLuint program, GLsizei count, } } - /* free existing varyings, if any */ - for (i = 0; i < (GLint) shProg->TransformFeedback.NumVarying; i++) { - free(shProg->TransformFeedback.VaryingNames[i]); - } - free(shProg->TransformFeedback.VaryingNames); - - /* allocate new memory for varying names */ - shProg->TransformFeedback.VaryingNames = - malloc(count * sizeof(GLchar *)); - - if (!shProg->TransformFeedback.VaryingNames) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTransformFeedbackVaryings()"); - return; - } - - /* Save the new names and the count */ - for (i = 0; i < count; i++) { - shProg->TransformFeedback.VaryingNames[i] = strdup(varyings[i]); - } - shProg->TransformFeedback.NumVarying = count; - - shProg->TransformFeedback.BufferMode = bufferMode; - - /* No need to invoke FLUSH_VERTICES or flag NewTransformFeedback since - * the varyings won't be used until shader link time. - */ + transform_feedback_varyings(ctx, shProg, count, varyings, bufferMode); } -- 2.30.2