Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(541)

Side by Side Diff: cc/output/ca_layer_overlay.cc

Issue 2164613003: Add logic to convert from RenderPassDrawQuads to CALayerOverlays. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@temp41_rpdq_converter
Patch Set: Comments from ccameron. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/overlay_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/overlay_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698