mirror of
https://github.com/brl/mutter.git
synced 2025-04-13 13:49:38 +00:00
cogl-program: Move the code for CoglBoxedValue to its own file
The code for manipulating CoglBoxedValues is now separated from cogl-program.c into its own file. That way when we add support for setting uniform values on a CoglPipeline the code for storing the values can be shared. Reviewed-by: Robert Bragg <robert@linux.intel.com>
This commit is contained in:
parent
d706991579
commit
256f5791fd
@ -327,6 +327,8 @@ cogl_sources_c = \
|
|||||||
$(srcdir)/winsys/cogl-winsys-stub.c \
|
$(srcdir)/winsys/cogl-winsys-stub.c \
|
||||||
$(srcdir)/cogl-config-private.h \
|
$(srcdir)/cogl-config-private.h \
|
||||||
$(srcdir)/cogl-config.c \
|
$(srcdir)/cogl-config.c \
|
||||||
|
$(srcdir)/cogl-boxed-value.h \
|
||||||
|
$(srcdir)/cogl-boxed-value.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
if SUPPORT_XLIB
|
if SUPPORT_XLIB
|
||||||
|
286
cogl/cogl-boxed-value.c
Normal file
286
cogl/cogl-boxed-value.c
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "cogl-boxed-value.h"
|
||||||
|
#include "cogl-context-private.h"
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
_cogl_boxed_value_equal (const CoglBoxedValue *bva,
|
||||||
|
const CoglBoxedValue *bvb)
|
||||||
|
{
|
||||||
|
const void *pa, *pb;
|
||||||
|
|
||||||
|
if (bva->type != bvb->type)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
switch (bva->type)
|
||||||
|
{
|
||||||
|
case COGL_BOXED_NONE:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case COGL_BOXED_INT:
|
||||||
|
if (bva->size != bvb->size || bva->count != bvb->count)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (bva->count == 1)
|
||||||
|
{
|
||||||
|
pa = bva->v.int_value;
|
||||||
|
pb = bvb->v.int_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pa = bva->v.int_array;
|
||||||
|
pb = bvb->v.int_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !memcmp (pa, pb, sizeof (int) * bva->size * bva->count);
|
||||||
|
|
||||||
|
case COGL_BOXED_FLOAT:
|
||||||
|
if (bva->size != bvb->size || bva->count != bvb->count)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (bva->count == 1)
|
||||||
|
{
|
||||||
|
pa = bva->v.float_value;
|
||||||
|
pb = bvb->v.float_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pa = bva->v.float_array;
|
||||||
|
pb = bvb->v.float_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !memcmp (pa, pb, sizeof (float) * bva->size * bva->count);
|
||||||
|
|
||||||
|
case COGL_BOXED_MATRIX:
|
||||||
|
if (bva->size != bvb->size ||
|
||||||
|
bva->count != bvb->count ||
|
||||||
|
bva->transpose != bvb->transpose)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (bva->count == 1)
|
||||||
|
{
|
||||||
|
pa = bva->v.matrix;
|
||||||
|
pb = bvb->v.matrix;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pa = bva->v.array;
|
||||||
|
pb = bvb->v.array;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !memcmp (pa, pb,
|
||||||
|
sizeof (float) * bva->size * bva->size * bva->count);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_warn_if_reached ();
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_boxed_value_set_x (CoglBoxedValue *bv,
|
||||||
|
int size,
|
||||||
|
int count,
|
||||||
|
CoglBoxedType type,
|
||||||
|
gsize value_size,
|
||||||
|
gconstpointer value,
|
||||||
|
gboolean transpose)
|
||||||
|
{
|
||||||
|
if (count == 1)
|
||||||
|
{
|
||||||
|
if (bv->count > 1)
|
||||||
|
g_free (bv->v.array);
|
||||||
|
|
||||||
|
memcpy (bv->v.float_value, value, value_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bv->count > 1)
|
||||||
|
{
|
||||||
|
if (bv->count != count ||
|
||||||
|
bv->size != size ||
|
||||||
|
bv->type != type)
|
||||||
|
{
|
||||||
|
g_free (bv->v.array);
|
||||||
|
bv->v.array = g_malloc (count * value_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
bv->v.array = g_malloc (count * value_size);
|
||||||
|
|
||||||
|
memcpy (bv->v.array, value, count * value_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
bv->type = type;
|
||||||
|
bv->size = size;
|
||||||
|
bv->count = count;
|
||||||
|
bv->transpose = transpose;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_boxed_value_set_1f (CoglBoxedValue *bv,
|
||||||
|
float value)
|
||||||
|
{
|
||||||
|
_cogl_boxed_value_set_x (bv,
|
||||||
|
1, 1, COGL_BOXED_FLOAT,
|
||||||
|
sizeof (float), &value, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_boxed_value_set_1i (CoglBoxedValue *bv,
|
||||||
|
int value)
|
||||||
|
{
|
||||||
|
_cogl_boxed_value_set_x (bv,
|
||||||
|
1, 1, COGL_BOXED_INT,
|
||||||
|
sizeof (int), &value, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_boxed_value_set_float (CoglBoxedValue *bv,
|
||||||
|
int n_components,
|
||||||
|
int count,
|
||||||
|
const float *value)
|
||||||
|
{
|
||||||
|
_cogl_boxed_value_set_x (bv,
|
||||||
|
n_components, count,
|
||||||
|
COGL_BOXED_FLOAT,
|
||||||
|
sizeof (float) * n_components, value, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_boxed_value_set_int (CoglBoxedValue *bv,
|
||||||
|
int n_components,
|
||||||
|
int count,
|
||||||
|
const int *value)
|
||||||
|
{
|
||||||
|
_cogl_boxed_value_set_x (bv,
|
||||||
|
n_components, count,
|
||||||
|
COGL_BOXED_INT,
|
||||||
|
sizeof (int) * n_components, value, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_boxed_value_set_matrix (CoglBoxedValue *bv,
|
||||||
|
int dimensions,
|
||||||
|
int count,
|
||||||
|
gboolean transpose,
|
||||||
|
const float *value)
|
||||||
|
{
|
||||||
|
_cogl_boxed_value_set_x (bv,
|
||||||
|
dimensions, count,
|
||||||
|
COGL_BOXED_MATRIX,
|
||||||
|
sizeof (float) * dimensions * dimensions,
|
||||||
|
value,
|
||||||
|
transpose);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_boxed_value_destroy (CoglBoxedValue *bv)
|
||||||
|
{
|
||||||
|
if (bv->count > 1)
|
||||||
|
g_free (bv->v.array);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_boxed_value_set_uniform (CoglContext *ctx,
|
||||||
|
GLint location,
|
||||||
|
const CoglBoxedValue *value)
|
||||||
|
{
|
||||||
|
switch (value->type)
|
||||||
|
{
|
||||||
|
case COGL_BOXED_NONE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COGL_BOXED_INT:
|
||||||
|
{
|
||||||
|
const int *ptr;
|
||||||
|
|
||||||
|
if (value->count == 1)
|
||||||
|
ptr = value->v.int_value;
|
||||||
|
else
|
||||||
|
ptr = value->v.int_array;
|
||||||
|
|
||||||
|
switch (value->size)
|
||||||
|
{
|
||||||
|
case 1: ctx->glUniform1iv (location, value->count, ptr); break;
|
||||||
|
case 2: ctx->glUniform2iv (location, value->count, ptr); break;
|
||||||
|
case 3: ctx->glUniform3iv (location, value->count, ptr); break;
|
||||||
|
case 4: ctx->glUniform4iv (location, value->count, ptr); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COGL_BOXED_FLOAT:
|
||||||
|
{
|
||||||
|
const float *ptr;
|
||||||
|
|
||||||
|
if (value->count == 1)
|
||||||
|
ptr = value->v.float_value;
|
||||||
|
else
|
||||||
|
ptr = value->v.float_array;
|
||||||
|
|
||||||
|
switch (value->size)
|
||||||
|
{
|
||||||
|
case 1: ctx->glUniform1fv (location, value->count, ptr); break;
|
||||||
|
case 2: ctx->glUniform2fv (location, value->count, ptr); break;
|
||||||
|
case 3: ctx->glUniform3fv (location, value->count, ptr); break;
|
||||||
|
case 4: ctx->glUniform4fv (location, value->count, ptr); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COGL_BOXED_MATRIX:
|
||||||
|
{
|
||||||
|
const float *ptr;
|
||||||
|
|
||||||
|
if (value->count == 1)
|
||||||
|
ptr = value->v.matrix;
|
||||||
|
else
|
||||||
|
ptr = value->v.float_array;
|
||||||
|
|
||||||
|
switch (value->size)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
ctx->glUniformMatrix2fv (location, value->count,
|
||||||
|
value->transpose, ptr);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ctx->glUniformMatrix3fv (location, value->count,
|
||||||
|
value->transpose, ptr);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
ctx->glUniformMatrix4fv (location, value->count,
|
||||||
|
value->transpose, ptr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
100
cogl/cogl-boxed-value.h
Normal file
100
cogl/cogl-boxed-value.h
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
gboolean transpose;
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
_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,
|
||||||
|
gboolean transpose,
|
||||||
|
const float *value);
|
||||||
|
|
||||||
|
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 */
|
@ -32,29 +32,6 @@
|
|||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
COGL_BOXED_NONE,
|
|
||||||
COGL_BOXED_INT,
|
|
||||||
COGL_BOXED_FLOAT,
|
|
||||||
COGL_BOXED_MATRIX
|
|
||||||
} CoglBoxedType;
|
|
||||||
|
|
||||||
typedef struct _CoglBoxedValue
|
|
||||||
{
|
|
||||||
CoglBoxedType type;
|
|
||||||
int size, count;
|
|
||||||
gboolean transpose;
|
|
||||||
|
|
||||||
union {
|
|
||||||
float float_value[4];
|
|
||||||
int int_value[4];
|
|
||||||
float matrix[16];
|
|
||||||
float *float_array;
|
|
||||||
int *int_array;
|
|
||||||
void *array;
|
|
||||||
} v;
|
|
||||||
} CoglBoxedValue;
|
|
||||||
|
|
||||||
#ifdef COGL_GL_DEBUG
|
#ifdef COGL_GL_DEBUG
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "cogl-profile.h"
|
#include "cogl-profile.h"
|
||||||
#include "cogl-queue.h"
|
#include "cogl-queue.h"
|
||||||
#include "cogl-internal.h"
|
#include "cogl-internal.h"
|
||||||
|
#include "cogl-boxed-value.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
|
@ -189,71 +189,34 @@ cogl_program_get_uniform_location (CoglHandle handle,
|
|||||||
return program->custom_uniforms->len - 1;
|
return program->custom_uniforms->len - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static CoglProgramUniform *
|
||||||
cogl_program_uniform_x (CoglHandle handle,
|
cogl_program_modify_uniform (CoglProgram *program,
|
||||||
int uniform_no,
|
int uniform_no)
|
||||||
int size,
|
|
||||||
int count,
|
|
||||||
CoglBoxedType type,
|
|
||||||
gsize value_size,
|
|
||||||
gconstpointer value,
|
|
||||||
gboolean transpose)
|
|
||||||
{
|
{
|
||||||
CoglProgram *program = handle;
|
CoglProgramUniform *uniform;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_RETURN_VAL_IF_FAIL (cogl_is_program (program), NULL);
|
||||||
|
_COGL_RETURN_VAL_IF_FAIL (uniform_no >= 0 &&
|
||||||
|
uniform_no < program->custom_uniforms->len,
|
||||||
|
NULL);
|
||||||
|
|
||||||
_COGL_RETURN_IF_FAIL (cogl_is_program (handle));
|
uniform = &g_array_index (program->custom_uniforms,
|
||||||
_COGL_RETURN_IF_FAIL (program != NULL);
|
CoglProgramUniform, uniform_no);
|
||||||
|
uniform->dirty = TRUE;
|
||||||
|
|
||||||
if (uniform_no >= 0 && uniform_no < program->custom_uniforms->len &&
|
return uniform;
|
||||||
size >= 1 && size <= 4 && count >= 1)
|
|
||||||
{
|
|
||||||
CoglProgramUniform *uniform =
|
|
||||||
&g_array_index (program->custom_uniforms,
|
|
||||||
CoglProgramUniform, uniform_no);
|
|
||||||
|
|
||||||
if (count == 1)
|
|
||||||
{
|
|
||||||
if (uniform->value.count > 1)
|
|
||||||
g_free (uniform->value.v.array);
|
|
||||||
|
|
||||||
memcpy (uniform->value.v.float_value, value, value_size);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (uniform->value.count > 1)
|
|
||||||
{
|
|
||||||
if (uniform->value.count != count ||
|
|
||||||
uniform->value.size != size ||
|
|
||||||
uniform->value.type != type)
|
|
||||||
{
|
|
||||||
g_free (uniform->value.v.array);
|
|
||||||
uniform->value.v.array = g_malloc (count * value_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
uniform->value.v.array = g_malloc (count * value_size);
|
|
||||||
|
|
||||||
memcpy (uniform->value.v.array, value, count * value_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
uniform->value.type = type;
|
|
||||||
uniform->value.size = size;
|
|
||||||
uniform->value.count = count;
|
|
||||||
uniform->value.transpose = transpose;
|
|
||||||
uniform->dirty = TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_program_uniform_1f (int uniform_no,
|
cogl_program_uniform_1f (int uniform_no,
|
||||||
float value)
|
float value)
|
||||||
{
|
{
|
||||||
|
CoglProgramUniform *uniform;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
cogl_program_uniform_x (ctx->current_program,
|
|
||||||
uniform_no, 1, 1, COGL_BOXED_FLOAT,
|
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
|
||||||
sizeof (float), &value, FALSE);
|
_cogl_boxed_value_set_1f (&uniform->value, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -261,19 +224,22 @@ cogl_program_set_uniform_1f (CoglHandle handle,
|
|||||||
int uniform_location,
|
int uniform_location,
|
||||||
float value)
|
float value)
|
||||||
{
|
{
|
||||||
cogl_program_uniform_x (handle,
|
CoglProgramUniform *uniform;
|
||||||
uniform_location, 1, 1, COGL_BOXED_FLOAT,
|
|
||||||
sizeof (float), &value, FALSE);
|
uniform = cogl_program_modify_uniform (handle, uniform_location);
|
||||||
|
_cogl_boxed_value_set_1f (&uniform->value, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_program_uniform_1i (int uniform_no,
|
cogl_program_uniform_1i (int uniform_no,
|
||||||
int value)
|
int value)
|
||||||
{
|
{
|
||||||
|
CoglProgramUniform *uniform;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
cogl_program_uniform_x (ctx->current_program,
|
|
||||||
uniform_no, 1, 1, COGL_BOXED_INT,
|
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
|
||||||
sizeof (int), &value, FALSE);
|
_cogl_boxed_value_set_1i (&uniform->value, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -281,21 +247,24 @@ cogl_program_set_uniform_1i (CoglHandle handle,
|
|||||||
int uniform_location,
|
int uniform_location,
|
||||||
int value)
|
int value)
|
||||||
{
|
{
|
||||||
cogl_program_uniform_x (handle,
|
CoglProgramUniform *uniform;
|
||||||
uniform_location, 1, 1, COGL_BOXED_INT,
|
|
||||||
sizeof (int), &value, FALSE);
|
uniform = cogl_program_modify_uniform (handle, uniform_location);
|
||||||
|
_cogl_boxed_value_set_1i (&uniform->value, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_program_uniform_float (int uniform_no,
|
cogl_program_uniform_float (int uniform_no,
|
||||||
int size,
|
int size,
|
||||||
int count,
|
int count,
|
||||||
const GLfloat *value)
|
const float *value)
|
||||||
{
|
{
|
||||||
|
CoglProgramUniform *uniform;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
cogl_program_uniform_x (ctx->current_program,
|
|
||||||
uniform_no, size, count, COGL_BOXED_FLOAT,
|
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
|
||||||
sizeof (float) * size, value, FALSE);
|
_cogl_boxed_value_set_float (&uniform->value, size, count, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -305,22 +274,24 @@ cogl_program_set_uniform_float (CoglHandle handle,
|
|||||||
int count,
|
int count,
|
||||||
const float *value)
|
const float *value)
|
||||||
{
|
{
|
||||||
cogl_program_uniform_x (handle,
|
CoglProgramUniform *uniform;
|
||||||
uniform_location, n_components, count,
|
|
||||||
COGL_BOXED_FLOAT,
|
uniform = cogl_program_modify_uniform (handle, uniform_location);
|
||||||
sizeof (float) * n_components, value, FALSE);
|
_cogl_boxed_value_set_float (&uniform->value, n_components, count, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_program_uniform_int (int uniform_no,
|
cogl_program_uniform_int (int uniform_no,
|
||||||
int size,
|
int size,
|
||||||
int count,
|
int count,
|
||||||
const GLint *value)
|
const int *value)
|
||||||
{
|
{
|
||||||
|
CoglProgramUniform *uniform;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
cogl_program_uniform_x (ctx->current_program,
|
|
||||||
uniform_no, size, count, COGL_BOXED_INT,
|
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
|
||||||
sizeof (int) * size, value, FALSE);
|
_cogl_boxed_value_set_int (&uniform->value, size, count, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -330,10 +301,10 @@ cogl_program_set_uniform_int (CoglHandle handle,
|
|||||||
int count,
|
int count,
|
||||||
const int *value)
|
const int *value)
|
||||||
{
|
{
|
||||||
cogl_program_uniform_x (handle,
|
CoglProgramUniform *uniform;
|
||||||
uniform_location, n_components, count,
|
|
||||||
COGL_BOXED_INT,
|
uniform = cogl_program_modify_uniform (handle, uniform_location);
|
||||||
sizeof (int) * n_components, value, FALSE);
|
_cogl_boxed_value_set_int (&uniform->value, n_components, count, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -344,14 +315,14 @@ cogl_program_set_uniform_matrix (CoglHandle handle,
|
|||||||
gboolean transpose,
|
gboolean transpose,
|
||||||
const float *value)
|
const float *value)
|
||||||
{
|
{
|
||||||
_COGL_RETURN_IF_FAIL (cogl_is_program (handle));
|
CoglProgramUniform *uniform;
|
||||||
|
|
||||||
cogl_program_uniform_x (handle,
|
uniform = cogl_program_modify_uniform (handle, uniform_location);
|
||||||
uniform_location, dimensions, count,
|
_cogl_boxed_value_set_matrix (&uniform->value,
|
||||||
COGL_BOXED_MATRIX,
|
dimensions,
|
||||||
sizeof (float) * dimensions * dimensions,
|
count,
|
||||||
value,
|
transpose,
|
||||||
transpose);
|
value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -361,9 +332,12 @@ cogl_program_uniform_matrix (int uniform_no,
|
|||||||
gboolean transpose,
|
gboolean transpose,
|
||||||
const float *value)
|
const float *value)
|
||||||
{
|
{
|
||||||
|
CoglProgramUniform *uniform;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
cogl_program_set_uniform_matrix (ctx->current_program,
|
|
||||||
uniform_no, size, count, transpose, value);
|
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
|
||||||
|
_cogl_boxed_value_set_matrix (&uniform->value, size, count, transpose, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ARBfp local parameters can be referenced like:
|
/* ARBfp local parameters can be referenced like:
|
||||||
@ -398,84 +372,6 @@ get_local_param_index (const char *uniform_name)
|
|||||||
return _index;
|
return _index;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_cogl_program_flush_uniform_glsl (GLint location,
|
|
||||||
CoglBoxedValue *value)
|
|
||||||
{
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
|
||||||
|
|
||||||
switch (value->type)
|
|
||||||
{
|
|
||||||
case COGL_BOXED_NONE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case COGL_BOXED_INT:
|
|
||||||
{
|
|
||||||
int *ptr;
|
|
||||||
|
|
||||||
if (value->count == 1)
|
|
||||||
ptr = value->v.int_value;
|
|
||||||
else
|
|
||||||
ptr = value->v.int_array;
|
|
||||||
|
|
||||||
switch (value->size)
|
|
||||||
{
|
|
||||||
case 1: ctx->glUniform1iv (location, value->count, ptr); break;
|
|
||||||
case 2: ctx->glUniform2iv (location, value->count, ptr); break;
|
|
||||||
case 3: ctx->glUniform3iv (location, value->count, ptr); break;
|
|
||||||
case 4: ctx->glUniform4iv (location, value->count, ptr); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case COGL_BOXED_FLOAT:
|
|
||||||
{
|
|
||||||
float *ptr;
|
|
||||||
|
|
||||||
if (value->count == 1)
|
|
||||||
ptr = value->v.float_value;
|
|
||||||
else
|
|
||||||
ptr = value->v.float_array;
|
|
||||||
|
|
||||||
switch (value->size)
|
|
||||||
{
|
|
||||||
case 1: ctx->glUniform1fv (location, value->count, ptr); break;
|
|
||||||
case 2: ctx->glUniform2fv (location, value->count, ptr); break;
|
|
||||||
case 3: ctx->glUniform3fv (location, value->count, ptr); break;
|
|
||||||
case 4: ctx->glUniform4fv (location, value->count, ptr); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case COGL_BOXED_MATRIX:
|
|
||||||
{
|
|
||||||
float *ptr;
|
|
||||||
|
|
||||||
if (value->count == 1)
|
|
||||||
ptr = value->v.matrix;
|
|
||||||
else
|
|
||||||
ptr = value->v.float_array;
|
|
||||||
|
|
||||||
switch (value->size)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
ctx->glUniformMatrix2fv (location, value->count,
|
|
||||||
value->transpose, ptr);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
ctx->glUniformMatrix3fv (location, value->count,
|
|
||||||
value->transpose, ptr);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
ctx->glUniformMatrix4fv (location, value->count,
|
|
||||||
value->transpose, ptr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_COGL_GL
|
#ifdef HAVE_COGL_GL
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -536,8 +432,9 @@ _cogl_program_flush_uniforms (CoglProgram *program,
|
|||||||
switch (_cogl_program_get_language (program))
|
switch (_cogl_program_get_language (program))
|
||||||
{
|
{
|
||||||
case COGL_SHADER_LANGUAGE_GLSL:
|
case COGL_SHADER_LANGUAGE_GLSL:
|
||||||
_cogl_program_flush_uniform_glsl (uniform->location,
|
_cogl_boxed_value_set_uniform (ctx,
|
||||||
&uniform->value);
|
uniform->location,
|
||||||
|
&uniform->value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COGL_SHADER_LANGUAGE_ARBFP:
|
case COGL_SHADER_LANGUAGE_ARBFP:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user