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