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

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

Issue 2780073002: Disable DirectComposition underlays and complex transforms by default. (Closed)
Patch Set: fix tests Created 3 years, 8 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 | « no previous file | cc/output/gl_renderer_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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/dc_layer_overlay.h" 5 #include "cc/output/dc_layer_overlay.h"
6 6
7 #include "cc/base/math_util.h" 7 #include "cc/base/math_util.h"
8 #include "cc/quads/solid_color_draw_quad.h" 8 #include "cc/quads/solid_color_draw_quad.h"
9 #include "cc/quads/yuv_video_draw_quad.h" 9 #include "cc/quads/yuv_video_draw_quad.h"
10 #include "cc/resources/resource_provider.h" 10 #include "cc/resources/resource_provider.h"
11 #include "gpu/GLES2/gl2extchromium.h" 11 #include "gpu/GLES2/gl2extchromium.h"
12 #include "ui/gfx/geometry/rect_conversions.h" 12 #include "ui/gfx/geometry/rect_conversions.h"
13 #include "ui/gl/gl_switches.h"
13 14
14 namespace cc { 15 namespace cc {
15 16
16 namespace { 17 namespace {
17 18
18 DCLayerOverlayProcessor::DCLayerResult FromYUVQuad( 19 DCLayerOverlayProcessor::DCLayerResult FromYUVQuad(
19 ResourceProvider* resource_provider, 20 ResourceProvider* resource_provider,
20 const YUVVideoDrawQuad* quad, 21 const YUVVideoDrawQuad* quad,
21 DCLayerOverlay* ca_layer_overlay) { 22 DCLayerOverlay* ca_layer_overlay) {
22 unsigned resource_id = quad->y_plane_resource_id(); 23 unsigned resource_id = quad->y_plane_resource_id();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 gfx::Rect* damage_rect, 114 gfx::Rect* damage_rect,
114 DCLayerOverlayList* ca_layer_overlays) { 115 DCLayerOverlayList* ca_layer_overlays) {
115 gfx::Rect this_frame_underlay_rect; 116 gfx::Rect this_frame_underlay_rect;
116 bool display_rect_changed = (display_rect != previous_display_rect_); 117 bool display_rect_changed = (display_rect != previous_display_rect_);
117 for (auto it = quad_list->begin(); it != quad_list->end(); ++it) { 118 for (auto it = quad_list->begin(); it != quad_list->end(); ++it) {
118 DCLayerOverlay ca_layer; 119 DCLayerOverlay ca_layer;
119 DCLayerResult result = FromDrawQuad(resource_provider, display_rect, 120 DCLayerResult result = FromDrawQuad(resource_provider, display_rect,
120 quad_list->begin(), it, &ca_layer); 121 quad_list->begin(), it, &ca_layer);
121 if (result != DC_LAYER_SUCCESS) 122 if (result != DC_LAYER_SUCCESS)
122 continue; 123 continue;
124
125 if (!it->shared_quad_state->quad_to_target_transform
126 .Preserves2dAxisAlignment() &&
127 !base::FeatureList::IsEnabled(
128 features::kDirectCompositionComplexOverlays)) {
129 continue;
130 }
131
123 gfx::Rect quad_rectangle = MathUtil::MapEnclosingClippedRect( 132 gfx::Rect quad_rectangle = MathUtil::MapEnclosingClippedRect(
124 it->shared_quad_state->quad_to_target_transform, it->rect); 133 it->shared_quad_state->quad_to_target_transform, it->rect);
125 gfx::RectF occlusion_bounding_box = 134 gfx::RectF occlusion_bounding_box =
126 GetOcclusionBounds(gfx::RectF(quad_rectangle), quad_list->begin(), it); 135 GetOcclusionBounds(gfx::RectF(quad_rectangle), quad_list->begin(), it);
127 overlay_damage_rect->Union(quad_rectangle);
128
129 if (occlusion_bounding_box.IsEmpty()) { 136 if (occlusion_bounding_box.IsEmpty()) {
130 // The quad is on top, so promote it to an overlay and remove all damage 137 // The quad is on top, so promote it to an overlay and remove all damage
131 // underneath it. 138 // underneath it.
132 if (it->shared_quad_state->quad_to_target_transform 139 if (it->shared_quad_state->quad_to_target_transform
133 .Preserves2dAxisAlignment() && 140 .Preserves2dAxisAlignment() &&
134 !display_rect_changed) { 141 !display_rect_changed) {
135 damage_rect->Subtract(quad_rectangle); 142 damage_rect->Subtract(quad_rectangle);
136 } 143 }
137 quad_list->EraseAndInvalidateAllPointers(it); 144 quad_list->EraseAndInvalidateAllPointers(it);
145 } else if (!base::FeatureList::IsEnabled(
146 features::kDirectCompositionUnderlays)) {
147 continue;
138 } else { 148 } else {
139 // The quad is occluded, so replace it with a black solid color quad and 149 // The quad is occluded, so replace it with a black solid color quad and
140 // place the overlay itself under the quad. 150 // place the overlay itself under the quad.
141 if (it->shared_quad_state->quad_to_target_transform 151 if (it->shared_quad_state->quad_to_target_transform
142 .IsIdentityOrIntegerTranslation()) { 152 .IsIdentityOrIntegerTranslation()) {
143 this_frame_underlay_rect = quad_rectangle; 153 this_frame_underlay_rect = quad_rectangle;
144 } 154 }
145 ca_layer.shared_state->z_order = -1; 155 ca_layer.shared_state->z_order = -1;
146 const SharedQuadState* shared_quad_state = it->shared_quad_state; 156 const SharedQuadState* shared_quad_state = it->shared_quad_state;
147 gfx::Rect rect = it->visible_rect; 157 gfx::Rect rect = it->visible_rect;
(...skipping 20 matching lines...) Expand all
168 178
169 damage_rect->Union(occluding_damage_rect); 179 damage_rect->Union(occluding_damage_rect);
170 } 180 }
171 } else { 181 } else {
172 // Entire replacement quad must be redrawn. 182 // Entire replacement quad must be redrawn.
173 damage_rect->Union(quad_rectangle); 183 damage_rect->Union(quad_rectangle);
174 } 184 }
175 previous_occlusion_bounding_box_ = 185 previous_occlusion_bounding_box_ =
176 gfx::ToEnclosingRect(occlusion_bounding_box); 186 gfx::ToEnclosingRect(occlusion_bounding_box);
177 } 187 }
188 overlay_damage_rect->Union(quad_rectangle);
178 189
179 ca_layer_overlays->push_back(ca_layer); 190 ca_layer_overlays->push_back(ca_layer);
180 // Only allow one overlay for now. 191 // Only allow one overlay for now.
181 break; 192 break;
182 } 193 }
183 damage_rect->Intersect(gfx::ToEnclosingRect(display_rect)); 194 damage_rect->Intersect(gfx::ToEnclosingRect(display_rect));
184 previous_frame_underlay_rect_ = this_frame_underlay_rect; 195 previous_frame_underlay_rect_ = this_frame_underlay_rect;
185 previous_display_rect_ = display_rect; 196 previous_display_rect_ = display_rect;
186 } 197 }
187 198
188 } // namespace cc 199 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/output/gl_renderer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698