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; | |
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
| |
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 |