Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index 6bb6f439ed849eb831c38c3287eaa776d4160f6d..54c328525098404fbe90274046b0ffaff836e43e 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -700,6 +700,23 @@ static skia::RefPtr<SkImage> ApplyImageFilter( |
return image; |
} |
+bool GLRenderer::ShouldApplyBlendModeUsingBlendFunc(const DrawQuad* quad) { |
+ SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; |
+ return blend_mode == SkXfermode::kScreen_Mode || |
+ blend_mode == SkXfermode::kSrcOver_Mode; |
+} |
+ |
+void GLRenderer::ApplyBlendModeUsingBlendFunc(const DrawQuad* quad) { |
+ DCHECK(ShouldApplyBlendModeUsingBlendFunc(quad)); |
+ if (quad->shared_quad_state->blend_mode == SkXfermode::kScreen_Mode) { |
+ GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); |
+ } |
+} |
+ |
+void GLRenderer::RestoreBlendFuncToDefault() { |
+ GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
+} |
+ |
static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( |
scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, |
ResourceProvider* resource_provider, |
@@ -973,7 +990,8 @@ scoped_ptr<ScopedResource> GLRenderer::GetBackgroundWithFilters( |
void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
const RenderPassDrawQuad* quad) { |
- SetBlendEnabled(quad->ShouldDrawWithBlending()); |
+ SetBlendEnabled(quad->ShouldDrawWithBlending() || |
+ ShouldApplyBlendModeUsingBlendFunc(quad)); |
ScopedResource* contents_texture = |
render_pass_textures_.get(quad->render_pass_id); |
@@ -992,9 +1010,8 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) |
return; |
- bool need_background_texture = |
- quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode || |
- !quad->background_filters.IsEmpty(); |
+ bool need_background_texture = !ShouldApplyBlendModeUsingBlendFunc(quad) || |
+ !quad->background_filters.IsEmpty(); |
bool background_changed = false; |
scoped_ptr<ScopedResource> background_texture; |
if (need_background_texture) { |
@@ -1048,8 +1065,7 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
} |
} |
- if (quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode && |
- background_texture) { |
+ if (background_texture && !ShouldApplyBlendModeUsingBlendFunc(quad)) { |
filter_bitmap = |
ApplyBlendModeWithBackdrop(ScopedUseGrContext::Create(this, frame), |
resource_provider_, |
@@ -1117,6 +1133,9 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
contents_resource_lock->target()); |
} |
+ if (ShouldApplyBlendModeUsingBlendFunc(quad)) |
+ ApplyBlendModeUsingBlendFunc(quad); |
+ |
TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
gl_, |
&highp_threshold_cache_, |
@@ -1363,6 +1382,9 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
// scope, so the draw gets processed before the filter texture gets deleted. |
if (filter_bitmap) |
GLC(gl_, gl_->Flush()); |
+ |
+ if (ShouldApplyBlendModeUsingBlendFunc(quad)) |
+ RestoreBlendFuncToDefault(); |
} |
struct SolidColorProgramUniforms { |