xref: /aosp_15_r20/frameworks/base/libs/hwui/DeviceInfo.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #include <DeviceInfo.h>
18*d57664e9SAndroid Build Coastguard Worker #include <android/hardware_buffer.h>
19*d57664e9SAndroid Build Coastguard Worker #include <apex/display.h>
20*d57664e9SAndroid Build Coastguard Worker #include <log/log.h>
21*d57664e9SAndroid Build Coastguard Worker #include <utils/Errors.h>
22*d57664e9SAndroid Build Coastguard Worker 
23*d57664e9SAndroid Build Coastguard Worker #include "Properties.h"
24*d57664e9SAndroid Build Coastguard Worker 
25*d57664e9SAndroid Build Coastguard Worker namespace android {
26*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
27*d57664e9SAndroid Build Coastguard Worker 
get()28*d57664e9SAndroid Build Coastguard Worker DeviceInfo* DeviceInfo::get() {
29*d57664e9SAndroid Build Coastguard Worker     static DeviceInfo sDeviceInfo;
30*d57664e9SAndroid Build Coastguard Worker     return &sDeviceInfo;
31*d57664e9SAndroid Build Coastguard Worker }
32*d57664e9SAndroid Build Coastguard Worker 
DeviceInfo()33*d57664e9SAndroid Build Coastguard Worker DeviceInfo::DeviceInfo() {
34*d57664e9SAndroid Build Coastguard Worker #if HWUI_NULL_GPU
35*d57664e9SAndroid Build Coastguard Worker     mMaxTextureSize = NULL_GPU_MAX_TEXTURE_SIZE;
36*d57664e9SAndroid Build Coastguard Worker #else
37*d57664e9SAndroid Build Coastguard Worker     mMaxTextureSize = -1;
38*d57664e9SAndroid Build Coastguard Worker #endif
39*d57664e9SAndroid Build Coastguard Worker }
40*d57664e9SAndroid Build Coastguard Worker 
updateDisplayInfo()41*d57664e9SAndroid Build Coastguard Worker void DeviceInfo::updateDisplayInfo() {
42*d57664e9SAndroid Build Coastguard Worker     if (Properties::isolatedProcess) {
43*d57664e9SAndroid Build Coastguard Worker         return;
44*d57664e9SAndroid Build Coastguard Worker     }
45*d57664e9SAndroid Build Coastguard Worker 
46*d57664e9SAndroid Build Coastguard Worker     ADisplay** displays;
47*d57664e9SAndroid Build Coastguard Worker     int size = ADisplay_acquirePhysicalDisplays(&displays);
48*d57664e9SAndroid Build Coastguard Worker 
49*d57664e9SAndroid Build Coastguard Worker     if (size <= 0) {
50*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Failed to acquire physical displays for WCG support!");
51*d57664e9SAndroid Build Coastguard Worker     }
52*d57664e9SAndroid Build Coastguard Worker 
53*d57664e9SAndroid Build Coastguard Worker     for (int i = 0; i < size; ++i) {
54*d57664e9SAndroid Build Coastguard Worker         // Pick the first internal display for querying the display type
55*d57664e9SAndroid Build Coastguard Worker         // In practice this is controlled by a sysprop so it doesn't really
56*d57664e9SAndroid Build Coastguard Worker         // matter which display we use.
57*d57664e9SAndroid Build Coastguard Worker         if (ADisplay_getDisplayType(displays[i]) == DISPLAY_TYPE_INTERNAL) {
58*d57664e9SAndroid Build Coastguard Worker             // We get the dataspace from DisplayManager already. Allocate space
59*d57664e9SAndroid Build Coastguard Worker             // for the result here but we don't actually care about using it.
60*d57664e9SAndroid Build Coastguard Worker             ADataSpace dataspace;
61*d57664e9SAndroid Build Coastguard Worker             AHardwareBuffer_Format pixelFormat;
62*d57664e9SAndroid Build Coastguard Worker             ADisplay_getPreferredWideColorFormat(displays[i], &dataspace, &pixelFormat);
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker             if (pixelFormat == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM) {
65*d57664e9SAndroid Build Coastguard Worker                 mWideColorType = SkColorType::kN32_SkColorType;
66*d57664e9SAndroid Build Coastguard Worker             } else if (pixelFormat == AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT) {
67*d57664e9SAndroid Build Coastguard Worker                 mWideColorType = SkColorType::kRGBA_F16_SkColorType;
68*d57664e9SAndroid Build Coastguard Worker             } else {
69*d57664e9SAndroid Build Coastguard Worker                 LOG_ALWAYS_FATAL("Unreachable: unsupported pixel format: %d", pixelFormat);
70*d57664e9SAndroid Build Coastguard Worker             }
71*d57664e9SAndroid Build Coastguard Worker             ADisplay_release(displays);
72*d57664e9SAndroid Build Coastguard Worker             return;
73*d57664e9SAndroid Build Coastguard Worker         }
74*d57664e9SAndroid Build Coastguard Worker     }
75*d57664e9SAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL("Failed to find a valid physical display for WCG support!");
76*d57664e9SAndroid Build Coastguard Worker }
77*d57664e9SAndroid Build Coastguard Worker 
maxTextureSize() const78*d57664e9SAndroid Build Coastguard Worker int DeviceInfo::maxTextureSize() const {
79*d57664e9SAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(mMaxTextureSize < 0, "MaxTextureSize has not been initialized yet.");
80*d57664e9SAndroid Build Coastguard Worker     return mMaxTextureSize;
81*d57664e9SAndroid Build Coastguard Worker }
82*d57664e9SAndroid Build Coastguard Worker 
setMaxTextureSize(int maxTextureSize)83*d57664e9SAndroid Build Coastguard Worker void DeviceInfo::setMaxTextureSize(int maxTextureSize) {
84*d57664e9SAndroid Build Coastguard Worker     DeviceInfo::get()->mMaxTextureSize = maxTextureSize;
85*d57664e9SAndroid Build Coastguard Worker }
86*d57664e9SAndroid Build Coastguard Worker 
setWideColorDataspace(ADataSpace dataspace)87*d57664e9SAndroid Build Coastguard Worker void DeviceInfo::setWideColorDataspace(ADataSpace dataspace) {
88*d57664e9SAndroid Build Coastguard Worker     switch (dataspace) {
89*d57664e9SAndroid Build Coastguard Worker         case ADATASPACE_DISPLAY_P3:
90*d57664e9SAndroid Build Coastguard Worker             get()->mWideColorSpace =
91*d57664e9SAndroid Build Coastguard Worker                     SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3);
92*d57664e9SAndroid Build Coastguard Worker             break;
93*d57664e9SAndroid Build Coastguard Worker         case ADATASPACE_SCRGB:
94*d57664e9SAndroid Build Coastguard Worker             get()->mWideColorSpace = SkColorSpace::MakeSRGB();
95*d57664e9SAndroid Build Coastguard Worker             break;
96*d57664e9SAndroid Build Coastguard Worker         default:
97*d57664e9SAndroid Build Coastguard Worker             ALOGW("Unknown dataspace %d", dataspace);
98*d57664e9SAndroid Build Coastguard Worker             // Treat unknown dataspaces as sRGB, so fall through
99*d57664e9SAndroid Build Coastguard Worker             [[fallthrough]];
100*d57664e9SAndroid Build Coastguard Worker         case ADATASPACE_SRGB:
101*d57664e9SAndroid Build Coastguard Worker             // when sRGB is returned, it means wide color gamut is not supported.
102*d57664e9SAndroid Build Coastguard Worker             get()->mWideColorSpace = SkColorSpace::MakeSRGB();
103*d57664e9SAndroid Build Coastguard Worker             break;
104*d57664e9SAndroid Build Coastguard Worker     }
105*d57664e9SAndroid Build Coastguard Worker }
106*d57664e9SAndroid Build Coastguard Worker 
setSupportFp16ForHdr(bool supportFp16ForHdr)107*d57664e9SAndroid Build Coastguard Worker void DeviceInfo::setSupportFp16ForHdr(bool supportFp16ForHdr) {
108*d57664e9SAndroid Build Coastguard Worker     get()->mSupportFp16ForHdr = supportFp16ForHdr;
109*d57664e9SAndroid Build Coastguard Worker }
110*d57664e9SAndroid Build Coastguard Worker 
setSupportRgba10101010ForHdr(bool supportRgba10101010ForHdr)111*d57664e9SAndroid Build Coastguard Worker void DeviceInfo::setSupportRgba10101010ForHdr(bool supportRgba10101010ForHdr) {
112*d57664e9SAndroid Build Coastguard Worker     get()->mSupportRgba10101010ForHdr = supportRgba10101010ForHdr;
113*d57664e9SAndroid Build Coastguard Worker }
114*d57664e9SAndroid Build Coastguard Worker 
setSupportMixedColorSpaces(bool supportMixedColorSpaces)115*d57664e9SAndroid Build Coastguard Worker void DeviceInfo::setSupportMixedColorSpaces(bool supportMixedColorSpaces) {
116*d57664e9SAndroid Build Coastguard Worker     get()->mSupportMixedColorSpaces = supportMixedColorSpaces;
117*d57664e9SAndroid Build Coastguard Worker }
118*d57664e9SAndroid Build Coastguard Worker 
onRefreshRateChanged(int64_t vsyncPeriod)119*d57664e9SAndroid Build Coastguard Worker void DeviceInfo::onRefreshRateChanged(int64_t vsyncPeriod) {
120*d57664e9SAndroid Build Coastguard Worker     mVsyncPeriod = vsyncPeriod;
121*d57664e9SAndroid Build Coastguard Worker }
122*d57664e9SAndroid Build Coastguard Worker 
123*d57664e9SAndroid Build Coastguard Worker std::atomic<float> DeviceInfo::sDensity = 2.0;
124*d57664e9SAndroid Build Coastguard Worker 
125*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */
126*d57664e9SAndroid Build Coastguard Worker } /* namespace android */
127