cogl-program: Adds use_uniform_xyz methods

Instead of exposing an API that provides an OpenGL state machine style
where you first have to bind the program to the context using
cogl_program_use() followed by updating uniforms using
cogl_program_uniform_xyz we now have uniform setter methods that take an
explicit CoglHandle for the program.

This deprecates cogl_program_use and all the cogl_program_uniform
variants and provides the following replacements:
    cogl_program_set_uniform_1i
    cogl_program_set_uniform_1f
    cogl_program_set_uniform_int
    cogl_program_set_uniform_float
    cogl_program_set_uniform_matrix
This commit is contained in:
Robert Bragg 2010-08-11 19:18:14 +01:00
parent 2f54f8f0ea
commit f03037d580
4 changed files with 321 additions and 97 deletions

View File

@ -258,13 +258,120 @@ int
cogl_program_get_uniform_location (CoglHandle handle, cogl_program_get_uniform_location (CoglHandle handle,
const char *uniform_name); const char *uniform_name);
/**
* cogl_program_set_uniform_1f:
* @program: A #CoglHandle for a linked program
* @uniform_location: the uniform location retrieved from
* cogl_program_get_uniform_location().
* @value: the new value of the uniform.
*
* Changes the value of a floating point uniform for the given linked
* @program.
*
* Since: 1.4
*/
void
cogl_program_set_uniform_1f (CoglHandle program,
int uniform_location,
float value);
/**
* cogl_program_set_uniform_1i:
* @program: A #CoglHandle for a linked program
* @uniform_location: the uniform location retrieved from
* cogl_program_get_uniform_location().
* @value: the new value of the uniform.
*
* Changes the value of an integer uniform for the given linked
* @program.
*
* Since: 1.4
*/
void
cogl_program_set_uniform_1i (CoglHandle program,
int uniform_location,
int value);
/**
* cogl_program_set_uniform_float:
* @program: A #CoglHandle for a linked program
* @uniform_location: the uniform location retrieved from
* cogl_program_get_uniform_location().
* @n_components: The number of components for the uniform. For
* example with glsl you'd use 3 for a vec3 or 4 for a vec4.
* @count: For uniform arrays this is the array length otherwise just
* pass 1
* @value: (array length=count): the new value of the uniform[s].
*
* Changes the value of a float vector uniform, or uniform array for
* the given linked @program.
*
* Since: 1.4
*/
void
cogl_program_set_uniform_float (CoglHandle program,
int uniform_location,
int n_components,
int count,
const float *value);
/**
* cogl_program_set_uniform_int:
* @program: A #CoglHandle for a linked program
* @uniform_location: the uniform location retrieved from
* cogl_program_get_uniform_location().
* @n_components: The number of components for the uniform. For
* example with glsl you'd use 3 for a vec3 or 4 for a vec4.
* @count: For uniform arrays this is the array length otherwise just
* pass 1
* @value: (array length=count): the new value of the uniform[s].
*
* Changes the value of a int vector uniform, or uniform array for
* the given linked @program.
*
* Since: 1.4
*/
void
cogl_program_set_uniform_int (CoglHandle program,
int uniform_location,
int n_components,
int count,
const int *value);
/**
* cogl_program_set_uniform_matrix:
* @program: A #CoglHandle for a linked program
* @uniform_location: the uniform location retrieved from
* cogl_program_get_uniform_location().
* @dimensions: The dimensions of the matrix. So for for example pass
* 2 for a 2x2 matrix or 3 for 3x3.
* @count: For uniform arrays this is the array length otherwise just
* pass 1
* @transpose: Whether to transpose the matrix when setting the uniform.
* @value: (array length=count): the new value of the uniform.
*
* Changes the value of a matrix uniform, or uniform array in the
* given linked @program.
*
* Since: 1.4
*/
void
cogl_program_set_uniform_matrix (CoglHandle program,
int uniform_location,
int dimensions,
int count,
gboolean transpose,
const float *value);
/** /**
* cogl_program_uniform_1f: * cogl_program_uniform_1f:
* @uniform_no: the unform to set. * @uniform_no: the uniform to set.
* @value: the new value of the uniform. * @value: the new value of the uniform.
* *
* Changes the value of a floating point uniform in the currently * Changes the value of a floating point uniform in the currently
* used (see cogl_program_use()) shader program. * used (see cogl_program_use()) shader program.
*
* Deprecated: 1.4: Use cogl_program_set_uniform_1f() instead.
*/ */
void void
cogl_program_uniform_1f (int uniform_no, cogl_program_uniform_1f (int uniform_no,
@ -272,17 +379,19 @@ cogl_program_uniform_1f (int uniform_no,
/** /**
* cogl_program_uniform_1i: * cogl_program_uniform_1i:
* @uniform_no: the unform to set. * @uniform_no: the uniform to set.
* @value: the new value of the uniform. * @value: the new value of the uniform.
* *
* Changes the value of an integer uniform in the currently * Changes the value of an integer uniform in the currently
* used (see cogl_program_use()) shader program. * used (see cogl_program_use()) shader program.
*
* Deprecated: 1.4: Use cogl_program_set_uniform_1i() instead.
*/ */
void void
cogl_program_uniform_1i (int uniform_no, cogl_program_uniform_1i (int uniform_no,
int value); int value);
/** /**
* cogl_program_uniform_float: * cogl_program_uniform_float:
* @uniform_no: the uniform to set. * @uniform_no: the uniform to set.
* @size: Size of float vector. * @size: Size of float vector.
@ -291,12 +400,14 @@ cogl_program_uniform_1i (int uniform_no,
* *
* Changes the value of a float vector uniform, or uniform array in the * Changes the value of a float vector uniform, or uniform array in the
* currently used (see cogl_program_use()) shader program. * currently used (see cogl_program_use()) shader program.
*
* Deprecated: 1.4: Use cogl_program_set_uniform_float() instead.
*/ */
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);
/** /**
* cogl_program_uniform_int: * cogl_program_uniform_int:

View File

@ -269,65 +269,77 @@ cogl_program_get_uniform_location (CoglHandle handle,
} }
void void
cogl_program_uniform_1f (int uniform_no, cogl_program_set_uniform_1f (CoglHandle handle,
float value) int uniform_location,
float value)
{ {
CoglProgram *program; CoglProgram *program = handle;
_COGL_GET_CONTEXT (ctx, NO_RETVAL); _COGL_GET_CONTEXT (ctx, NO_RETVAL);
program = ctx->current_program; g_return_if_fail (cogl_is_program (handle));
g_return_if_fail (program != NULL);
g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP); g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP);
_cogl_gl_use_program_wrapper (program); _cogl_gl_use_program_wrapper (program);
GE (glUniform1f (uniform_no, value)); GE (glUniform1f (uniform_location, value));
} }
void void
cogl_program_uniform_1i (int uniform_no, cogl_program_uniform_1f (int uniform_location,
int value) float value)
{ {
CoglProgram *program; _COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_set_uniform_1f (ctx->current_program,
uniform_location, value);
}
void
cogl_program_set_uniform_1i (CoglHandle handle,
int uniform_location,
int value)
{
CoglProgram *program = handle;
_COGL_GET_CONTEXT (ctx, NO_RETVAL); _COGL_GET_CONTEXT (ctx, NO_RETVAL);
program = ctx->current_program; g_return_if_fail (cogl_is_program (handle));
g_return_if_fail (program != NULL);
g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP); g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP);
_cogl_gl_use_program_wrapper (program); _cogl_gl_use_program_wrapper (program);
GE (glUniform1i (uniform_no, value)); GE (glUniform1i (uniform_location, value));
} }
void void
cogl_program_uniform_float (int uniform_no, cogl_program_uniform_1i (int uniform_location,
int size, int value)
int count,
const GLfloat *value)
{ {
CoglProgram *program; _COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_set_uniform_1i (ctx->current_program, uniform_location, value);
}
void
cogl_program_set_uniform_float (CoglHandle handle,
int uniform_location,
int n_components,
int count,
const float *value)
{
CoglProgram *program = handle;
_COGL_GET_CONTEXT (ctx, NO_RETVAL); _COGL_GET_CONTEXT (ctx, NO_RETVAL);
program = ctx->current_program; g_return_if_fail (cogl_is_program (handle));
g_return_if_fail (program != NULL);
if (program->language == COGL_SHADER_LANGUAGE_ARBFP) if (program->language == COGL_SHADER_LANGUAGE_ARBFP)
{ {
unsigned int _index = uniform_no; unsigned int _index = uniform_location;
unsigned int index_end = _index + count; unsigned int index_end = _index + count;
int i; int i;
int j; int j;
g_return_if_fail (size == 4); g_return_if_fail (n_components == 4);
GE (glBindProgram (GL_FRAGMENT_PROGRAM_ARB, program->gl_handle)); GE (glBindProgram (GL_FRAGMENT_PROGRAM_ARB, program->gl_handle));
@ -344,19 +356,19 @@ cogl_program_uniform_float (int uniform_no,
{ {
_cogl_gl_use_program_wrapper (program); _cogl_gl_use_program_wrapper (program);
switch (size) switch (n_components)
{ {
case 1: case 1:
GE (glUniform1fv (uniform_no, count, value)); GE (glUniform1fv (uniform_location, count, value));
break; break;
case 2: case 2:
GE (glUniform2fv (uniform_no, count, value)); GE (glUniform2fv (uniform_location, count, value));
break; break;
case 3: case 3:
GE (glUniform3fv (uniform_no, count, value)); GE (glUniform3fv (uniform_location, count, value));
break; break;
case 4: case 4:
GE (glUniform4fv (uniform_no, count, value)); GE (glUniform4fv (uniform_location, count, value));
break; break;
default: default:
g_warning ("%s called with invalid size parameter", G_STRFUNC); g_warning ("%s called with invalid size parameter", G_STRFUNC);
@ -365,34 +377,45 @@ cogl_program_uniform_float (int uniform_no,
} }
void void
cogl_program_uniform_int (int uniform_no, cogl_program_uniform_float (int uniform_location,
int size, int n_components,
int count, int count,
const int *value) const float *value)
{ {
CoglProgram *program; _COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_set_uniform_float (ctx->current_program,
uniform_location,
n_components, count, value);
}
void
cogl_program_set_uniform_int (CoglHandle handle,
int uniform_location,
int n_components,
int count,
const int *value)
{
CoglProgram *program = handle;
_COGL_GET_CONTEXT (ctx, NO_RETVAL); _COGL_GET_CONTEXT (ctx, NO_RETVAL);
program = ctx->current_program; g_return_if_fail (cogl_is_program (handle));
g_return_if_fail (program != NULL);
_cogl_gl_use_program_wrapper (program); _cogl_gl_use_program_wrapper (program);
switch (size) switch (n_components)
{ {
case 1: case 1:
glUniform1iv (uniform_no, count, value); glUniform1iv (uniform_location, count, value);
break; break;
case 2: case 2:
glUniform2iv (uniform_no, count, value); glUniform2iv (uniform_location, count, value);
break; break;
case 3: case 3:
glUniform3iv (uniform_no, count, value); glUniform3iv (uniform_location, count, value);
break; break;
case 4: case 4:
glUniform4iv (uniform_no, count, value); glUniform4iv (uniform_location, count, value);
break; break;
default: default:
g_warning ("%s called with invalid size parameter", G_STRFUNC); g_warning ("%s called with invalid size parameter", G_STRFUNC);
@ -400,40 +423,62 @@ cogl_program_uniform_int (int uniform_no,
} }
void void
cogl_program_uniform_matrix (int uniform_no, cogl_program_uniform_int (int uniform_location,
int size, int n_components,
int count, int count,
gboolean transpose, const int *value)
const GLfloat *value)
{ {
CoglProgram *program; _COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_set_uniform_int (ctx->current_program,
uniform_location, n_components, count, value);
}
void
cogl_program_set_uniform_matrix (CoglHandle handle,
int uniform_location,
int n_components,
int count,
gboolean transpose,
const float*value)
{
CoglProgram *program = handle;
_COGL_GET_CONTEXT (ctx, NO_RETVAL); _COGL_GET_CONTEXT (ctx, NO_RETVAL);
program = ctx->current_program; g_return_if_fail (cogl_is_program (handle));
g_return_if_fail (program != NULL);
g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP); g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP);
_cogl_gl_use_program_wrapper (program); _cogl_gl_use_program_wrapper (program);
switch (size) switch (n_components)
{ {
case 2 : case 2 :
GE (glUniformMatrix2fv (uniform_no, count, transpose, value)); GE (glUniformMatrix2fv (uniform_location, count, transpose, value));
break; break;
case 3 : case 3 :
GE (glUniformMatrix3fv (uniform_no, count, transpose, value)); GE (glUniformMatrix3fv (uniform_location, count, transpose, value));
break; break;
case 4 : case 4 :
GE (glUniformMatrix4fv (uniform_no, count, transpose, value)); GE (glUniformMatrix4fv (uniform_location, count, transpose, value));
break; break;
default : default :
g_warning ("%s called with invalid size parameter", G_STRFUNC); g_warning ("%s called with invalid size parameter", G_STRFUNC);
} }
} }
void
cogl_program_uniform_matrix (int uniform_location,
int dimensions,
int count,
gboolean transpose,
const float *value)
{
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_set_uniform_matrix (ctx->current_program,
uniform_location, dimensions,
count, transpose, value);
}
CoglShaderLanguage CoglShaderLanguage
_cogl_program_get_language (CoglHandle handle) _cogl_program_get_language (CoglHandle handle)
{ {

View File

@ -166,34 +166,20 @@ cogl_program_get_uniform_location (CoglHandle handle,
return -1; return -1;
} }
void
cogl_program_uniform_1f (int uniform_no,
float value)
{
cogl_program_uniform_float (uniform_no, 1, 1, &value);
}
void
cogl_program_uniform_1i (int uniform_no,
int value)
{
cogl_program_uniform_int (uniform_no, 1, 1, &value);
}
static void static void
cogl_program_uniform_x (int uniform_no, cogl_program_uniform_x (CoglHandle handle,
int uniform_no,
int size, int size,
int count, int count,
CoglBoxedType type, CoglBoxedType type,
gsize value_size, gsize value_size,
gconstpointer value) gconstpointer value)
{ {
CoglProgram *program; CoglProgram *program = handle;
_COGL_GET_CONTEXT (ctx, NO_RETVAL); _COGL_GET_CONTEXT (ctx, NO_RETVAL);
program = ctx->current_program; g_return_if_fail (cogl_is_program (handle));
g_return_if_fail (program != NULL); g_return_if_fail (program != NULL);
if (uniform_no >= 0 && uniform_no < COGL_PROGRAM_NUM_CUSTOM_UNIFORMS if (uniform_no >= 0 && uniform_no < COGL_PROGRAM_NUM_CUSTOM_UNIFORMS
@ -232,48 +218,125 @@ cogl_program_uniform_x (int uniform_no,
} }
} }
void
cogl_program_uniform_1f (int uniform_no,
float value)
{
cogl_program_uniform_float (uniform_no, 1, 1, &value);
}
void
cogl_program_set_uniform_1f (CoglHandle handle,
int uniform_location,
float value)
{
cogl_program_uniform_x (handle,
uniform_location, 1, 1, COGL_BOXED_FLOAT,
sizeof (float), &value);
}
void
cogl_program_uniform_1i (int uniform_no,
int value)
{
cogl_program_uniform_int (uniform_no, 1, 1, &value);
}
void
cogl_program_set_uniform_1i (CoglHandle handle,
int uniform_location,
int value)
{
cogl_program_uniform_x (handle,
uniform_location, 1, 1, COGL_BOXED_INT,
sizeof (int), &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 GLfloat *value)
{ {
cogl_program_uniform_x (uniform_no, size, count, COGL_BOXED_FLOAT, _COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_uniform_x (ctx->current_program,
uniform_no, size, count, COGL_BOXED_FLOAT,
sizeof (float) * size, value); sizeof (float) * size, value);
} }
void
cogl_program_set_uniform_float (CoglHandle handle,
int uniform_location,
int n_components,
int count,
const float *value)
{
cogl_program_uniform_x (handle,
uniform_location, n_components, count,
COGL_BOXED_FLOAT,
sizeof (float) * n_components, 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 GLint *value)
{ {
cogl_program_uniform_x (uniform_no, size, count, COGL_BOXED_INT, _COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_uniform_x (ctx->current_program,
uniform_no, size, count, COGL_BOXED_INT,
sizeof (int) * size, value); sizeof (int) * size, value);
} }
void
cogl_program_set_uniform_int (CoglHandle handle,
int uniform_location,
int n_components,
int count,
const int *value)
{
cogl_program_uniform_x (handle,
uniform_location, n_components, count,
COGL_BOXED_INT,
sizeof (int) * n_components, value);
}
void
cogl_program_set_uniform_matrix (CoglHandle handle,
int uniform_location,
int dimensions,
int count,
gboolean transpose,
const float *value)
{
CoglProgram *program = handle;
CoglBoxedValue *bv;
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
g_return_if_fail (cogl_is_program (handle));
bv = program->custom_uniforms + uniform_location;
cogl_program_uniform_x (ctx->current_program,
uniform_location, dimensions, count,
COGL_BOXED_MATRIX,
sizeof (float) * dimensions * dimensions , value);
bv->transpose = transpose;
}
void void
cogl_program_uniform_matrix (int uniform_no, cogl_program_uniform_matrix (int uniform_no,
int size, int size,
int count, int count,
gboolean transpose, gboolean transpose,
const GLfloat *value) const float *value)
{ {
CoglProgram *program;
CoglBoxedValue *bv;
_COGL_GET_CONTEXT (ctx, NO_RETVAL); _COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_program_set_uniform_matrix (ctx->current_program,
program = ctx->current_program; uniform_no, size, count, transpose, value);
g_return_if_fail (program != NULL);
bv = program->custom_uniforms + uniform_no;
cogl_program_uniform_x (uniform_no, size, count, COGL_BOXED_MATRIX,
sizeof (float) * size * size, value);
bv->transpose = transpose;
} }
#else /* HAVE_COGL_GLES2 */ #else /* HAVE_COGL_GLES2 */

View File

@ -263,6 +263,11 @@ cogl_program_attach_shader
cogl_program_link cogl_program_link
cogl_program_use cogl_program_use
cogl_program_get_uniform_location cogl_program_get_uniform_location
cogl_program_set_uniform_1f
cogl_program_set_uniform_1i
cogl_program_set_uniform_float
cogl_program_set_uniform_int
cogl_program_set_uniform_matrix
cogl_program_uniform_1f cogl_program_uniform_1f
cogl_program_uniform_1i cogl_program_uniform_1i
cogl_program_uniform_float cogl_program_uniform_float