[Cogl] [PATCH] Don't use the transpose argument of glUniformMatrix*

Robert Bragg robert at sixbynine.org
Wed Jun 20 07:36:43 PDT 2012


This looks good to land to me.

Reviewed-by: Robert Bragg <robert at linux.intel.com>

thanks,
- Robert

On Wed, Jun 20, 2012 at 2:25 PM, Neil Roberts <neil at linux.intel.com> wrote:
> According to the GLES1/2 spec, the transpose argument of
> glUniformMatrix* should always be FALSE. Cogl directly exposes the
> transposedness of the uniform value in
> cogl_pipeline_set_uniform_matrix and we were previously passing this
> value on to GL. This patch makes it instead just always transpose the
> matrix in Cogl itself when copying the value to the CoglBoxedValue. It
> doesn't seem like there could be much advantage to letting GL
> transpose the uniform value and at least Mesa just does a very similar
> loop to handle the transpose.
>
> Mesa has started being more pedantic about this which was making
> test_pipeline_uniforms fail.
>
> http://cgit.freedesktop.org/mesa/mesa/commit/?id=60e8a4944081b42127b3
> ---
>  cogl/cogl-boxed-value.c |   49 +++++++++++++++++++++++++++++++++++++++-------
>  cogl/cogl-boxed-value.h |    1 -
>  2 files changed, 41 insertions(+), 9 deletions(-)
>
> diff --git a/cogl/cogl-boxed-value.c b/cogl/cogl-boxed-value.c
> index bc2b8a3..59ff3b6 100644
> --- a/cogl/cogl-boxed-value.c
> +++ b/cogl/cogl-boxed-value.c
> @@ -80,8 +80,7 @@ _cogl_boxed_value_equal (const CoglBoxedValue *bva,
>
>     case COGL_BOXED_MATRIX:
>       if (bva->size != bvb->size ||
> -          bva->count != bvb->count ||
> -          bva->transpose != bvb->transpose)
> +          bva->count != bvb->count)
>         return FALSE;
>
>       if (bva->count == 1)
> @@ -105,6 +104,24 @@ _cogl_boxed_value_equal (const CoglBoxedValue *bva,
>  }
>
>  static void
> +_cogl_boxed_value_tranpose (float *dst,
> +                            int size,
> +                            const float *src)
> +{
> +  int y, x;
> +
> +  /* If the value is transposed we'll just transpose it now as it
> +   * is copied into the boxed value instead of passing TRUE to
> +   * glUniformMatrix because that is not supported on GLES and it
> +   * doesn't seem like the GL driver would be able to do anything
> +   * much smarter than this anyway */
> +
> +  for (y = 0; y < size; y++)
> +    for (x = 0; x < size; x++)
> +      *(dst++) = src[y + x * size];
> +}
> +
> +static void
>  _cogl_boxed_value_set_x (CoglBoxedValue *bv,
>                          int size,
>                          int count,
> @@ -118,7 +135,12 @@ _cogl_boxed_value_set_x (CoglBoxedValue *bv,
>       if (bv->count > 1)
>         g_free (bv->v.array);
>
> -      memcpy (bv->v.float_value, value, value_size);
> +      if (transpose)
> +        _cogl_boxed_value_tranpose (bv->v.float_value,
> +                                    size,
> +                                    value);
> +      else
> +        memcpy (bv->v.float_value, value, value_size);
>     }
>   else
>     {
> @@ -135,13 +157,24 @@ _cogl_boxed_value_set_x (CoglBoxedValue *bv,
>       else
>         bv->v.array = g_malloc (count * value_size);
>
> -      memcpy (bv->v.array, value, count * value_size);
> +      if (transpose)
> +        {
> +          int value_num;
> +
> +          for (value_num = 0; value_num < count; value_num++)
> +            _cogl_boxed_value_tranpose (bv->v.float_array +
> +                                        value_num * size * size,
> +                                        size,
> +                                        (const float *) value +
> +                                        value_num * size * size);
> +        }
> +      else
> +        memcpy (bv->v.array, value, count * value_size);
>     }
>
>   bv->type = type;
>   bv->size = size;
>   bv->count = count;
> -  bv->transpose = transpose;
>  }
>
>  void
> @@ -319,15 +352,15 @@ _cogl_boxed_value_set_uniform (CoglContext *ctx,
>           {
>           case 2:
>             GE( ctx, glUniformMatrix2fv (location, value->count,
> -                                         value->transpose, ptr) );
> +                                         FALSE, ptr) );
>             break;
>           case 3:
>             GE( ctx, glUniformMatrix3fv (location, value->count,
> -                                         value->transpose, ptr) );
> +                                         FALSE, ptr) );
>             break;
>           case 4:
>             GE( ctx, glUniformMatrix4fv (location, value->count,
> -                                         value->transpose, ptr) );
> +                                         FALSE, ptr) );
>             break;
>           }
>       }
> diff --git a/cogl/cogl-boxed-value.h b/cogl/cogl-boxed-value.h
> index 67b9aae..608115a 100644
> --- a/cogl/cogl-boxed-value.h
> +++ b/cogl/cogl-boxed-value.h
> @@ -39,7 +39,6 @@ typedef struct _CoglBoxedValue
>  {
>   CoglBoxedType type;
>   int size, count;
> -  CoglBool transpose;
>
>   union {
>     float float_value[4];
> --
> 1.7.3.16.g9464b
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl


More information about the Cogl mailing list