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