blob: 56b1885de82066bd514ddb56031c9d7f7d10705d [file] [log] [blame]
John Reck704bed02015-11-05 09:22:17 -08001/*
2 * Copyright (C) 2015 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 */
Mark Salyzyn52eb4e02016-09-28 16:15:30 -070016
John Reck704bed02015-11-05 09:22:17 -080017#include <DeviceInfo.h>
18
John Reck56428472018-03-16 17:27:17 -070019#include "Properties.h"
20
John Reck8dc02f92017-07-17 09:55:02 -070021#include <gui/ISurfaceComposer.h>
22#include <gui/SurfaceComposerClient.h>
Peiyong Lin3bff1352018-12-11 07:56:07 -080023#include <ui/GraphicTypes.h>
John Reck704bed02015-11-05 09:22:17 -080024
John Reck704bed02015-11-05 09:22:17 -080025#include <mutex>
John Reck1bcacfd2017-11-03 10:12:19 -070026#include <thread>
John Reck704bed02015-11-05 09:22:17 -080027
Mark Salyzyn52eb4e02016-09-28 16:15:30 -070028#include <log/log.h>
29
John Reck704bed02015-11-05 09:22:17 -080030namespace android {
31namespace uirenderer {
32
John Recke170fb62018-05-07 08:12:07 -070033static constexpr android::DisplayInfo sDummyDisplay{
John Reck56428472018-03-16 17:27:17 -070034 1080, // w
35 1920, // h
36 320.0, // xdpi
37 320.0, // ydpi
38 60.0, // fps
39 2.0, // density
40 0, // orientation
41 false, // secure?
42 0, // appVsyncOffset
43 0, // presentationDeadline
Yiwei Zhang2c2bfc32018-08-23 17:24:55 -070044 1080, // viewportW
45 1920, // viewportH
John Reck56428472018-03-16 17:27:17 -070046};
47
John Reck704bed02015-11-05 09:22:17 -080048const DeviceInfo* DeviceInfo::get() {
Derek Sollenberger17662382018-09-13 14:14:00 -040049 static DeviceInfo sDeviceInfo;
50 return &sDeviceInfo;
John Reck704bed02015-11-05 09:22:17 -080051}
52
Derek Sollenberger17662382018-09-13 14:14:00 -040053DisplayInfo QueryDisplayInfo() {
John Reck56428472018-03-16 17:27:17 -070054 if (Properties::isolatedProcess) {
55 return sDummyDisplay;
56 }
57
58 DisplayInfo displayInfo;
John Reck1bcacfd2017-11-03 10:12:19 -070059 sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
John Reck56428472018-03-16 17:27:17 -070060 status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &displayInfo);
John Reck8dc02f92017-07-17 09:55:02 -070061 LOG_ALWAYS_FATAL_IF(status, "Failed to get display info, error %d", status);
John Reck56428472018-03-16 17:27:17 -070062 return displayInfo;
John Reck8dc02f92017-07-17 09:55:02 -070063}
64
Peiyong Lin3bff1352018-12-11 07:56:07 -080065static void queryWideColorGamutPreference(SkColorSpace::Gamut* colorGamut,
66 sk_sp<SkColorSpace>* colorSpace, SkColorType* colorType) {
67 if (Properties::isolatedProcess) {
68 *colorGamut = SkColorSpace::Gamut::kSRGB_Gamut;
69 *colorSpace = SkColorSpace::MakeSRGB();
70 *colorType = SkColorType::kN32_SkColorType;
71 return;
72 }
73 ui::Dataspace defaultDataspace, wcgDataspace;
74 ui::PixelFormat defaultPixelFormat, wcgPixelFormat;
75 status_t status =
76 SurfaceComposerClient::getCompositionPreference(&defaultDataspace, &defaultPixelFormat,
77 &wcgDataspace, &wcgPixelFormat);
78 LOG_ALWAYS_FATAL_IF(status, "Failed to get composition preference, error %d", status);
79 switch (wcgDataspace) {
80 case ui::Dataspace::DISPLAY_P3:
81 *colorGamut = SkColorSpace::Gamut::kDCIP3_D65_Gamut;
Brian Osmanbe8fac262019-01-14 17:02:23 -050082 *colorSpace = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
Peiyong Lin3bff1352018-12-11 07:56:07 -080083 break;
84 case ui::Dataspace::V0_SCRGB:
85 *colorGamut = SkColorSpace::Gamut::kSRGB_Gamut;
86 *colorSpace = SkColorSpace::MakeSRGB();
87 break;
88 case ui::Dataspace::V0_SRGB:
89 // when sRGB is returned, it means wide color gamut is not supported.
90 *colorGamut = SkColorSpace::Gamut::kSRGB_Gamut;
91 *colorSpace = SkColorSpace::MakeSRGB();
92 break;
93 default:
94 LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space.");
95 }
96 switch (wcgPixelFormat) {
97 case ui::PixelFormat::RGBA_8888:
98 *colorType = SkColorType::kN32_SkColorType;
99 break;
100 case ui::PixelFormat::RGBA_FP16:
101 *colorType = SkColorType::kRGBA_F16_SkColorType;
102 break;
103 default:
104 LOG_ALWAYS_FATAL("Unreachable: unsupported pixel format.");
105 }
106}
107
Derek Sollenberger17662382018-09-13 14:14:00 -0400108DeviceInfo::DeviceInfo() {
109#if HWUI_NULL_GPU
110 mMaxTextureSize = NULL_GPU_MAX_TEXTURE_SIZE;
111#else
112 mMaxTextureSize = -1;
113#endif
114 mDisplayInfo = QueryDisplayInfo();
Peiyong Lin3bff1352018-12-11 07:56:07 -0800115 queryWideColorGamutPreference(&mWideColorGamut, &mWideColorSpace, &mWideColorType);
Derek Sollenberger17662382018-09-13 14:14:00 -0400116}
117
118int DeviceInfo::maxTextureSize() const {
119 LOG_ALWAYS_FATAL_IF(mMaxTextureSize < 0, "MaxTextureSize has not been initialized yet.");
120 return mMaxTextureSize;
121}
122
123void DeviceInfo::setMaxTextureSize(int maxTextureSize) {
124 const_cast<DeviceInfo*>(DeviceInfo::get())->mMaxTextureSize = maxTextureSize;
125}
126
John Reck704bed02015-11-05 09:22:17 -0800127} /* namespace uirenderer */
128} /* namespace android */