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_win.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 {
17 
OverlayProcessorWin(bool enable_dc_overlay,std::unique_ptr<DCLayerOverlayProcessor> dc_layer_overlay_processor)18 OverlayProcessorWin::OverlayProcessorWin(
19     bool enable_dc_overlay,
20     std::unique_ptr<DCLayerOverlayProcessor> dc_layer_overlay_processor)
21     : enable_dc_overlay_(enable_dc_overlay),
22       dc_layer_overlay_processor_(std::move(dc_layer_overlay_processor)) {}
23 
24 OverlayProcessorWin::~OverlayProcessorWin() = default;
25 
IsOverlaySupported() const26 bool OverlayProcessorWin::IsOverlaySupported() const {
27   return enable_dc_overlay_;
28 }
29 
GetAndResetOverlayDamage()30 gfx::Rect OverlayProcessorWin::GetAndResetOverlayDamage() {
31   return gfx::Rect();
32 }
33 
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)34 void OverlayProcessorWin::ProcessForOverlays(
35     DisplayResourceProvider* resource_provider,
36     RenderPassList* render_passes,
37     const SkMatrix44& output_color_matrix,
38     const OverlayProcessorInterface::FilterOperationsMap& render_pass_filters,
39     const OverlayProcessorInterface::FilterOperationsMap&
40         render_pass_backdrop_filters,
41     OutputSurfaceOverlayPlane* output_surface_plane,
42     CandidateList* candidates,
43     gfx::Rect* damage_rect,
44     std::vector<gfx::Rect>* content_bounds) {
45   TRACE_EVENT0("viz", "OverlayProcessorWin::ProcessForOverlays");
46 
47   RenderPass* root_render_pass = render_passes->back().get();
48   // Skip overlay processing if we have copy request.
49   if (!root_render_pass->copy_requests.empty()) {
50     damage_rect->Union(dc_layer_overlay_processor_
51                            ->previous_frame_overlay_damage_contribution());
52     // Update damage rect before calling ClearOverlayState, otherwise
53     // previous_frame_overlay_rect_union will be empty.
54     dc_layer_overlay_processor_->ClearOverlayState();
55     return;
56   }
57 
58   // Skip overlay processing if output colorspace is HDR.
59   // Since Overlay only supports NV12 and YUY2 now, HDR content (usually P010
60   // format) cannot output through overlay without format degrading.
61   if (root_render_pass->content_color_usage == gfx::ContentColorUsage::kHDR)
62     return;
63 
64   if (!enable_dc_overlay_)
65     return;
66 
67   dc_layer_overlay_processor_->Process(
68       resource_provider, gfx::RectF(root_render_pass->output_rect),
69       render_passes, damage_rect, candidates);
70 }
71 
NeedsSurfaceOccludingDamageRect() const72 bool OverlayProcessorWin::NeedsSurfaceOccludingDamageRect() const {
73   return true;
74 }
75 
76 }  // namespace viz
77