mutter/cogl/cogl-boxed-value.h
Neil Roberts 7cdaaf2bd5 Don't use the transpose argument of glUniformMatrix*
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

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

(cherry picked from commit f42ee670ff663d03073d6b1038b21a0aa1b3ec2b)
2012-08-06 14:27:45 +01:00

111 lines
2.9 KiB
C

/*
* Cogl
*
* An object oriented GL/GLES Abstraction/Utility Layer
*
* Copyright (C) 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
#ifndef __COGL_BOXED_VALUE_H
#define __COGL_BOXED_VALUE_H
#include <glib.h>
#include "cogl-context.h"
typedef enum {
COGL_BOXED_NONE,
COGL_BOXED_INT,
COGL_BOXED_FLOAT,
COGL_BOXED_MATRIX
} CoglBoxedType;
typedef struct _CoglBoxedValue
{
CoglBoxedType type;
int size, count;
union {
float float_value[4];
int int_value[4];
float matrix[16];
float *float_array;
int *int_array;
void *array;
} v;
} CoglBoxedValue;
#define _cogl_boxed_value_init(bv) \
G_STMT_START { \
CoglBoxedValue *_bv = (bv); \
_bv->type = COGL_BOXED_NONE; \
_bv->count = 1; \
} G_STMT_END
CoglBool
_cogl_boxed_value_equal (const CoglBoxedValue *bva,
const CoglBoxedValue *bvb);
void
_cogl_boxed_value_set_1f (CoglBoxedValue *bv,
float value);
void
_cogl_boxed_value_set_1i (CoglBoxedValue *bv,
int value);
void
_cogl_boxed_value_set_float (CoglBoxedValue *bv,
int n_components,
int count,
const float *value);
void
_cogl_boxed_value_set_int (CoglBoxedValue *bv,
int n_components,
int count,
const int *value);
void
_cogl_boxed_value_set_matrix (CoglBoxedValue *bv,
int dimensions,
int count,
CoglBool transpose,
const float *value);
/*
* _cogl_boxed_value_copy:
* @dst: The destination boxed value
* @src: The source boxed value
*
* This copies @src to @dst. It is assumed that @dst is initialised.
*/
void
_cogl_boxed_value_copy (CoglBoxedValue *dst,
const CoglBoxedValue *src);
void
_cogl_boxed_value_destroy (CoglBoxedValue *bv);
void
_cogl_boxed_value_set_uniform (CoglContext *ctx,
int location,
const CoglBoxedValue *value);
#endif /* __COGL_BOXED_VALUE_H */