diff --git a/clutter/cogl/cogl/cogl-shader.h b/clutter/cogl/cogl/cogl-shader.h index e5055edc1..def686998 100644 --- a/clutter/cogl/cogl/cogl-shader.h +++ b/clutter/cogl/cogl/cogl-shader.h @@ -258,13 +258,120 @@ int cogl_program_get_uniform_location (CoglHandle handle, 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: - * @uniform_no: the unform to set. + * @uniform_no: the uniform to set. * @value: the new value of the uniform. * * Changes the value of a floating point uniform in the currently * used (see cogl_program_use()) shader program. + * + * Deprecated: 1.4: Use cogl_program_set_uniform_1f() instead. */ void cogl_program_uniform_1f (int uniform_no, @@ -272,17 +379,19 @@ cogl_program_uniform_1f (int uniform_no, /** * cogl_program_uniform_1i: - * @uniform_no: the unform to set. + * @uniform_no: the uniform to set. * @value: the new value of the uniform. * * Changes the value of an integer uniform in the currently * used (see cogl_program_use()) shader program. + * + * Deprecated: 1.4: Use cogl_program_set_uniform_1i() instead. */ void cogl_program_uniform_1i (int uniform_no, int value); - /** +/** * cogl_program_uniform_float: * @uniform_no: the uniform to set. * @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 * currently used (see cogl_program_use()) shader program. + * + * Deprecated: 1.4: Use cogl_program_set_uniform_float() instead. */ void cogl_program_uniform_float (int uniform_no, int size, int count, - const GLfloat *value); + const float *value); /** * cogl_program_uniform_int: diff --git a/clutter/cogl/cogl/driver/gl/cogl-program.c b/clutter/cogl/cogl/driver/gl/cogl-program.c index 7b808b9c8..20dec0a25 100644 --- a/clutter/cogl/cogl/driver/gl/cogl-program.c +++ b/clutter/cogl/cogl/driver/gl/cogl-program.c @@ -269,65 +269,77 @@ cogl_program_get_uniform_location (CoglHandle handle, } void -cogl_program_uniform_1f (int uniform_no, - float value) +cogl_program_set_uniform_1f (CoglHandle handle, + int uniform_location, + float value) { - CoglProgram *program; + CoglProgram *program = handle; _COGL_GET_CONTEXT (ctx, NO_RETVAL); - program = ctx->current_program; - - g_return_if_fail (program != NULL); - + g_return_if_fail (cogl_is_program (handle)); g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP); _cogl_gl_use_program_wrapper (program); - GE (glUniform1f (uniform_no, value)); + GE (glUniform1f (uniform_location, value)); } void -cogl_program_uniform_1i (int uniform_no, - int value) +cogl_program_uniform_1f (int uniform_location, + 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); - program = ctx->current_program; - - g_return_if_fail (program != NULL); - + g_return_if_fail (cogl_is_program (handle)); g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP); _cogl_gl_use_program_wrapper (program); - GE (glUniform1i (uniform_no, value)); + GE (glUniform1i (uniform_location, value)); } void -cogl_program_uniform_float (int uniform_no, - int size, - int count, - const GLfloat *value) +cogl_program_uniform_1i (int uniform_location, + int 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); - program = ctx->current_program; - - g_return_if_fail (program != NULL); + g_return_if_fail (cogl_is_program (handle)); if (program->language == COGL_SHADER_LANGUAGE_ARBFP) { - unsigned int _index = uniform_no; + unsigned int _index = uniform_location; unsigned int index_end = _index + count; int i; int j; - g_return_if_fail (size == 4); + g_return_if_fail (n_components == 4); 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); - switch (size) + switch (n_components) { case 1: - GE (glUniform1fv (uniform_no, count, value)); + GE (glUniform1fv (uniform_location, count, value)); break; case 2: - GE (glUniform2fv (uniform_no, count, value)); + GE (glUniform2fv (uniform_location, count, value)); break; case 3: - GE (glUniform3fv (uniform_no, count, value)); + GE (glUniform3fv (uniform_location, count, value)); break; case 4: - GE (glUniform4fv (uniform_no, count, value)); + GE (glUniform4fv (uniform_location, count, value)); break; default: g_warning ("%s called with invalid size parameter", G_STRFUNC); @@ -365,34 +377,45 @@ cogl_program_uniform_float (int uniform_no, } void -cogl_program_uniform_int (int uniform_no, - int size, - int count, - const int *value) +cogl_program_uniform_float (int uniform_location, + int n_components, + int count, + 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); - program = ctx->current_program; - - g_return_if_fail (program != NULL); + g_return_if_fail (cogl_is_program (handle)); _cogl_gl_use_program_wrapper (program); - switch (size) + switch (n_components) { case 1: - glUniform1iv (uniform_no, count, value); + glUniform1iv (uniform_location, count, value); break; case 2: - glUniform2iv (uniform_no, count, value); + glUniform2iv (uniform_location, count, value); break; case 3: - glUniform3iv (uniform_no, count, value); + glUniform3iv (uniform_location, count, value); break; case 4: - glUniform4iv (uniform_no, count, value); + glUniform4iv (uniform_location, count, value); break; default: g_warning ("%s called with invalid size parameter", G_STRFUNC); @@ -400,40 +423,62 @@ cogl_program_uniform_int (int uniform_no, } void -cogl_program_uniform_matrix (int uniform_no, - int size, - int count, - gboolean transpose, - const GLfloat *value) +cogl_program_uniform_int (int uniform_location, + int n_components, + int count, + const int *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); - program = ctx->current_program; - - g_return_if_fail (program != NULL); - + g_return_if_fail (cogl_is_program (handle)); g_return_if_fail (program->language != COGL_SHADER_LANGUAGE_ARBFP); _cogl_gl_use_program_wrapper (program); - switch (size) + switch (n_components) { case 2 : - GE (glUniformMatrix2fv (uniform_no, count, transpose, value)); + GE (glUniformMatrix2fv (uniform_location, count, transpose, value)); break; case 3 : - GE (glUniformMatrix3fv (uniform_no, count, transpose, value)); + GE (glUniformMatrix3fv (uniform_location, count, transpose, value)); break; case 4 : - GE (glUniformMatrix4fv (uniform_no, count, transpose, value)); + GE (glUniformMatrix4fv (uniform_location, count, transpose, value)); break; default : 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 _cogl_program_get_language (CoglHandle handle) { diff --git a/clutter/cogl/cogl/driver/gles/cogl-program.c b/clutter/cogl/cogl/driver/gles/cogl-program.c index a99fbcd56..50715613b 100644 --- a/clutter/cogl/cogl/driver/gles/cogl-program.c +++ b/clutter/cogl/cogl/driver/gles/cogl-program.c @@ -166,34 +166,20 @@ cogl_program_get_uniform_location (CoglHandle handle, 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 -cogl_program_uniform_x (int uniform_no, +cogl_program_uniform_x (CoglHandle handle, + int uniform_no, int size, int count, CoglBoxedType type, gsize value_size, gconstpointer value) { - CoglProgram *program; + CoglProgram *program = handle; _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 (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 cogl_program_uniform_float (int uniform_no, int size, int count, 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); } +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 cogl_program_uniform_int (int uniform_no, int size, int count, 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); } +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 cogl_program_uniform_matrix (int uniform_no, int size, int count, gboolean transpose, - const GLfloat *value) + const float *value) { - CoglProgram *program; - CoglBoxedValue *bv; - _COGL_GET_CONTEXT (ctx, NO_RETVAL); - - program = ctx->current_program; - - 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; + cogl_program_set_uniform_matrix (ctx->current_program, + uniform_no, size, count, transpose, value); } #else /* HAVE_COGL_GLES2 */ diff --git a/doc/reference/cogl/cogl-sections.txt b/doc/reference/cogl/cogl-sections.txt index fba207dcd..ed3d70262 100644 --- a/doc/reference/cogl/cogl-sections.txt +++ b/doc/reference/cogl/cogl-sections.txt @@ -263,6 +263,11 @@ cogl_program_attach_shader cogl_program_link cogl_program_use 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_1i cogl_program_uniform_float