| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |