material: Add cogl_material_{get,set}_user_program

Previously we had an internal only _cogl_material_set_user_program to
redirect legacy usage of cogl_program_use() through CoglMaterial. This
instead makes the API public because until we implement our planned
"snippet" framework we need a stop-gap solution for using shaders in
Cogl.

The plan is to also support ARBfp with the cogl_program/shader API so
this API will also allow clutter-gst to stop using direct OpenGL calls
that conflict with Cogl's state tracking.
This commit is contained in:
Robert Bragg 2010-08-05 10:46:54 +01:00
parent 1314d0b1a7
commit f781bcec7e
3 changed files with 84 additions and 8 deletions

View File

@ -721,10 +721,6 @@ _cogl_material_layer_get_filters (CoglMaterialLayer *layer,
CoglMaterialFilter *min_filter, CoglMaterialFilter *min_filter,
CoglMaterialFilter *mag_filter); CoglMaterialFilter *mag_filter);
void
_cogl_material_set_user_program (CoglMaterial *material,
CoglHandle program);
void void
_cogl_material_texture_storage_change_notify (CoglHandle texture); _cogl_material_texture_storage_change_notify (CoglHandle texture);

View File

@ -3975,6 +3975,19 @@ cogl_material_set_blend_constant (CoglMaterial *material,
#endif #endif
} }
CoglHandle
cogl_material_get_user_program (CoglMaterial *material)
{
CoglMaterial *authority;
g_return_val_if_fail (cogl_is_material (material), COGL_INVALID_HANDLE);
authority =
_cogl_material_get_authority (material, COGL_MATERIAL_STATE_USER_SHADER);
return authority->big_state->user_program;
}
/* XXX: for now we don't mind if the program has vertex shaders /* XXX: for now we don't mind if the program has vertex shaders
* attached but if we ever make a similar API public we should only * attached but if we ever make a similar API public we should only
* allow attaching of programs containing fragment shaders. Eventually * allow attaching of programs containing fragment shaders. Eventually
@ -3982,8 +3995,8 @@ cogl_material_set_blend_constant (CoglMaterial *material,
* processing. * processing.
*/ */
void void
_cogl_material_set_user_program (CoglMaterial *material, cogl_material_set_user_program (CoglMaterial *material,
CoglHandle program) CoglHandle program)
{ {
CoglMaterialState state = COGL_MATERIAL_STATE_USER_SHADER; CoglMaterialState state = COGL_MATERIAL_STATE_USER_SHADER;
CoglMaterial *authority; CoglMaterial *authority;
@ -5125,8 +5138,11 @@ _cogl_material_apply_legacy_state (CoglMaterial *material)
* the cogl_material API instead. * the cogl_material API instead.
*/ */
if (ctx->current_program) /* A program explicitly set on the material has higher precedence than
_cogl_material_set_user_program (material, ctx->current_program); * one associated with the context using cogl_program_use() */
if (ctx->current_program &&
cogl_material_get_user_program (material) == COGL_INVALID_HANDLE)
cogl_material_set_user_program (material, ctx->current_program);
if (ctx->legacy_depth_test_enabled) if (ctx->legacy_depth_test_enabled)
cogl_material_set_depth_test_enabled (material, TRUE); cogl_material_set_depth_test_enabled (material, TRUE);

View File

@ -636,6 +636,70 @@ cogl_material_set_point_size (CoglHandle material,
float float
cogl_material_get_point_size (CoglHandle material); cogl_material_get_point_size (CoglHandle material);
/**
* cogl_material_get_user_program:
* @material: a #CoglMaterial object.
*
* Queries what user program has been associated with the given
* @material using cogl_material_set_user_program().
*
* Return value: The current user program or %COGL_INVALID_HANDLE.
*
* Since: 1.4
*/
CoglHandle
cogl_material_get_user_program (CoglMaterial *material);
/**
* cogl_material_set_user_program:
* @material: a #CoglMaterial object.
* @program: A #CoglHandle to a linked CoglProgram
*
* Associates a linked CoglProgram with the given material so that the
* program can take full control of vertex and/or fragment processing.
*
* This is an example of how it can be used to associate an ARBfp
* program with a #CoglMaterial:
* |[
* CoglHandle shader;
* CoglHandle program;
* CoglMaterial *material;
*
* shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT);
* cogl_shader_source (shader,
* "!!ARBfp1.0\n"
* "MOV result.color,fragment.color;\n"
* "END\n");
* cogl_shader_compile (shader);
*
* program = cogl_create_program ();
* cogl_program_attach_shader (program, shader);
* cogl_program_link (program);
*
* material = cogl_material_new ();
* cogl_material_set_user_program (material, program);
*
* cogl_set_source_color4ub (0xff, 0x00, 0x00, 0xff);
* cogl_rectangle (0, 0, 100, 100);
* ]|
*
* It is possibly worth keeping in mind that this API is not part of
* the long term design for how we want to expose shaders to Cogl
* developers (We are planning on deprecating the cogl_program and
* cogl_shader APIs in favour of a "snippet" framework) but in the
* meantime we hope this will handle most practical GLSL and ARBfp
* requirements.
*
* Also remember you need to check for either the
* %COGL_FEATURE_SHADERS_GLSL or %COGL_FEATURE_SHADERS_ARBFP before
* using the cogl_program or cogl_shader API.
*
* Since: 1.4
*/
void
cogl_material_set_user_program (CoglMaterial *material,
CoglHandle program);
/** /**
* cogl_material_set_layer: * cogl_material_set_layer:
* @material: A #CoglMaterial object * @material: A #CoglMaterial object