108
108
/* Only one shader is allowed if the type is ARBfp */
109
109
if (shader->language == COGL_SHADER_LANGUAGE_ARBFP)
110
g_return_if_fail (program->attached_shaders == NULL);
110
_COGL_RETURN_IF_FAIL (program->attached_shaders == NULL);
111
111
else if (shader->language == COGL_SHADER_LANGUAGE_GLSL)
112
g_return_if_fail (_cogl_program_get_language (program) ==
112
_COGL_RETURN_IF_FAIL (_cogl_program_get_language (program) ==
113
113
COGL_SHADER_LANGUAGE_GLSL);
115
115
program->attached_shaders
188
188
return program->custom_uniforms->len - 1;
192
cogl_program_uniform_x (CoglHandle handle,
191
static CoglProgramUniform *
192
cogl_program_modify_uniform (CoglProgram *program,
201
CoglProgram *program = handle;
203
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
205
g_return_if_fail (cogl_is_program (handle));
206
g_return_if_fail (program != NULL);
208
if (uniform_no >= 0 && uniform_no < program->custom_uniforms->len &&
209
size >= 1 && size <= 4 && count >= 1)
211
CoglProgramUniform *uniform =
212
&g_array_index (program->custom_uniforms,
213
CoglProgramUniform, uniform_no);
217
if (uniform->value.count > 1)
218
g_free (uniform->value.v.array);
220
memcpy (uniform->value.v.float_value, value, value_size);
224
if (uniform->value.count > 1)
226
if (uniform->value.count != count ||
227
uniform->value.size != size ||
228
uniform->value.type != type)
230
g_free (uniform->value.v.array);
231
uniform->value.v.array = g_malloc (count * value_size);
235
uniform->value.v.array = g_malloc (count * value_size);
237
memcpy (uniform->value.v.array, value, count * value_size);
240
uniform->value.type = type;
241
uniform->value.size = size;
242
uniform->value.count = count;
243
uniform->dirty = TRUE;
195
CoglProgramUniform *uniform;
197
_COGL_RETURN_VAL_IF_FAIL (cogl_is_program (program), NULL);
198
_COGL_RETURN_VAL_IF_FAIL (uniform_no >= 0 &&
199
uniform_no < program->custom_uniforms->len,
202
uniform = &g_array_index (program->custom_uniforms,
203
CoglProgramUniform, uniform_no);
204
uniform->dirty = TRUE;
248
210
cogl_program_uniform_1f (int uniform_no,
213
CoglProgramUniform *uniform;
251
215
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
252
cogl_program_uniform_x (ctx->current_program,
253
uniform_no, 1, 1, COGL_BOXED_FLOAT,
254
sizeof (float), &value, FALSE);
217
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
218
_cogl_boxed_value_set_1f (&uniform->value, value);
259
223
int uniform_location,
262
cogl_program_uniform_x (handle,
263
uniform_location, 1, 1, COGL_BOXED_FLOAT,
264
sizeof (float), &value, FALSE);
226
CoglProgramUniform *uniform;
228
uniform = cogl_program_modify_uniform (handle, uniform_location);
229
_cogl_boxed_value_set_1f (&uniform->value, value);
268
233
cogl_program_uniform_1i (int uniform_no,
236
CoglProgramUniform *uniform;
271
238
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
272
cogl_program_uniform_x (ctx->current_program,
273
uniform_no, 1, 1, COGL_BOXED_INT,
274
sizeof (int), &value, FALSE);
240
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
241
_cogl_boxed_value_set_1i (&uniform->value, value);
279
246
int uniform_location,
282
cogl_program_uniform_x (handle,
283
uniform_location, 1, 1, COGL_BOXED_INT,
284
sizeof (int), &value, FALSE);
249
CoglProgramUniform *uniform;
251
uniform = cogl_program_modify_uniform (handle, uniform_location);
252
_cogl_boxed_value_set_1i (&uniform->value, value);
288
256
cogl_program_uniform_float (int uniform_no,
291
const GLfloat *value)
261
CoglProgramUniform *uniform;
293
263
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
294
cogl_program_uniform_x (ctx->current_program,
295
uniform_no, size, count, COGL_BOXED_FLOAT,
296
sizeof (float) * size, value, FALSE);
265
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
266
_cogl_boxed_value_set_float (&uniform->value, size, count, value);
304
274
const float *value)
306
cogl_program_uniform_x (handle,
307
uniform_location, n_components, count,
309
sizeof (float) * n_components, value, FALSE);
276
CoglProgramUniform *uniform;
278
uniform = cogl_program_modify_uniform (handle, uniform_location);
279
_cogl_boxed_value_set_float (&uniform->value, n_components, count, value);
313
283
cogl_program_uniform_int (int uniform_no,
288
CoglProgramUniform *uniform;
318
290
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
319
cogl_program_uniform_x (ctx->current_program,
320
uniform_no, size, count, COGL_BOXED_INT,
321
sizeof (int) * size, value, FALSE);
292
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
293
_cogl_boxed_value_set_int (&uniform->value, size, count, value);
329
301
const int *value)
331
cogl_program_uniform_x (handle,
332
uniform_location, n_components, count,
334
sizeof (int) * n_components, value, FALSE);
303
CoglProgramUniform *uniform;
305
uniform = cogl_program_modify_uniform (handle, uniform_location);
306
_cogl_boxed_value_set_int (&uniform->value, n_components, count, value);
342
314
gboolean transpose,
343
315
const float *value)
345
g_return_if_fail (cogl_is_program (handle));
317
CoglProgramUniform *uniform;
347
cogl_program_uniform_x (handle,
348
uniform_location, dimensions, count,
350
sizeof (float) * dimensions * dimensions,
319
uniform = cogl_program_modify_uniform (handle, uniform_location);
320
_cogl_boxed_value_set_matrix (&uniform->value,
359
331
gboolean transpose,
360
332
const float *value)
334
CoglProgramUniform *uniform;
362
336
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
363
cogl_program_set_uniform_matrix (ctx->current_program,
364
uniform_no, size, count, transpose, value);
338
uniform = cogl_program_modify_uniform (ctx->current_program, uniform_no);
339
_cogl_boxed_value_set_matrix (&uniform->value, size, count, transpose, value);
367
342
/* ARBfp local parameters can be referenced like:
386
g_return_val_if_fail (strncmp ("program.local[", input, 14) == 0, -1);
361
_COGL_RETURN_VAL_IF_FAIL (strncmp ("program.local[", input, 14) == 0, -1);
388
363
_index = g_ascii_strtoull (input + 14, &endptr, 10);
389
g_return_val_if_fail (endptr != input + 14, -1);
390
g_return_val_if_fail (*endptr == ']', -1);
364
_COGL_RETURN_VAL_IF_FAIL (endptr != input + 14, -1);
365
_COGL_RETURN_VAL_IF_FAIL (*endptr == ']', -1);
392
g_return_val_if_fail (_index >= 0, -1);
367
_COGL_RETURN_VAL_IF_FAIL (_index >= 0, -1);
400
_cogl_program_flush_uniform_glsl (GLint location,
401
CoglBoxedValue *value)
403
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
407
case COGL_BOXED_NONE:
414
if (value->count == 1)
415
ptr = value->v.int_value;
417
ptr = value->v.int_array;
421
case 1: ctx->glUniform1iv (location, value->count, ptr); break;
422
case 2: ctx->glUniform2iv (location, value->count, ptr); break;
423
case 3: ctx->glUniform3iv (location, value->count, ptr); break;
424
case 4: ctx->glUniform4iv (location, value->count, ptr); break;
429
case COGL_BOXED_FLOAT:
433
if (value->count == 1)
434
ptr = value->v.float_value;
436
ptr = value->v.float_array;
440
case 1: ctx->glUniform1fv (location, value->count, ptr); break;
441
case 2: ctx->glUniform2fv (location, value->count, ptr); break;
442
case 3: ctx->glUniform3fv (location, value->count, ptr); break;
443
case 4: ctx->glUniform4fv (location, value->count, ptr); break;
448
case COGL_BOXED_MATRIX:
452
if (value->count == 1)
453
ptr = value->v.matrix;
455
ptr = value->v.float_array;
460
ctx->glUniformMatrix2fv (location, value->count,
461
value->transpose, ptr);
464
ctx->glUniformMatrix3fv (location, value->count,
465
value->transpose, ptr);
468
ctx->glUniformMatrix4fv (location, value->count,
469
value->transpose, ptr);
477
374
#ifdef HAVE_COGL_GL
485
382
if (value->type != COGL_BOXED_NONE)
487
g_return_if_fail (value->type == COGL_BOXED_FLOAT);
488
g_return_if_fail (value->size == 4);
489
g_return_if_fail (value->count == 1);
384
_COGL_RETURN_IF_FAIL (value->type == COGL_BOXED_FLOAT);
385
_COGL_RETURN_IF_FAIL (value->size == 4);
386
_COGL_RETURN_IF_FAIL (value->count == 1);
491
388
GE( ctx, glProgramLocalParameter4fv (GL_FRAGMENT_PROGRAM_ARB, location,
492
389
value->v.float_value) );