7cdaaf2bd5
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)
111 lines
2.9 KiB
C
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 */
|