cogl: add separate material for blended source_colors
When using cogl_set_source_color4ub there is a notable difference between colors that require blending and those that dont. When trying to modify the color of pipeline referenced by the journal we don't force a flush of the journal unless the color change will also change the blending state. By using two separate pipeline objects for handing opaque or transparent colors we can avoid ever flushing the journal when repeatedly using cogl_set_source_color and jumping between opaque and transparent colors.
This commit is contained in:
parent
d05ce7cd26
commit
eaee5dd604
3 changed files with 25 additions and 12 deletions
|
@ -129,7 +129,8 @@ cogl_create_context (void)
|
|||
|
||||
_context->legacy_fog_state.enabled = FALSE;
|
||||
|
||||
_context->simple_pipeline = cogl_pipeline_new ();
|
||||
_context->opaque_color_pipeline = cogl_pipeline_new ();
|
||||
_context->blended_color_pipeline = cogl_pipeline_new ();
|
||||
_context->texture_pipeline = cogl_pipeline_new ();
|
||||
_context->arbfp_source_buffer = g_string_new ("");
|
||||
_context->source_stack = NULL;
|
||||
|
@ -237,8 +238,8 @@ cogl_create_context (void)
|
|||
0, /* auto calc row stride */
|
||||
default_texture_data);
|
||||
|
||||
cogl_push_source (_context->simple_pipeline);
|
||||
_cogl_pipeline_flush_gl_state (_context->simple_pipeline, FALSE);
|
||||
cogl_push_source (_context->opaque_color_pipeline);
|
||||
_cogl_pipeline_flush_gl_state (_context->opaque_color_pipeline, FALSE);
|
||||
_cogl_enable (enable_flags);
|
||||
_cogl_flush_face_winding ();
|
||||
|
||||
|
@ -277,8 +278,10 @@ _cogl_destroy_context (void)
|
|||
if (_context->default_gl_texture_rect_tex)
|
||||
cogl_handle_unref (_context->default_gl_texture_rect_tex);
|
||||
|
||||
if (_context->simple_pipeline)
|
||||
cogl_handle_unref (_context->simple_pipeline);
|
||||
if (_context->opaque_color_pipeline)
|
||||
cogl_handle_unref (_context->opaque_color_pipeline);
|
||||
if (_context->blended_color_pipeline)
|
||||
cogl_handle_unref (_context->blended_color_pipeline);
|
||||
if (_context->texture_pipeline)
|
||||
cogl_handle_unref (_context->texture_pipeline);
|
||||
|
||||
|
|
|
@ -82,8 +82,9 @@ typedef struct
|
|||
|
||||
CoglPipelineFogState legacy_fog_state;
|
||||
|
||||
/* Materials */
|
||||
CoglPipeline *simple_pipeline; /* used for set_source_color */
|
||||
/* Pipelines */
|
||||
CoglPipeline *opaque_color_pipeline; /* used for set_source_color */
|
||||
CoglPipeline *blended_color_pipeline; /* used for set_source_color */
|
||||
CoglPipeline *texture_pipeline; /* used for set_source_texture */
|
||||
GString *arbfp_source_buffer;
|
||||
GList *source_stack;
|
||||
|
|
|
@ -379,15 +379,24 @@ _cogl_flush_face_winding (void)
|
|||
void
|
||||
cogl_set_source_color (const CoglColor *color)
|
||||
{
|
||||
CoglColor premultiplied;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
premultiplied = *color;
|
||||
cogl_color_premultiply (&premultiplied);
|
||||
cogl_pipeline_set_color (ctx->simple_pipeline, &premultiplied);
|
||||
if (cogl_color_get_alpha_byte (color) == 0xff)
|
||||
{
|
||||
cogl_pipeline_set_color (ctx->opaque_color_pipeline, color);
|
||||
pipeline = ctx->opaque_color_pipeline;
|
||||
}
|
||||
else
|
||||
{
|
||||
CoglColor premultiplied = *color;
|
||||
cogl_color_premultiply (&premultiplied);
|
||||
cogl_pipeline_set_color (ctx->blended_color_pipeline, &premultiplied);
|
||||
pipeline = ctx->blended_color_pipeline;
|
||||
}
|
||||
|
||||
cogl_set_source (ctx->simple_pipeline);
|
||||
cogl_set_source (pipeline);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in a new issue