Chromium Code Reviews| Index: cc/output/gl_renderer.cc |
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
| index ac449a46f5df84bc66ffe091b6470f8c6a394cb9..da8996a83d2d876bce38fe94ccb7670a75220d77 100644 |
| --- a/cc/output/gl_renderer.cc |
| +++ b/cc/output/gl_renderer.cc |
| @@ -339,6 +339,7 @@ GLRenderer::GLRenderer(RendererClient* client, |
| use_sync_query_ = context_caps.gpu.sync_query; |
| use_blend_minmax_ = context_caps.gpu.blend_minmax; |
| + use_blend_equation_advanced_ = context_caps.gpu.blend_equation_advanced; |
| InitializeSharedObjects(); |
| } |
| @@ -700,20 +701,77 @@ static skia::RefPtr<SkImage> ApplyImageFilter( |
| } |
| bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { |
| - return (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) || |
| - blend_mode == SkXfermode::kScreen_Mode || |
| - blend_mode == SkXfermode::kSrcOver_Mode; |
| + return use_blend_equation_advanced_ || |
| + (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) || |
| + blend_mode == SkXfermode::kScreen_Mode || |
| + blend_mode == SkXfermode::kSrcOver_Mode; |
| } |
| void GLRenderer::ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { |
| DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode)); |
| // Any modes set here must be reset in RestoreBlendFuncToDefault |
| - if (blend_mode == SkXfermode::kScreen_Mode) { |
| - GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); |
| - } else if (blend_mode == SkXfermode::kLighten_Mode) { |
| - GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE)); |
| - GLC(gl_, gl_->BlendEquation(GL_MAX_EXT)); |
| + if (use_blend_equation_advanced_) { |
| + GLenum equation = GL_SRC_OVER_NV; |
| + |
| + switch (blend_mode) { |
| + case SkXfermode::kScreen_Mode: |
|
piman
2014/10/16 20:13:28
nit: indent style (run git cl format?)
Erik Dahlström (inactive)
2014/10/17 15:33:17
Done.
|
| + equation = GL_SCREEN_NV; |
| + break; |
| + case SkXfermode::kOverlay_Mode: |
| + equation = GL_OVERLAY_NV; |
| + break; |
| + case SkXfermode::kDarken_Mode: |
| + equation = GL_DARKEN_NV; |
| + break; |
| + case SkXfermode::kLighten_Mode: |
| + equation = GL_LIGHTEN_NV; |
| + break; |
| + case SkXfermode::kColorDodge_Mode: |
| + equation = GL_COLORDODGE_NV; |
| + break; |
| + case SkXfermode::kColorBurn_Mode: |
| + equation = GL_COLORBURN_NV; |
| + break; |
| + case SkXfermode::kHardLight_Mode: |
| + equation = GL_HARDLIGHT_NV; |
| + break; |
| + case SkXfermode::kSoftLight_Mode: |
| + equation = GL_SOFTLIGHT_NV; |
| + break; |
| + case SkXfermode::kDifference_Mode: |
| + equation = GL_DIFFERENCE_NV; |
| + break; |
| + case SkXfermode::kExclusion_Mode: |
| + equation = GL_EXCLUSION_NV; |
| + break; |
| + case SkXfermode::kMultiply_Mode: |
| + equation = GL_MULTIPLY_NV; |
| + break; |
| + case SkXfermode::kHue_Mode: |
| + equation = GL_HSL_HUE_NV; |
| + break; |
| + case SkXfermode::kSaturation_Mode: |
| + equation = GL_HSL_SATURATION_NV; |
| + break; |
| + case SkXfermode::kColor_Mode: |
| + equation = GL_HSL_COLOR_NV; |
| + break; |
| + case SkXfermode::kLuminosity_Mode: |
| + equation = GL_HSL_LUMINOSITY_NV; |
| + break; |
| + default: |
| + return; |
| + } |
| + |
| + GLC(gl_, gl_->BlendEquation(equation)); |
| + } else { |
| + if (blend_mode == SkXfermode::kScreen_Mode) { |
| + GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); |
| + } else if (blend_mode == SkXfermode::kLighten_Mode) { |
| + GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE)); |
| + GLC(gl_, gl_->BlendEquation(GL_MAX_EXT)); |
| + } |
| } |
| } |
| @@ -721,10 +779,14 @@ void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { |
| if (blend_mode == SkXfermode::kSrcOver_Mode) |
| return; |
| - GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
| + if (use_blend_equation_advanced_) { |
| + GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); |
| + } else { |
| + GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
| - if (blend_mode == SkXfermode::kLighten_Mode) |
| - GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); |
| + if (blend_mode == SkXfermode::kLighten_Mode) |
| + GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); |
| + } |
| } |
| static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( |
| @@ -1194,8 +1256,12 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
| contents_resource_lock->target()); |
| } |
| - if (CanApplyBlendModeUsingBlendFunc(blend_mode)) |
| - ApplyBlendModeUsingBlendFunc(blend_mode); |
| + if (CanApplyBlendModeUsingBlendFunc(blend_mode)) { |
| + if (use_blend_equation_advanced_) |
| + GLC(gl_, gl_->BlendBarrierNV()); |
|
piman
2014/10/16 20:13:29
Is it worth skipping this if we have GL_*_blend_eq
Erik Dahlström (inactive)
2014/10/17 15:33:17
Perhaps, my current card/driver setup doesn't supp
|
| + |
| + ApplyBlendModeUsingBlendFunc(blend_mode); |
| + } |
| TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| gl_, |