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