1 /*
2 * Copyright 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #undef LOG_TAG
18 #define LOG_TAG "LibSurfaceFlingerUnittests"
19
20 #include "DisplayTransactionTestHelpers.h"
21
22 #include <gmock/gmock.h>
23 #include <gtest/gtest.h>
24
25 namespace android {
26 namespace {
27
28 using hal::RenderIntent;
29
30 using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
31
32 class GetBestColorModeTest : public DisplayTransactionTest {
33 public:
setHasWideColorGamut(bool hasWideColorGamut)34 void setHasWideColorGamut(bool hasWideColorGamut) { mHasWideColorGamut = hasWideColorGamut; }
35
addHwcColorModesMapping(ui::ColorMode colorMode,std::vector<ui::RenderIntent> renderIntents)36 void addHwcColorModesMapping(ui::ColorMode colorMode,
37 std::vector<ui::RenderIntent> renderIntents) {
38 mHwcColorModes[colorMode] = renderIntents;
39 }
40
setInputDataspace(ui::Dataspace dataspace)41 void setInputDataspace(ui::Dataspace dataspace) { mInputDataspace = dataspace; }
42
setInputRenderIntent(ui::RenderIntent renderIntent)43 void setInputRenderIntent(ui::RenderIntent renderIntent) { mInputRenderIntent = renderIntent; }
44
getBestColorMode()45 void getBestColorMode() {
46 auto displayDevice =
47 injectDefaultInternalDisplay([this](FakeDisplayDeviceInjector& injector) {
48 injector.setHwcColorModes(mHwcColorModes);
49 injector.setHasWideColorGamut(mHasWideColorGamut);
50 injector.setNativeWindow(mNativeWindow);
51 });
52
53 displayDevice->getCompositionDisplay()
54 ->getDisplayColorProfile()
55 ->getBestColorMode(mInputDataspace, mInputRenderIntent, &mOutDataspace,
56 &mOutColorMode, &mOutRenderIntent);
57 }
58
59 ui::Dataspace mOutDataspace;
60 ui::ColorMode mOutColorMode;
61 ui::RenderIntent mOutRenderIntent;
62
63 private:
64 ui::Dataspace mInputDataspace;
65 ui::RenderIntent mInputRenderIntent;
66 bool mHasWideColorGamut = false;
67 std::unordered_map<ui::ColorMode, std::vector<ui::RenderIntent>> mHwcColorModes;
68 };
69
TEST_F(GetBestColorModeTest,DataspaceDisplayP3_ColorModeSRGB)70 TEST_F(GetBestColorModeTest, DataspaceDisplayP3_ColorModeSRGB) {
71 addHwcColorModesMapping(ui::ColorMode::SRGB,
72 std::vector<ui::RenderIntent>(1, RenderIntent::COLORIMETRIC));
73 setInputDataspace(ui::Dataspace::DISPLAY_P3);
74 setInputRenderIntent(ui::RenderIntent::COLORIMETRIC);
75 setHasWideColorGamut(true);
76
77 getBestColorMode();
78
79 ASSERT_EQ(ui::Dataspace::V0_SRGB, mOutDataspace);
80 ASSERT_EQ(ui::ColorMode::SRGB, mOutColorMode);
81 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mOutRenderIntent);
82 }
83
TEST_F(GetBestColorModeTest,DataspaceDisplayP3_ColorModeDisplayP3)84 TEST_F(GetBestColorModeTest, DataspaceDisplayP3_ColorModeDisplayP3) {
85 addHwcColorModesMapping(ui::ColorMode::DISPLAY_P3,
86 std::vector<ui::RenderIntent>(1, RenderIntent::COLORIMETRIC));
87 addHwcColorModesMapping(ui::ColorMode::SRGB,
88 std::vector<ui::RenderIntent>(1, RenderIntent::COLORIMETRIC));
89 addHwcColorModesMapping(ui::ColorMode::DISPLAY_BT2020,
90 std::vector<ui::RenderIntent>(1, RenderIntent::COLORIMETRIC));
91 setInputDataspace(ui::Dataspace::DISPLAY_P3);
92 setInputRenderIntent(ui::RenderIntent::COLORIMETRIC);
93 setHasWideColorGamut(true);
94
95 getBestColorMode();
96
97 ASSERT_EQ(ui::Dataspace::DISPLAY_P3, mOutDataspace);
98 ASSERT_EQ(ui::ColorMode::DISPLAY_P3, mOutColorMode);
99 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mOutRenderIntent);
100 }
101
TEST_F(GetBestColorModeTest,DataspaceDisplayP3_ColorModeDISPLAY_BT2020)102 TEST_F(GetBestColorModeTest, DataspaceDisplayP3_ColorModeDISPLAY_BT2020) {
103 addHwcColorModesMapping(ui::ColorMode::DISPLAY_BT2020,
104 std::vector<ui::RenderIntent>(1, RenderIntent::COLORIMETRIC));
105 setInputDataspace(ui::Dataspace::DISPLAY_P3);
106 setInputRenderIntent(ui::RenderIntent::COLORIMETRIC);
107 setHasWideColorGamut(true);
108
109 getBestColorMode();
110
111 ASSERT_EQ(ui::Dataspace::DISPLAY_BT2020, mOutDataspace);
112 ASSERT_EQ(ui::ColorMode::DISPLAY_BT2020, mOutColorMode);
113 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mOutRenderIntent);
114 }
115
116 } // namespace
117 } // namespace android
118