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