• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
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   */
16  
17  #include <DeviceInfo.h>
18  #include <log/log.h>
19  #include <utils/Errors.h>
20  
21  #include "Properties.h"
22  
23  namespace android {
24  namespace uirenderer {
25  
get()26  DeviceInfo* DeviceInfo::get() {
27      static DeviceInfo sDeviceInfo;
28      return &sDeviceInfo;
29  }
30  
DeviceInfo()31  DeviceInfo::DeviceInfo() {
32  #if HWUI_NULL_GPU
33          mMaxTextureSize = NULL_GPU_MAX_TEXTURE_SIZE;
34  #else
35          mMaxTextureSize = -1;
36  #endif
37          updateDisplayInfo();
38  }
~DeviceInfo()39  DeviceInfo::~DeviceInfo() {
40      ADisplay_release(mDisplays);
41  }
42  
maxTextureSize() const43  int DeviceInfo::maxTextureSize() const {
44      LOG_ALWAYS_FATAL_IF(mMaxTextureSize < 0, "MaxTextureSize has not been initialized yet.");
45      return mMaxTextureSize;
46  }
47  
setMaxTextureSize(int maxTextureSize)48  void DeviceInfo::setMaxTextureSize(int maxTextureSize) {
49      DeviceInfo::get()->mMaxTextureSize = maxTextureSize;
50  }
51  
onRefreshRateChanged(int64_t vsyncPeriod)52  void DeviceInfo::onRefreshRateChanged(int64_t vsyncPeriod) {
53      mVsyncPeriod = vsyncPeriod;
54  }
55  
updateDisplayInfo()56  void DeviceInfo::updateDisplayInfo() {
57      if (Properties::isolatedProcess) {
58          return;
59      }
60  
61      if (mCurrentConfig == nullptr) {
62          mDisplaysSize = ADisplay_acquirePhysicalDisplays(&mDisplays);
63          LOG_ALWAYS_FATAL_IF(mDisplays == nullptr || mDisplaysSize <= 0,
64                              "Failed to get physical displays: no connected display: %d!", mDisplaysSize);
65          for (size_t i = 0; i < mDisplaysSize; i++) {
66              ADisplayType type = ADisplay_getDisplayType(mDisplays[i]);
67              if (type == ADisplayType::DISPLAY_TYPE_INTERNAL) {
68                  mPhysicalDisplayIndex = i;
69                  break;
70              }
71          }
72          LOG_ALWAYS_FATAL_IF(mPhysicalDisplayIndex < 0, "Failed to find a connected physical display!");
73  
74  
75          // Since we now just got the primary display for the first time, then
76          // store the primary display metadata here.
77          ADisplay* primaryDisplay = mDisplays[mPhysicalDisplayIndex];
78          mMaxRefreshRate = ADisplay_getMaxSupportedFps(primaryDisplay);
79          ADataSpace dataspace;
80          AHardwareBuffer_Format format;
81          ADisplay_getPreferredWideColorFormat(primaryDisplay, &dataspace, &format);
82          switch (dataspace) {
83              case ADATASPACE_DISPLAY_P3:
84                  mWideColorSpace =
85                          SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
86                  break;
87              case ADATASPACE_SCRGB:
88                  mWideColorSpace = SkColorSpace::MakeSRGB();
89                  break;
90              case ADATASPACE_SRGB:
91                  // when sRGB is returned, it means wide color gamut is not supported.
92                  mWideColorSpace = SkColorSpace::MakeSRGB();
93                  break;
94              default:
95                  LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space.");
96          }
97          switch (format) {
98              case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
99                  mWideColorType = SkColorType::kN32_SkColorType;
100                  break;
101              case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
102                  mWideColorType = SkColorType::kRGBA_F16_SkColorType;
103                  break;
104              default:
105                  LOG_ALWAYS_FATAL("Unreachable: unsupported pixel format.");
106          }
107      }
108      // This method may have been called when the display config changed, so
109      // sync with the current configuration.
110      ADisplay* primaryDisplay = mDisplays[mPhysicalDisplayIndex];
111      status_t status = ADisplay_getCurrentConfig(primaryDisplay, &mCurrentConfig);
112      LOG_ALWAYS_FATAL_IF(status, "Failed to get display config, error %d", status);
113  
114      mWidth = ADisplayConfig_getWidth(mCurrentConfig);
115      mHeight = ADisplayConfig_getHeight(mCurrentConfig);
116      mDensity = ADisplayConfig_getDensity(mCurrentConfig);
117      mVsyncPeriod = static_cast<int64_t>(1000000000 / ADisplayConfig_getFps(mCurrentConfig));
118      mCompositorOffset = ADisplayConfig_getCompositorOffsetNanos(mCurrentConfig);
119      mAppOffset = ADisplayConfig_getAppVsyncOffsetNanos(mCurrentConfig);
120  }
121  
122  } /* namespace uirenderer */
123  } /* namespace android */
124