Chromium Code Reviews| Index: cc/output/ca_layer_overlay.cc |
| diff --git a/cc/output/ca_layer_overlay.cc b/cc/output/ca_layer_overlay.cc |
| index ac61db0ac9dbaf9f216124193ab6c703767c6aef..8d4deb12ab2a90e3c8416500cd3e06a3d6fada6f 100644 |
| --- a/cc/output/ca_layer_overlay.cc |
| +++ b/cc/output/ca_layer_overlay.cc |
| @@ -5,6 +5,7 @@ |
| #include "cc/output/ca_layer_overlay.h" |
| #include "base/metrics/histogram.h" |
| +#include "cc/quads/render_pass_draw_quad.h" |
| #include "cc/quads/solid_color_draw_quad.h" |
| #include "cc/quads/stream_video_draw_quad.h" |
| #include "cc/quads/texture_draw_quad.h" |
| @@ -16,6 +17,8 @@ namespace cc { |
| namespace { |
| +bool g_allow_rpdq_quad_conversion = false; |
| + |
| // This enum is used for histogram states and should only have new values added |
| // to the end before COUNT. |
| enum CALayerResult { |
| @@ -37,9 +40,95 @@ enum CALayerResult { |
| CA_LAYER_FAILED_YUV_VIDEO_CONTENT, |
| CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS, |
| CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES, |
| + CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE, |
| + CA_LAYER_FAILED_RENDER_PASS_BACKGROUND_FILTERS, |
| + CA_LAYER_FAILED_RENDER_PASS_MASK, |
| + CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION, |
| CA_LAYER_FAILED_COUNT, |
| }; |
| +bool ConvertAndAppendFilterOperation( |
| + const FilterOperation& operation, |
| + ui::CARendererLayerParams::FilterEffects* filter_effects) { |
| + ui::CARendererLayerParams::FilterEffect filter_effect; |
| + switch (operation.type()) { |
| + case FilterOperation::GRAYSCALE: |
| + filter_effect.type = |
| + ui::CARendererLayerParams::FilterEffectType::GRAYSCALE; |
| + break; |
| + case FilterOperation::SEPIA: |
| + filter_effect.type = ui::CARendererLayerParams::FilterEffectType::SEPIA; |
| + break; |
| + case FilterOperation::SATURATE: |
| + filter_effect.type = |
| + ui::CARendererLayerParams::FilterEffectType::SATURATE; |
| + break; |
| + case FilterOperation::HUE_ROTATE: |
| + filter_effect.type = |
| + ui::CARendererLayerParams::FilterEffectType::HUE_ROTATE; |
| + break; |
| + case FilterOperation::INVERT: |
| + filter_effect.type = ui::CARendererLayerParams::FilterEffectType::INVERT; |
| + break; |
| + case FilterOperation::BRIGHTNESS: |
| + filter_effect.type = |
| + ui::CARendererLayerParams::FilterEffectType::BRIGHTNESS; |
| + break; |
| + case FilterOperation::CONTRAST: |
| + filter_effect.type = |
| + ui::CARendererLayerParams::FilterEffectType::CONTRAST; |
| + break; |
| + case FilterOperation::OPACITY: |
| + filter_effect.type = ui::CARendererLayerParams::FilterEffectType::OPACITY; |
| + break; |
| + case FilterOperation::BLUR: |
| + filter_effect.type = ui::CARendererLayerParams::FilterEffectType::BLUR; |
| + break; |
| + case FilterOperation::DROP_SHADOW: |
| + filter_effect.type = |
| + ui::CARendererLayerParams::FilterEffectType::DROP_SHADOW; |
| + break; |
| + default: |
| + return false; |
| + } |
| + |
| + filter_effect.amount = operation.amount(); |
| + if (filter_effect.type == |
| + ui::CARendererLayerParams::FilterEffectType::DROP_SHADOW) { |
| + filter_effect.drop_shadow_offset = operation.drop_shadow_offset(); |
| + filter_effect.drop_shadow_color = operation.drop_shadow_color(); |
| + } |
| + filter_effects->push_back(filter_effect); |
| + return true; |
| +} |
| + |
| +CALayerResult FromRenderPassQuad(ResourceProvider* resource_provider, |
| + const RenderPassDrawQuad* quad, |
| + CALayerOverlay* ca_layer_overlay) { |
| + if (quad->filters_scale != gfx::Vector2dF(1, 1)) |
| + return CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE; |
| + if (quad->background_filters.size() != 0) |
| + return CA_LAYER_FAILED_RENDER_PASS_BACKGROUND_FILTERS; |
| + if (quad->mask_resource_id() != 0) |
| + return CA_LAYER_FAILED_RENDER_PASS_MASK; |
| + |
| + for (const FilterOperation& operation : quad->filters.operations()) { |
| + bool success = ConvertAndAppendFilterOperation( |
| + operation, &ca_layer_overlay->filter_effects); |
| + if (!success) |
| + return CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION; |
| + } |
| + |
| + ca_layer_overlay->render_pass_id = quad->render_pass_id; |
| + ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1); |
| + |
| + // TODO(erikchen): Enable this when RenderPassDrawQuad promotion to CALayer |
| + // is fully functional. https://crbug.com/581526. |
| + if (g_allow_rpdq_quad_conversion) |
| + return CA_LAYER_SUCCESS; |
|
ccameron
2016/07/21 18:11:39
This probably breaks the unittests added, maybe ma
erikchen
2016/07/21 18:18:26
g_allow_rpdq_quad_conversion is a global set by te
|
| + return CA_LAYER_FAILED_RENDER_PASS; |
| +} |
| + |
| CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, |
| const StreamVideoDrawQuad* quad, |
| CALayerOverlay* ca_layer_overlay) { |
| @@ -175,7 +264,9 @@ class CALayerOverlayProcessor { |
| case DrawQuad::PICTURE_CONTENT: |
| return CA_LAYER_FAILED_PICTURE_CONTENT; |
| case DrawQuad::RENDER_PASS: |
| - return CA_LAYER_FAILED_RENDER_PASS; |
| + return FromRenderPassQuad(resource_provider, |
| + RenderPassDrawQuad::MaterialCast(quad), |
| + ca_layer_overlay); |
| case DrawQuad::SURFACE_CONTENT: |
| return CA_LAYER_FAILED_SURFACE_CONTENT; |
| case DrawQuad::YUV_VIDEO_CONTENT: |
| @@ -251,4 +342,8 @@ bool ProcessForCALayerOverlays(ResourceProvider* resource_provider, |
| return true; |
| } |
| +void EnableRenderPassDrawQuadForTesting() { |
| + g_allow_rpdq_quad_conversion = true; |
| +} |
| + |
| } // namespace cc |