mirror of
https://github.com/brl/mutter.git
synced 2025-06-14 01:09:30 +00:00
snippet: Add a hook for the layer texture coordinate transformation
This adds a hook called COGL_SNIPPET_HOOK_TEXTURE_COORD_TRANSFORM. This can be used to alter the application of the layer user matrix to a texture coordinate or it can bypass it altogether. This is the first per-layer hook that affects the vertex shader state so the patch includes the boilerplate needed to get that to work. Reviewed-by: Robert Bragg <robert@linux.intel.com>
This commit is contained in:

committed by
Robert Bragg

parent
b7e15929b6
commit
68b3643b25
@ -775,6 +775,42 @@ cogl_pipeline_get_layer_point_sprite_coords_enabled (CoglPipeline *pipeline,
|
||||
return authority->big_state->point_sprite_coords;
|
||||
}
|
||||
|
||||
static void
|
||||
_cogl_pipeline_layer_add_vertex_snippet (CoglPipeline *pipeline,
|
||||
int layer_index,
|
||||
CoglSnippet *snippet)
|
||||
{
|
||||
CoglPipelineLayerState change = COGL_PIPELINE_LAYER_STATE_VERTEX_SNIPPETS;
|
||||
CoglPipelineLayer *layer, *authority;
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
*
|
||||
* Note: If the layer already existed it's possibly owned by another
|
||||
* pipeline. If the layer is created then it will be owned by
|
||||
* pipeline. */
|
||||
layer = _cogl_pipeline_get_layer (pipeline, layer_index);
|
||||
|
||||
/* Now find the ancestor of the layer that is the authority for the
|
||||
* state we want to change */
|
||||
authority = _cogl_pipeline_layer_get_authority (layer, change);
|
||||
|
||||
layer = _cogl_pipeline_layer_pre_change_notify (pipeline, layer, change);
|
||||
|
||||
_cogl_pipeline_snippet_list_add (&layer->big_state->vertex_snippets,
|
||||
snippet);
|
||||
|
||||
/* If we weren't previously the authority on this state then we need
|
||||
* to extended our differences mask and so it's possible that some
|
||||
* of our ancestry will now become redundant, so we aim to reparent
|
||||
* ourselves if that's true... */
|
||||
if (layer != authority)
|
||||
{
|
||||
layer->differences |= change;
|
||||
_cogl_pipeline_layer_prune_redundant_ancestry (layer);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_cogl_pipeline_layer_add_fragment_snippet (CoglPipeline *pipeline,
|
||||
int layer_index,
|
||||
@ -821,8 +857,9 @@ cogl_pipeline_add_layer_snippet (CoglPipeline *pipeline,
|
||||
_COGL_RETURN_IF_FAIL (snippet->hook >= COGL_SNIPPET_FIRST_LAYER_HOOK);
|
||||
|
||||
if (snippet->hook < COGL_SNIPPET_FIRST_LAYER_FRAGMENT_HOOK)
|
||||
/* TODO */
|
||||
g_assert_not_reached ();
|
||||
_cogl_pipeline_layer_add_vertex_snippet (pipeline,
|
||||
layer_index,
|
||||
snippet);
|
||||
else
|
||||
_cogl_pipeline_layer_add_fragment_snippet (pipeline,
|
||||
layer_index,
|
||||
@ -966,6 +1003,16 @@ _cogl_pipeline_layer_point_sprite_coords_equal (CoglPipelineLayer *authority0,
|
||||
return big_state0->point_sprite_coords == big_state1->point_sprite_coords;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_cogl_pipeline_layer_vertex_snippets_equal (CoglPipelineLayer *authority0,
|
||||
CoglPipelineLayer *authority1)
|
||||
{
|
||||
return _cogl_pipeline_snippet_list_equal (&authority0->big_state->
|
||||
vertex_snippets,
|
||||
&authority1->big_state->
|
||||
vertex_snippets);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_cogl_pipeline_layer_fragment_snippets_equal (CoglPipelineLayer *authority0,
|
||||
CoglPipelineLayer *authority1)
|
||||
@ -1729,6 +1776,15 @@ _cogl_pipeline_layer_hash_point_sprite_state (CoglPipelineLayer *authority,
|
||||
sizeof (big_state->point_sprite_coords));
|
||||
}
|
||||
|
||||
void
|
||||
_cogl_pipeline_layer_hash_vertex_snippets_state (CoglPipelineLayer *authority,
|
||||
CoglPipelineLayer **authorities,
|
||||
CoglPipelineHashState *state)
|
||||
{
|
||||
_cogl_pipeline_snippet_list_hash (&authority->big_state->vertex_snippets,
|
||||
&state->hash);
|
||||
}
|
||||
|
||||
void
|
||||
_cogl_pipeline_layer_hash_fragment_snippets_state (CoglPipelineLayer *authority,
|
||||
CoglPipelineLayer **authorities,
|
||||
|
Reference in New Issue
Block a user