1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/viz/service/display/overlay_processor_mac.h"
6
7 #include <vector>
8
9 #include "base/trace_event/trace_event.h"
10 #include "build/build_config.h"
11 #include "components/viz/common/quads/solid_color_draw_quad.h"
12 #include "components/viz/service/display/display_resource_provider.h"
13 #include "components/viz/service/display/output_surface.h"
14 #include "ui/gfx/geometry/rect_conversions.h"
15
16 namespace viz {
OverlayProcessorMac(bool could_overlay,bool enable_ca_overlay)17 OverlayProcessorMac::OverlayProcessorMac(bool could_overlay,
18 bool enable_ca_overlay)
19 : could_overlay_(could_overlay),
20 enable_ca_overlay_(enable_ca_overlay),
21 ca_layer_overlay_processor_(std::make_unique<CALayerOverlayProcessor>()) {
22 }
23
OverlayProcessorMac(std::unique_ptr<CALayerOverlayProcessor> ca_layer_overlay_processor)24 OverlayProcessorMac::OverlayProcessorMac(
25 std::unique_ptr<CALayerOverlayProcessor> ca_layer_overlay_processor)
26 : could_overlay_(true),
27 enable_ca_overlay_(true),
28 ca_layer_overlay_processor_(std::move(ca_layer_overlay_processor)) {}
29
30 OverlayProcessorMac::~OverlayProcessorMac() = default;
31
DisableSplittingQuads() const32 bool OverlayProcessorMac::DisableSplittingQuads() const {
33 return true;
34 }
35
IsOverlaySupported() const36 bool OverlayProcessorMac::IsOverlaySupported() const {
37 return could_overlay_;
38 }
39
GetAndResetOverlayDamage()40 gfx::Rect OverlayProcessorMac::GetAndResetOverlayDamage() {
41 gfx::Rect result = ca_overlay_damage_rect_;
42 ca_overlay_damage_rect_ = gfx::Rect();
43 return result;
44 }
45
ProcessForOverlays(DisplayResourceProvider * resource_provider,RenderPassList * render_passes,const SkMatrix44 & output_color_matrix,const OverlayProcessorInterface::FilterOperationsMap & render_pass_filters,const OverlayProcessorInterface::FilterOperationsMap & render_pass_backdrop_filters,OutputSurfaceOverlayPlane * output_surface_plane,CandidateList * candidates,gfx::Rect * damage_rect,std::vector<gfx::Rect> * content_bounds)46 void OverlayProcessorMac::ProcessForOverlays(
47 DisplayResourceProvider* resource_provider,
48 RenderPassList* render_passes,
49 const SkMatrix44& output_color_matrix,
50 const OverlayProcessorInterface::FilterOperationsMap& render_pass_filters,
51 const OverlayProcessorInterface::FilterOperationsMap&
52 render_pass_backdrop_filters,
53 OutputSurfaceOverlayPlane* output_surface_plane,
54 CandidateList* candidates,
55 gfx::Rect* damage_rect,
56 std::vector<gfx::Rect>* content_bounds) {
57 TRACE_EVENT0("viz", "OverlayProcessorMac::ProcessForOverlays");
58 // Clear to get ready to handle output surface as overlay.
59 output_surface_already_handled_ = false;
60
61 auto& render_pass = render_passes->back();
62 // Skip overlay processing if we have copy request.
63 if (!render_pass->copy_requests.empty())
64 return;
65
66 // We could have surfaceless overlay but not ca overlay system on. In this
67 // case we would still have the OutputSurfaceOverlayPlane.
68 if (!enable_ca_overlay_)
69 return;
70
71 // If ca overlay system didn't succeed, we fall back to surfaceless.
72 if (!ca_layer_overlay_processor_->ProcessForCALayerOverlays(
73 resource_provider, gfx::RectF(render_pass->output_rect),
74 render_pass->quad_list, render_pass_filters,
75 render_pass_backdrop_filters, candidates))
76 return;
77
78 // CALayer overlays are all-or-nothing. If all quads were replaced with
79 // layers then mark the output surface as already handled.
80 output_surface_already_handled_ = true;
81 ca_overlay_damage_rect_ = render_pass->output_rect;
82 *damage_rect = gfx::Rect();
83 }
84
AdjustOutputSurfaceOverlay(base::Optional<OutputSurfaceOverlayPlane> * output_surface_plane)85 void OverlayProcessorMac::AdjustOutputSurfaceOverlay(
86 base::Optional<OutputSurfaceOverlayPlane>* output_surface_plane) {
87 if (!output_surface_plane->has_value())
88 return;
89
90 if (output_surface_already_handled_)
91 output_surface_plane->reset();
92 }
93
NeedsSurfaceOccludingDamageRect() const94 bool OverlayProcessorMac::NeedsSurfaceOccludingDamageRect() const {
95 return false;
96 }
97
98 } // namespace viz
99