summaryrefslogtreecommitdiff
path: root/libs/hwui/DeviceInfo.cpp
diff options
context:
space:
mode:
author Alec Mouri <alecmouri@google.com> 2020-04-15 19:46:05 -0700
committer Alec Mouri <alecmouri@google.com> 2020-04-23 16:21:40 -0700
commite55aa630dee82e63476101f9313e5b6dbf17b952 (patch)
treeabe71a829d9be1c9c9629139b7a544488b15848c /libs/hwui/DeviceInfo.cpp
parentd5fa1dcff518772b0f72d5a8141bc8a58ff01a0c (diff)
Grab display information for render thread through java
With HWUI becoming an APEX module, we need to use public apis wherever possible - since there aren't plans to expose a stable api for physical display information through native, instead grab the system context from ActivityThread so that we can use DisplayManager's public apis. The api for retrieving the system context is left as a hidden api - a future change should stabilize the API or switch to a new api that does not yet exist. But, this is the right shape for plumbing through the display information, as the old code retrieved it through SurfaceFlinger which should not be stabilized as the source of truth for display information is DisplayManagerService. Bug: 146387012 Bug: 150880248 Test: builds, boots, verified that the correct display info is plumbed down Change-Id: I1a99a72244969bdece2903993e3beb27a6e534b1
Diffstat (limited to 'libs/hwui/DeviceInfo.cpp')
-rw-r--r--libs/hwui/DeviceInfo.cpp128
1 files changed, 58 insertions, 70 deletions
diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp
index 1c947a70f32f..1a84313d1126 100644
--- a/libs/hwui/DeviceInfo.cpp
+++ b/libs/hwui/DeviceInfo.cpp
@@ -15,6 +15,8 @@
*/
#include <DeviceInfo.h>
+#include <android/hardware_buffer.h>
+#include <apex/display.h>
#include <log/log.h>
#include <utils/Errors.h>
@@ -30,14 +32,47 @@ DeviceInfo* DeviceInfo::get() {
DeviceInfo::DeviceInfo() {
#if HWUI_NULL_GPU
- mMaxTextureSize = NULL_GPU_MAX_TEXTURE_SIZE;
+ mMaxTextureSize = NULL_GPU_MAX_TEXTURE_SIZE;
#else
- mMaxTextureSize = -1;
+ mMaxTextureSize = -1;
#endif
- updateDisplayInfo();
}
-DeviceInfo::~DeviceInfo() {
- ADisplay_release(mDisplays);
+
+void DeviceInfo::updateDisplayInfo() {
+ if (Properties::isolatedProcess) {
+ return;
+ }
+
+ ADisplay** displays;
+ int size = ADisplay_acquirePhysicalDisplays(&displays);
+
+ if (size <= 0) {
+ LOG_ALWAYS_FATAL("Failed to acquire physical displays for WCG support!");
+ }
+
+ for (int i = 0; i < size; ++i) {
+ // Pick the first internal display for querying the display type
+ // In practice this is controlled by a sysprop so it doesn't really
+ // matter which display we use.
+ if (ADisplay_getDisplayType(displays[i]) == DISPLAY_TYPE_INTERNAL) {
+ // We get the dataspace from DisplayManager already. Allocate space
+ // for the result here but we don't actually care about using it.
+ ADataSpace dataspace;
+ AHardwareBuffer_Format pixelFormat;
+ ADisplay_getPreferredWideColorFormat(displays[i], &dataspace, &pixelFormat);
+
+ if (pixelFormat == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM) {
+ mWideColorType = SkColorType::kN32_SkColorType;
+ } else if (pixelFormat == AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT) {
+ mWideColorType = SkColorType::kRGBA_F16_SkColorType;
+ } else {
+ LOG_ALWAYS_FATAL("Unreachable: unsupported pixel format: %d", pixelFormat);
+ }
+ ADisplay_release(displays);
+ return;
+ }
+ }
+ LOG_ALWAYS_FATAL("Failed to find a valid physical display for WCG support!");
}
int DeviceInfo::maxTextureSize() const {
@@ -49,73 +84,26 @@ void DeviceInfo::setMaxTextureSize(int maxTextureSize) {
DeviceInfo::get()->mMaxTextureSize = maxTextureSize;
}
-void DeviceInfo::onRefreshRateChanged(int64_t vsyncPeriod) {
- mVsyncPeriod = vsyncPeriod;
-}
-
-void DeviceInfo::updateDisplayInfo() {
- if (Properties::isolatedProcess) {
- return;
+void DeviceInfo::setWideColorDataspace(ADataSpace dataspace) {
+ switch (dataspace) {
+ case ADATASPACE_DISPLAY_P3:
+ get()->mWideColorSpace =
+ SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
+ break;
+ case ADATASPACE_SCRGB:
+ get()->mWideColorSpace = SkColorSpace::MakeSRGB();
+ break;
+ case ADATASPACE_SRGB:
+ // when sRGB is returned, it means wide color gamut is not supported.
+ get()->mWideColorSpace = SkColorSpace::MakeSRGB();
+ break;
+ default:
+ LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space.");
}
+}
- if (mCurrentConfig == nullptr) {
- mDisplaysSize = ADisplay_acquirePhysicalDisplays(&mDisplays);
- LOG_ALWAYS_FATAL_IF(mDisplays == nullptr || mDisplaysSize <= 0,
- "Failed to get physical displays: no connected display: %d!", mDisplaysSize);
- for (size_t i = 0; i < mDisplaysSize; i++) {
- ADisplayType type = ADisplay_getDisplayType(mDisplays[i]);
- if (type == ADisplayType::DISPLAY_TYPE_INTERNAL) {
- mPhysicalDisplayIndex = i;
- break;
- }
- }
- LOG_ALWAYS_FATAL_IF(mPhysicalDisplayIndex < 0, "Failed to find a connected physical display!");
-
-
- // Since we now just got the primary display for the first time, then
- // store the primary display metadata here.
- ADisplay* primaryDisplay = mDisplays[mPhysicalDisplayIndex];
- mMaxRefreshRate = ADisplay_getMaxSupportedFps(primaryDisplay);
- ADataSpace dataspace;
- AHardwareBuffer_Format format;
- ADisplay_getPreferredWideColorFormat(primaryDisplay, &dataspace, &format);
- switch (dataspace) {
- case ADATASPACE_DISPLAY_P3:
- mWideColorSpace =
- SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
- break;
- case ADATASPACE_SCRGB:
- mWideColorSpace = SkColorSpace::MakeSRGB();
- break;
- case ADATASPACE_SRGB:
- // when sRGB is returned, it means wide color gamut is not supported.
- mWideColorSpace = SkColorSpace::MakeSRGB();
- break;
- default:
- LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space.");
- }
- switch (format) {
- case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
- mWideColorType = SkColorType::kN32_SkColorType;
- break;
- case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
- mWideColorType = SkColorType::kRGBA_F16_SkColorType;
- break;
- default:
- LOG_ALWAYS_FATAL("Unreachable: unsupported pixel format.");
- }
- }
- // This method may have been called when the display config changed, so
- // sync with the current configuration.
- ADisplay* primaryDisplay = mDisplays[mPhysicalDisplayIndex];
- status_t status = ADisplay_getCurrentConfig(primaryDisplay, &mCurrentConfig);
- LOG_ALWAYS_FATAL_IF(status, "Failed to get display config, error %d", status);
-
- mWidth = ADisplayConfig_getWidth(mCurrentConfig);
- mHeight = ADisplayConfig_getHeight(mCurrentConfig);
- mVsyncPeriod = static_cast<int64_t>(1000000000 / ADisplayConfig_getFps(mCurrentConfig));
- mCompositorOffset = ADisplayConfig_getCompositorOffsetNanos(mCurrentConfig);
- mAppOffset = ADisplayConfig_getAppVsyncOffsetNanos(mCurrentConfig);
+void DeviceInfo::onRefreshRateChanged(int64_t vsyncPeriod) {
+ mVsyncPeriod = vsyncPeriod;
}
std::atomic<float> DeviceInfo::sDensity = 2.0;