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

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: Static asserts. 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
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 float amount = operation.amount();
95 static_assert(sizeof(int32_t) == sizeof(float),
96 "This conversion requires that float and int32_t have the "
97 "same size.");
98 filter_effect.data[0] = *reinterpret_cast<int32_t*>(&amount);
99 if (filter_effect.type ==
100 ui::CARendererLayerParams::FilterEffectType::DROP_SHADOW) {
101 filter_effect.data[1] = operation.drop_shadow_offset().x();
102 filter_effect.data[2] = operation.drop_shadow_offset().y();
103 SkColor color = operation.drop_shadow_color();
104
105 static_assert(sizeof(int32_t) == sizeof(SkColor),
106 "This conversion requires that SkColor and int32_t have the "
107 "same size.");
108 filter_effect.data[3] = *reinterpret_cast<int32_t*>(&color);
109 }
110 filter_effects->push_back(filter_effect);
111 return true;
112 }
113
114 CALayerResult FromRenderPassQuad(ResourceProvider* resource_provider,
115 const RenderPassDrawQuad* quad,
116 CALayerOverlay* ca_layer_overlay) {
117 if (quad->filters_scale != gfx::Vector2dF(1, 1))
118 return CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE;
119 if (quad->background_filters.size() != 0)
120 return CA_LAYER_FAILED_RENDER_PASS_BACKGROUND_FILTERS;
121 if (quad->mask_resource_id() != 0)
122 return CA_LAYER_FAILED_RENDER_PASS_MASK;
123
124 for (const FilterOperation& operation : quad->filters.operations()) {
125 bool success = ConvertAndAppendFilterOperation(
126 operation, &ca_layer_overlay->filter_effects);
127 if (!success)
128 return CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION;
129 }
130
131 ca_layer_overlay->render_pass_id = quad->render_pass_id;
132 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1);
133
134 // TODO(erikchen): Enable this when RenderPassDrawQuad promotion to CALayer
135 // is fully functional. https://crbug.com/581526.
136 if (g_allow_rpdq_quad_conversion)
137 return CA_LAYER_SUCCESS;
138 return CA_LAYER_FAILED_RENDER_PASS;
139 }
140
43 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, 141 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider,
44 const StreamVideoDrawQuad* quad, 142 const StreamVideoDrawQuad* quad,
45 CALayerOverlay* ca_layer_overlay) { 143 CALayerOverlay* ca_layer_overlay) {
46 unsigned resource_id = quad->resource_id(); 144 unsigned resource_id = quad->resource_id();
47 if (!resource_provider->IsOverlayCandidate(resource_id)) 145 if (!resource_provider->IsOverlayCandidate(resource_id))
48 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE; 146 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE;
49 ca_layer_overlay->contents_resource_id = resource_id; 147 ca_layer_overlay->contents_resource_id = resource_id;
50 // TODO(ccameron): Support merging at least some basic transforms into the 148 // TODO(ccameron): Support merging at least some basic transforms into the
51 // layer transform. 149 // layer transform.
52 if (!quad->matrix.IsIdentity()) 150 if (!quad->matrix.IsIdentity())
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 ca_layer_overlay, skip); 266 ca_layer_overlay, skip);
169 case DrawQuad::STREAM_VIDEO_CONTENT: 267 case DrawQuad::STREAM_VIDEO_CONTENT:
170 return FromStreamVideoQuad(resource_provider, 268 return FromStreamVideoQuad(resource_provider,
171 StreamVideoDrawQuad::MaterialCast(quad), 269 StreamVideoDrawQuad::MaterialCast(quad),
172 ca_layer_overlay); 270 ca_layer_overlay);
173 case DrawQuad::DEBUG_BORDER: 271 case DrawQuad::DEBUG_BORDER:
174 return CA_LAYER_FAILED_DEBUG_BORDER; 272 return CA_LAYER_FAILED_DEBUG_BORDER;
175 case DrawQuad::PICTURE_CONTENT: 273 case DrawQuad::PICTURE_CONTENT:
176 return CA_LAYER_FAILED_PICTURE_CONTENT; 274 return CA_LAYER_FAILED_PICTURE_CONTENT;
177 case DrawQuad::RENDER_PASS: 275 case DrawQuad::RENDER_PASS:
178 return CA_LAYER_FAILED_RENDER_PASS; 276 return FromRenderPassQuad(resource_provider,
277 RenderPassDrawQuad::MaterialCast(quad),
278 ca_layer_overlay);
179 case DrawQuad::SURFACE_CONTENT: 279 case DrawQuad::SURFACE_CONTENT:
180 return CA_LAYER_FAILED_SURFACE_CONTENT; 280 return CA_LAYER_FAILED_SURFACE_CONTENT;
181 case DrawQuad::YUV_VIDEO_CONTENT: 281 case DrawQuad::YUV_VIDEO_CONTENT:
182 return CA_LAYER_FAILED_YUV_VIDEO_CONTENT; 282 return CA_LAYER_FAILED_YUV_VIDEO_CONTENT;
183 default: 283 default:
184 break; 284 break;
185 } 285 }
186 286
187 return CA_LAYER_FAILED_UNKNOWN; 287 return CA_LAYER_FAILED_UNKNOWN;
188 } 288 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result, 344 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result,
245 CA_LAYER_FAILED_COUNT); 345 CA_LAYER_FAILED_COUNT);
246 346
247 if (result != CA_LAYER_SUCCESS) { 347 if (result != CA_LAYER_SUCCESS) {
248 ca_layer_overlays->clear(); 348 ca_layer_overlays->clear();
249 return false; 349 return false;
250 } 350 }
251 return true; 351 return true;
252 } 352 }
253 353
354 void EnableRenderPassDrawQuadForTesting() {
355 g_allow_rpdq_quad_conversion = true;
356 }
357
254 } // namespace cc 358 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698