OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/output/ca_layer_overlay.h" | 5 #include "cc/output/ca_layer_overlay.h" |
6 | 6 |
7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
| 8 #include "cc/quads/render_pass_draw_quad.h" |
8 #include "cc/quads/solid_color_draw_quad.h" | 9 #include "cc/quads/solid_color_draw_quad.h" |
9 #include "cc/quads/stream_video_draw_quad.h" | 10 #include "cc/quads/stream_video_draw_quad.h" |
10 #include "cc/quads/texture_draw_quad.h" | 11 #include "cc/quads/texture_draw_quad.h" |
11 #include "cc/quads/tile_draw_quad.h" | 12 #include "cc/quads/tile_draw_quad.h" |
12 #include "cc/resources/resource_provider.h" | 13 #include "cc/resources/resource_provider.h" |
13 #include "gpu/GLES2/gl2extchromium.h" | 14 #include "gpu/GLES2/gl2extchromium.h" |
14 | 15 |
15 namespace cc { | 16 namespace cc { |
16 | 17 |
17 namespace { | 18 namespace { |
18 | 19 |
| 20 bool g_allow_rpdq_quad_conversion = false; |
| 21 |
19 // This enum is used for histogram states and should only have new values added | 22 // This enum is used for histogram states and should only have new values added |
20 // to the end before COUNT. | 23 // to the end before COUNT. |
21 enum CALayerResult { | 24 enum CALayerResult { |
22 CA_LAYER_SUCCESS = 0, | 25 CA_LAYER_SUCCESS = 0, |
23 CA_LAYER_FAILED_UNKNOWN, | 26 CA_LAYER_FAILED_UNKNOWN, |
24 CA_LAYER_FAILED_IO_SURFACE_NOT_CANDIDATE, | 27 CA_LAYER_FAILED_IO_SURFACE_NOT_CANDIDATE, |
25 CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE, | 28 CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE, |
26 CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM, | 29 CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM, |
27 CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE, | 30 CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE, |
28 CA_LAYER_FAILED_TEXTURE_Y_FLIPPED, | 31 CA_LAYER_FAILED_TEXTURE_Y_FLIPPED, |
29 CA_LAYER_FAILED_TILE_NOT_CANDIDATE, | 32 CA_LAYER_FAILED_TILE_NOT_CANDIDATE, |
30 CA_LAYER_FAILED_QUAD_BLEND_MODE, | 33 CA_LAYER_FAILED_QUAD_BLEND_MODE, |
31 CA_LAYER_FAILED_QUAD_TRANSFORM, | 34 CA_LAYER_FAILED_QUAD_TRANSFORM, |
32 CA_LAYER_FAILED_QUAD_CLIPPING, | 35 CA_LAYER_FAILED_QUAD_CLIPPING, |
33 CA_LAYER_FAILED_DEBUG_BORDER, | 36 CA_LAYER_FAILED_DEBUG_BORDER, |
34 CA_LAYER_FAILED_PICTURE_CONTENT, | 37 CA_LAYER_FAILED_PICTURE_CONTENT, |
35 CA_LAYER_FAILED_RENDER_PASS, | 38 CA_LAYER_FAILED_RENDER_PASS, |
36 CA_LAYER_FAILED_SURFACE_CONTENT, | 39 CA_LAYER_FAILED_SURFACE_CONTENT, |
37 CA_LAYER_FAILED_YUV_VIDEO_CONTENT, | 40 CA_LAYER_FAILED_YUV_VIDEO_CONTENT, |
38 CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS, | 41 CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS, |
39 CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES, | 42 CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES, |
| 43 CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE, |
| 44 CA_LAYER_FAILED_RENDER_PASS_BACKGROUND_FILTERS, |
| 45 CA_LAYER_FAILED_RENDER_PASS_MASK, |
| 46 CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION, |
40 CA_LAYER_FAILED_COUNT, | 47 CA_LAYER_FAILED_COUNT, |
41 }; | 48 }; |
42 | 49 |
| 50 bool ConvertAndAppendFilterOperation( |
| 51 const FilterOperation& operation, |
| 52 ui::CARendererLayerParams::FilterEffects* filter_effects) { |
| 53 ui::CARendererLayerParams::FilterEffect filter_effect; |
| 54 switch (operation.type()) { |
| 55 case FilterOperation::GRAYSCALE: |
| 56 filter_effect.type = |
| 57 ui::CARendererLayerParams::FilterEffectType::GRAYSCALE; |
| 58 break; |
| 59 case FilterOperation::SEPIA: |
| 60 filter_effect.type = ui::CARendererLayerParams::FilterEffectType::SEPIA; |
| 61 break; |
| 62 case FilterOperation::SATURATE: |
| 63 filter_effect.type = |
| 64 ui::CARendererLayerParams::FilterEffectType::SATURATE; |
| 65 break; |
| 66 case FilterOperation::HUE_ROTATE: |
| 67 filter_effect.type = |
| 68 ui::CARendererLayerParams::FilterEffectType::HUE_ROTATE; |
| 69 break; |
| 70 case FilterOperation::INVERT: |
| 71 filter_effect.type = ui::CARendererLayerParams::FilterEffectType::INVERT; |
| 72 break; |
| 73 case FilterOperation::BRIGHTNESS: |
| 74 filter_effect.type = |
| 75 ui::CARendererLayerParams::FilterEffectType::BRIGHTNESS; |
| 76 break; |
| 77 case FilterOperation::CONTRAST: |
| 78 filter_effect.type = |
| 79 ui::CARendererLayerParams::FilterEffectType::CONTRAST; |
| 80 break; |
| 81 case FilterOperation::OPACITY: |
| 82 filter_effect.type = ui::CARendererLayerParams::FilterEffectType::OPACITY; |
| 83 break; |
| 84 case FilterOperation::BLUR: |
| 85 filter_effect.type = ui::CARendererLayerParams::FilterEffectType::BLUR; |
| 86 break; |
| 87 case FilterOperation::DROP_SHADOW: |
| 88 filter_effect.type = |
| 89 ui::CARendererLayerParams::FilterEffectType::DROP_SHADOW; |
| 90 break; |
| 91 default: |
| 92 return false; |
| 93 } |
| 94 |
| 95 filter_effect.amount = operation.amount(); |
| 96 if (filter_effect.type == |
| 97 ui::CARendererLayerParams::FilterEffectType::DROP_SHADOW) { |
| 98 filter_effect.drop_shadow_offset = operation.drop_shadow_offset(); |
| 99 filter_effect.drop_shadow_color = operation.drop_shadow_color(); |
| 100 } |
| 101 filter_effects->push_back(filter_effect); |
| 102 return true; |
| 103 } |
| 104 |
| 105 CALayerResult FromRenderPassQuad(ResourceProvider* resource_provider, |
| 106 const RenderPassDrawQuad* quad, |
| 107 CALayerOverlay* ca_layer_overlay) { |
| 108 if (quad->filters_scale != gfx::Vector2dF(1, 1)) |
| 109 return CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE; |
| 110 if (quad->background_filters.size() != 0) |
| 111 return CA_LAYER_FAILED_RENDER_PASS_BACKGROUND_FILTERS; |
| 112 if (quad->mask_resource_id() != 0) |
| 113 return CA_LAYER_FAILED_RENDER_PASS_MASK; |
| 114 |
| 115 for (const FilterOperation& operation : quad->filters.operations()) { |
| 116 bool success = ConvertAndAppendFilterOperation( |
| 117 operation, &ca_layer_overlay->filter_effects); |
| 118 if (!success) |
| 119 return CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION; |
| 120 } |
| 121 |
| 122 ca_layer_overlay->render_pass_id = quad->render_pass_id; |
| 123 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1); |
| 124 |
| 125 // TODO(erikchen): Enable this when RenderPassDrawQuad promotion to CALayer |
| 126 // is fully functional. https://crbug.com/581526. |
| 127 if (g_allow_rpdq_quad_conversion) |
| 128 return CA_LAYER_SUCCESS; |
| 129 return CA_LAYER_FAILED_RENDER_PASS; |
| 130 } |
| 131 |
43 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, | 132 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, |
44 const StreamVideoDrawQuad* quad, | 133 const StreamVideoDrawQuad* quad, |
45 CALayerOverlay* ca_layer_overlay) { | 134 CALayerOverlay* ca_layer_overlay) { |
46 unsigned resource_id = quad->resource_id(); | 135 unsigned resource_id = quad->resource_id(); |
47 if (!resource_provider->IsOverlayCandidate(resource_id)) | 136 if (!resource_provider->IsOverlayCandidate(resource_id)) |
48 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE; | 137 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE; |
49 ca_layer_overlay->contents_resource_id = resource_id; | 138 ca_layer_overlay->contents_resource_id = resource_id; |
50 // TODO(ccameron): Support merging at least some basic transforms into the | 139 // TODO(ccameron): Support merging at least some basic transforms into the |
51 // layer transform. | 140 // layer transform. |
52 if (!quad->matrix.IsIdentity()) | 141 if (!quad->matrix.IsIdentity()) |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 ca_layer_overlay, skip); | 257 ca_layer_overlay, skip); |
169 case DrawQuad::STREAM_VIDEO_CONTENT: | 258 case DrawQuad::STREAM_VIDEO_CONTENT: |
170 return FromStreamVideoQuad(resource_provider, | 259 return FromStreamVideoQuad(resource_provider, |
171 StreamVideoDrawQuad::MaterialCast(quad), | 260 StreamVideoDrawQuad::MaterialCast(quad), |
172 ca_layer_overlay); | 261 ca_layer_overlay); |
173 case DrawQuad::DEBUG_BORDER: | 262 case DrawQuad::DEBUG_BORDER: |
174 return CA_LAYER_FAILED_DEBUG_BORDER; | 263 return CA_LAYER_FAILED_DEBUG_BORDER; |
175 case DrawQuad::PICTURE_CONTENT: | 264 case DrawQuad::PICTURE_CONTENT: |
176 return CA_LAYER_FAILED_PICTURE_CONTENT; | 265 return CA_LAYER_FAILED_PICTURE_CONTENT; |
177 case DrawQuad::RENDER_PASS: | 266 case DrawQuad::RENDER_PASS: |
178 return CA_LAYER_FAILED_RENDER_PASS; | 267 return FromRenderPassQuad(resource_provider, |
| 268 RenderPassDrawQuad::MaterialCast(quad), |
| 269 ca_layer_overlay); |
179 case DrawQuad::SURFACE_CONTENT: | 270 case DrawQuad::SURFACE_CONTENT: |
180 return CA_LAYER_FAILED_SURFACE_CONTENT; | 271 return CA_LAYER_FAILED_SURFACE_CONTENT; |
181 case DrawQuad::YUV_VIDEO_CONTENT: | 272 case DrawQuad::YUV_VIDEO_CONTENT: |
182 return CA_LAYER_FAILED_YUV_VIDEO_CONTENT; | 273 return CA_LAYER_FAILED_YUV_VIDEO_CONTENT; |
183 default: | 274 default: |
184 break; | 275 break; |
185 } | 276 } |
186 | 277 |
187 return CA_LAYER_FAILED_UNKNOWN; | 278 return CA_LAYER_FAILED_UNKNOWN; |
188 } | 279 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result, | 335 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result, |
245 CA_LAYER_FAILED_COUNT); | 336 CA_LAYER_FAILED_COUNT); |
246 | 337 |
247 if (result != CA_LAYER_SUCCESS) { | 338 if (result != CA_LAYER_SUCCESS) { |
248 ca_layer_overlays->clear(); | 339 ca_layer_overlays->clear(); |
249 return false; | 340 return false; |
250 } | 341 } |
251 return true; | 342 return true; |
252 } | 343 } |
253 | 344 |
| 345 void EnableRenderPassDrawQuadForTesting() { |
| 346 g_allow_rpdq_quad_conversion = true; |
| 347 } |
| 348 |
254 } // namespace cc | 349 } // namespace cc |
OLD | NEW |