diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-17 13:57:45 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-19 13:44:40 +0000 |
commit | 6ec7b8da05d21a3878bd21c691b41e675d74bb1c (patch) | |
tree | b87f250bc19413750b9bb9cdbf2da20ef5014820 /chromium/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc | |
parent | ec02ee4181c49b61fce1c8fb99292dbb8139cc90 (diff) | |
download | qtwebengine-chromium-6ec7b8da05d21a3878bd21c691b41e675d74bb1c.tar.gz |
BASELINE: Update Chromium to 60.0.3112.70
Change-Id: I9911c2280a014d4632f254857876a395d4baed2d
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc')
-rw-r--r-- | chromium/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/chromium/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc b/chromium/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc new file mode 100644 index 00000000000..c21d8c7728a --- /dev/null +++ b/chromium/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc @@ -0,0 +1,128 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.h" + +#include <stddef.h> + +#include <utility> + +#include "base/bind.h" +#include "base/memory/ptr_util.h" +#include "base/strings/string_split.h" +#include "cc/output/overlay_strategy_fullscreen.h" +#include "cc/output/overlay_strategy_single_on_top.h" +#include "cc/output/overlay_strategy_underlay.h" +#include "cc/output/overlay_strategy_underlay_cast.h" +#include "ui/ozone/public/overlay_candidates_ozone.h" + +namespace viz { +namespace { +// Templated function used to create an OverlayProcessor::Strategy +// of type |S|. +template <typename S> +std::unique_ptr<cc::OverlayProcessor::Strategy> MakeOverlayStrategy( + CompositorOverlayCandidateValidatorOzone* capability_checker) { + return base::MakeUnique<S>(capability_checker); +} + +} // namespace + +// |overlay_candidates| is an object used to answer questions about possible +// overlays configuarations. +// |strategies_string| is a comma-separated string containing all the overaly +// strategies that should be returned by GetStrategies. +// If |strategies_string| is empty "single-on-top,underlay" will be used as +// default. +CompositorOverlayCandidateValidatorOzone:: + CompositorOverlayCandidateValidatorOzone( + std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates, + std::string strategies_string) + : overlay_candidates_(std::move(overlay_candidates)), + software_mirror_active_(false) { + if (!strategies_string.length()) + strategies_string = "single-on-top,underlay"; + + for (const auto& strategy_name : + base::SplitStringPiece(strategies_string, ",", base::TRIM_WHITESPACE, + base::SPLIT_WANT_NONEMPTY)) { + if (strategy_name == "single-fullscreen") { + strategies_instantiators_.push_back( + base::Bind(MakeOverlayStrategy<cc::OverlayStrategyFullscreen>)); + } else if (strategy_name == "single-on-top") { + strategies_instantiators_.push_back( + base::Bind(MakeOverlayStrategy<cc::OverlayStrategySingleOnTop>)); + } else if (strategy_name == "underlay") { + strategies_instantiators_.push_back( + base::Bind(MakeOverlayStrategy<cc::OverlayStrategyUnderlay>)); + } else if (strategy_name == "cast") { + strategies_instantiators_.push_back( + base::Bind(MakeOverlayStrategy<cc::OverlayStrategyUnderlayCast>)); + } else { + LOG(WARNING) << "Unrecognized overlay strategy " << strategy_name; + } + } +} + +CompositorOverlayCandidateValidatorOzone:: + ~CompositorOverlayCandidateValidatorOzone() {} + +void CompositorOverlayCandidateValidatorOzone::GetStrategies( + cc::OverlayProcessor::StrategyList* strategies) { + for (auto& instantiator : strategies_instantiators_) + strategies->push_back(instantiator.Run(this)); +} + +bool CompositorOverlayCandidateValidatorOzone::AllowCALayerOverlays() { + return false; +} + +bool CompositorOverlayCandidateValidatorOzone::AllowDCLayerOverlays() { + return false; +} + +void CompositorOverlayCandidateValidatorOzone::CheckOverlaySupport( + cc::OverlayCandidateList* surfaces) { + // SW mirroring copies out of the framebuffer, so we can't remove any + // quads for overlaying, otherwise the output is incorrect. + if (software_mirror_active_) { + for (size_t i = 0; i < surfaces->size(); i++) { + surfaces->at(i).overlay_handled = false; + } + return; + } + + DCHECK_GE(2U, surfaces->size()); + ui::OverlayCandidatesOzone::OverlaySurfaceCandidateList ozone_surface_list; + ozone_surface_list.resize(surfaces->size()); + + for (size_t i = 0; i < surfaces->size(); i++) { + ozone_surface_list.at(i).transform = surfaces->at(i).transform; + ozone_surface_list.at(i).format = surfaces->at(i).format; + ozone_surface_list.at(i).display_rect = surfaces->at(i).display_rect; + ozone_surface_list.at(i).crop_rect = surfaces->at(i).uv_rect; + ozone_surface_list.at(i).quad_rect_in_target_space = + surfaces->at(i).quad_rect_in_target_space; + ozone_surface_list.at(i).clip_rect = surfaces->at(i).clip_rect; + ozone_surface_list.at(i).is_clipped = surfaces->at(i).is_clipped; + ozone_surface_list.at(i).plane_z_order = surfaces->at(i).plane_z_order; + ozone_surface_list.at(i).buffer_size = + surfaces->at(i).resource_size_in_pixels; + } + + overlay_candidates_->CheckOverlaySupport(&ozone_surface_list); + DCHECK_EQ(surfaces->size(), ozone_surface_list.size()); + + for (size_t i = 0; i < surfaces->size(); i++) { + surfaces->at(i).overlay_handled = ozone_surface_list.at(i).overlay_handled; + surfaces->at(i).display_rect = ozone_surface_list.at(i).display_rect; + } +} + +void CompositorOverlayCandidateValidatorOzone::SetSoftwareMirrorMode( + bool enabled) { + software_mirror_active_ = enabled; +} + +} // namespace viz |