diff --git a/cogl/cogl-context.c b/cogl/cogl-context.c index ad4f4f2e2..5cd544342 100644 --- a/cogl/cogl-context.c +++ b/cogl/cogl-context.c @@ -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); diff --git a/cogl/cogl-context.h b/cogl/cogl-context.h index e9a677570..ac7e630e2 100644 --- a/cogl/cogl-context.h +++ b/cogl/cogl-context.h @@ -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; diff --git a/cogl/cogl.c b/cogl/cogl.c index 3e12c4d71..9f35468a7 100644 --- a/cogl/cogl.c +++ b/cogl/cogl.c @@ -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