1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2022 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <algorithm>
18*38e8c45fSAndroid Build Coastguard Worker #include <functional>
19*38e8c45fSAndroid Build Coastguard Worker #include <utility>
20*38e8c45fSAndroid Build Coastguard Worker
21*38e8c45fSAndroid Build Coastguard Worker #include <ftl/algorithm.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <ftl/enum.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <ui/DebugUtils.h>
24*38e8c45fSAndroid Build Coastguard Worker
25*38e8c45fSAndroid Build Coastguard Worker #include "DisplaySnapshot.h"
26*38e8c45fSAndroid Build Coastguard Worker
27*38e8c45fSAndroid Build Coastguard Worker namespace android::display {
28*38e8c45fSAndroid Build Coastguard Worker
DisplaySnapshot(PhysicalDisplayId displayId,ui::DisplayConnectionType connectionType,DisplayModes && displayModes,ui::ColorModes && colorModes,std::optional<DeviceProductInfo> && deviceProductInfo)29*38e8c45fSAndroid Build Coastguard Worker DisplaySnapshot::DisplaySnapshot(PhysicalDisplayId displayId,
30*38e8c45fSAndroid Build Coastguard Worker ui::DisplayConnectionType connectionType,
31*38e8c45fSAndroid Build Coastguard Worker DisplayModes&& displayModes, ui::ColorModes&& colorModes,
32*38e8c45fSAndroid Build Coastguard Worker std::optional<DeviceProductInfo>&& deviceProductInfo)
33*38e8c45fSAndroid Build Coastguard Worker : mDisplayId(displayId),
34*38e8c45fSAndroid Build Coastguard Worker mConnectionType(connectionType),
35*38e8c45fSAndroid Build Coastguard Worker mDisplayModes(std::move(displayModes)),
36*38e8c45fSAndroid Build Coastguard Worker mColorModes(std::move(colorModes)),
37*38e8c45fSAndroid Build Coastguard Worker mDeviceProductInfo(std::move(deviceProductInfo)) {}
38*38e8c45fSAndroid Build Coastguard Worker
translateModeId(hal::HWConfigId hwcId) const39*38e8c45fSAndroid Build Coastguard Worker std::optional<DisplayModeId> DisplaySnapshot::translateModeId(hal::HWConfigId hwcId) const {
40*38e8c45fSAndroid Build Coastguard Worker return ftl::find_if(mDisplayModes,
41*38e8c45fSAndroid Build Coastguard Worker [hwcId](const DisplayModes::value_type& pair) {
42*38e8c45fSAndroid Build Coastguard Worker return pair.second->getHwcId() == hwcId;
43*38e8c45fSAndroid Build Coastguard Worker })
44*38e8c45fSAndroid Build Coastguard Worker .transform(&ftl::to_key<DisplayModes>);
45*38e8c45fSAndroid Build Coastguard Worker }
46*38e8c45fSAndroid Build Coastguard Worker
filterColorModes(bool supportsWideColor) const47*38e8c45fSAndroid Build Coastguard Worker ui::ColorModes DisplaySnapshot::filterColorModes(bool supportsWideColor) const {
48*38e8c45fSAndroid Build Coastguard Worker ui::ColorModes modes = mColorModes;
49*38e8c45fSAndroid Build Coastguard Worker
50*38e8c45fSAndroid Build Coastguard Worker // If the display is internal and the configuration claims it's not wide color capable, filter
51*38e8c45fSAndroid Build Coastguard Worker // out all wide color modes. The typical reason why this happens is that the hardware is not
52*38e8c45fSAndroid Build Coastguard Worker // good enough to support GPU composition of wide color, and thus the OEMs choose to disable
53*38e8c45fSAndroid Build Coastguard Worker // this capability.
54*38e8c45fSAndroid Build Coastguard Worker if (mConnectionType == ui::DisplayConnectionType::Internal && !supportsWideColor) {
55*38e8c45fSAndroid Build Coastguard Worker const auto it = std::remove_if(modes.begin(), modes.end(), ui::isWideColorMode);
56*38e8c45fSAndroid Build Coastguard Worker modes.erase(it, modes.end());
57*38e8c45fSAndroid Build Coastguard Worker }
58*38e8c45fSAndroid Build Coastguard Worker
59*38e8c45fSAndroid Build Coastguard Worker return modes;
60*38e8c45fSAndroid Build Coastguard Worker }
61*38e8c45fSAndroid Build Coastguard Worker
dump(utils::Dumper & dumper) const62*38e8c45fSAndroid Build Coastguard Worker void DisplaySnapshot::dump(utils::Dumper& dumper) const {
63*38e8c45fSAndroid Build Coastguard Worker using namespace std::string_view_literals;
64*38e8c45fSAndroid Build Coastguard Worker
65*38e8c45fSAndroid Build Coastguard Worker dumper.dump("connectionType"sv, ftl::enum_string(mConnectionType));
66*38e8c45fSAndroid Build Coastguard Worker
67*38e8c45fSAndroid Build Coastguard Worker dumper.dump("colorModes"sv);
68*38e8c45fSAndroid Build Coastguard Worker {
69*38e8c45fSAndroid Build Coastguard Worker utils::Dumper::Indent indent(dumper);
70*38e8c45fSAndroid Build Coastguard Worker for (const auto mode : mColorModes) {
71*38e8c45fSAndroid Build Coastguard Worker dumper.dump({}, decodeColorMode(mode));
72*38e8c45fSAndroid Build Coastguard Worker }
73*38e8c45fSAndroid Build Coastguard Worker }
74*38e8c45fSAndroid Build Coastguard Worker
75*38e8c45fSAndroid Build Coastguard Worker dumper.dump("deviceProductInfo"sv, mDeviceProductInfo);
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker
78*38e8c45fSAndroid Build Coastguard Worker } // namespace android::display
79