diff options
author | 2019-11-21 11:14:45 -0800 | |
---|---|---|
committer | 2020-01-29 13:59:26 -0800 | |
commit | 3cb3d4e3906eb43a01464e8862772295dab50f78 (patch) | |
tree | bcdf7a4b117cfa538d339c2d806c7e66178f6e1f | |
parent | 68d6b2f5a5cd7c749203519fbfd3ae796875657a (diff) |
SF: Redesign API to query display information
The DisplayInfo list returned by ISurfaceComposer for display configs
contains display information/state redundant across configs.
Extract config information to DisplayConfig, and repurpose DisplayInfo
for immutable information about a physical display. In a future CL, SF
will populate DisplayInfo with additional data (e.g. connection type,
EDID fields) on initial connection. DisplayConfigs retain the ability
to reload on subsequent connections. Introduce ui::DisplayState for
transactional state applicable to both physical and virtual displays.
Bug: 144601064
Test: dumpsys display
Change-Id: I72003e8ef71483ef483d0de85d28b859a6c9f5fc
29 files changed, 607 insertions, 475 deletions
diff --git a/cmds/flatland/GLHelper.cpp b/cmds/flatland/GLHelper.cpp index d398559ee8..3a3df08534 100644 --- a/cmds/flatland/GLHelper.cpp +++ b/cmds/flatland/GLHelper.cpp @@ -14,15 +14,14 @@ * limitations under the License. */ +#include "GLHelper.h" + #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> - -#include <ui/DisplayInfo.h> #include <gui/SurfaceComposerClient.h> +#include <ui/DisplayConfig.h> -#include "GLHelper.h" - - namespace android { +namespace android { GLHelper::GLHelper() : mDisplay(EGL_NO_DISPLAY), @@ -228,15 +227,15 @@ bool GLHelper::computeWindowScale(uint32_t w, uint32_t h, float* scale) { return false; } - DisplayInfo info; - status_t err = mSurfaceComposerClient->getDisplayInfo(dpy, &info); + DisplayConfig config; + status_t err = mSurfaceComposerClient->getActiveDisplayConfig(dpy, &config); if (err != NO_ERROR) { - fprintf(stderr, "SurfaceComposer::getDisplayInfo failed: %#x\n", err); + fprintf(stderr, "SurfaceComposer::getActiveDisplayConfig failed: %#x\n", err); return false; } - float scaleX = float(info.w) / float(w); - float scaleY = float(info.h) / float(h); + float scaleX = static_cast<float>(config.resolution.getWidth()) / w; + float scaleY = static_cast<float>(config.resolution.getHeight()) / h; *scale = scaleX < scaleY ? scaleX : scaleY; return true; diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index 073543cbf3..2f27fd20fd 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -34,8 +34,10 @@ #include <system/graphics.h> +#include <ui/DisplayConfig.h> #include <ui/DisplayInfo.h> #include <ui/DisplayStatInfo.h> +#include <ui/DisplayState.h> #include <ui/HdrCapabilities.h> #include <utils/Log.h> @@ -351,22 +353,43 @@ public: remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply); } - virtual status_t getDisplayConfigs(const sp<IBinder>& display, - Vector<DisplayInfo>* configs) - { + virtual status_t getDisplayState(const sp<IBinder>& display, ui::DisplayState* state) { + Parcel data, reply; + data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); + data.writeStrongBinder(display); + remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATE, data, &reply); + const status_t result = reply.readInt32(); + if (result == NO_ERROR) { + memcpy(state, reply.readInplace(sizeof(ui::DisplayState)), sizeof(ui::DisplayState)); + } + return result; + } + + virtual status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info) { + Parcel data, reply; + data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); + data.writeStrongBinder(display); + remote()->transact(BnSurfaceComposer::GET_DISPLAY_INFO, data, &reply); + const status_t result = reply.readInt32(); + if (result == NO_ERROR) { + memcpy(info, reply.readInplace(sizeof(DisplayInfo)), sizeof(DisplayInfo)); + } + return result; + } + + virtual status_t getDisplayConfigs(const sp<IBinder>& display, Vector<DisplayConfig>* configs) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeStrongBinder(display); remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply); - status_t result = reply.readInt32(); + const status_t result = reply.readInt32(); if (result == NO_ERROR) { - size_t numConfigs = reply.readUint32(); + const size_t numConfigs = reply.readUint32(); configs->clear(); configs->resize(numConfigs); for (size_t c = 0; c < numConfigs; ++c) { - memcpy(&(configs->editItemAt(c)), - reply.readInplace(sizeof(DisplayInfo)), - sizeof(DisplayInfo)); + memcpy(&(configs->editItemAt(c)), reply.readInplace(sizeof(DisplayConfig)), + sizeof(DisplayConfig)); } } return result; @@ -1297,17 +1320,40 @@ status_t BnSurfaceComposer::onTransact( reply->writeStrongBinder(display); return NO_ERROR; } + case GET_DISPLAY_STATE: { + CHECK_INTERFACE(ISurfaceComposer, data, reply); + ui::DisplayState state; + const sp<IBinder> display = data.readStrongBinder(); + const status_t result = getDisplayState(display, &state); + reply->writeInt32(result); + if (result == NO_ERROR) { + memcpy(reply->writeInplace(sizeof(ui::DisplayState)), &state, + sizeof(ui::DisplayState)); + } + return NO_ERROR; + } + case GET_DISPLAY_INFO: { + CHECK_INTERFACE(ISurfaceComposer, data, reply); + DisplayInfo info; + const sp<IBinder> display = data.readStrongBinder(); + const status_t result = getDisplayInfo(display, &info); + reply->writeInt32(result); + if (result == NO_ERROR) { + memcpy(reply->writeInplace(sizeof(DisplayInfo)), &info, sizeof(DisplayInfo)); + } + return NO_ERROR; + } case GET_DISPLAY_CONFIGS: { CHECK_INTERFACE(ISurfaceComposer, data, reply); - Vector<DisplayInfo> configs; - sp<IBinder> display = data.readStrongBinder(); - status_t result = getDisplayConfigs(display, &configs); + Vector<DisplayConfig> configs; + const sp<IBinder> display = data.readStrongBinder(); + const status_t result = getDisplayConfigs(display, &configs); reply->writeInt32(result); if (result == NO_ERROR) { reply->writeUint32(static_cast<uint32_t>(configs.size())); for (size_t c = 0; c < configs.size(); ++c) { - memcpy(reply->writeInplace(sizeof(DisplayInfo)), - &configs[c], sizeof(DisplayInfo)); + memcpy(reply->writeInplace(sizeof(DisplayConfig)), &configs[c], + sizeof(DisplayConfig)); } } return NO_ERROR; diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 63dc33376d..43bccf6c04 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -31,8 +31,6 @@ #include <system/graphics.h> -#include <ui/DisplayInfo.h> - #include <gui/BufferItemConsumer.h> #include <gui/CpuConsumer.h> #include <gui/IGraphicBufferProducer.h> @@ -41,6 +39,7 @@ #include <gui/LayerState.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> +#include <ui/DisplayConfig.h> #ifndef NO_INPUT #include <input/InputWindow.h> @@ -1623,15 +1622,23 @@ status_t SurfaceComposerClient::injectVSync(nsecs_t when) { return sf->injectVSync(when); } -status_t SurfaceComposerClient::getDisplayConfigs( - const sp<IBinder>& display, Vector<DisplayInfo>* configs) -{ +status_t SurfaceComposerClient::getDisplayState(const sp<IBinder>& display, + ui::DisplayState* state) { + return ComposerService::getComposerService()->getDisplayState(display, state); +} + +status_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info) { + return ComposerService::getComposerService()->getDisplayInfo(display, info); +} + +status_t SurfaceComposerClient::getDisplayConfigs(const sp<IBinder>& display, + Vector<DisplayConfig>* configs) { return ComposerService::getComposerService()->getDisplayConfigs(display, configs); } -status_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display, - DisplayInfo* info) { - Vector<DisplayInfo> configs; +status_t SurfaceComposerClient::getActiveDisplayConfig(const sp<IBinder>& display, + DisplayConfig* config) { + Vector<DisplayConfig> configs; status_t result = getDisplayConfigs(display, &configs); if (result != NO_ERROR) { return result; @@ -1643,7 +1650,7 @@ status_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display, return NAME_NOT_FOUND; } - *info = configs[static_cast<size_t>(activeId)]; + *config = configs[static_cast<size_t>(activeId)]; return NO_ERROR; } diff --git a/libs/gui/include/gui/ISurfaceComposer.h b/libs/gui/include/gui/ISurfaceComposer.h index 46c9f3ad25..e860f61c22 100644 --- a/libs/gui/include/gui/ISurfaceComposer.h +++ b/libs/gui/include/gui/ISurfaceComposer.h @@ -14,8 +14,7 @@ * limitations under the License. */ -#ifndef ANDROID_GUI_ISURFACE_COMPOSER_H -#define ANDROID_GUI_ISURFACE_COMPOSER_H +#pragma once #include <stdint.h> #include <sys/types.h> @@ -46,13 +45,13 @@ #include <vector> namespace android { -// ---------------------------------------------------------------------------- struct client_cache_t; struct ComposerState; -struct DisplayState; +struct DisplayConfig; struct DisplayInfo; struct DisplayStatInfo; +struct DisplayState; struct InputWindowCommands; class LayerDebugInfo; class HdrCapabilities; @@ -63,6 +62,12 @@ class IRegionSamplingListener; class Rect; enum class FrameEvent; +namespace ui { + +struct DisplayState; + +} // namespace ui + /* * This class defines the Binder IPC interface for accessing various * SurfaceFlinger features. @@ -161,10 +166,6 @@ public: */ virtual void setPowerMode(const sp<IBinder>& display, int mode) = 0; - /* returns information for each configuration of the given display - * intended to be used to get information about built-in displays */ - virtual status_t getDisplayConfigs(const sp<IBinder>& display, - Vector<DisplayInfo>* configs) = 0; /* returns display statistics for a given display * intended to be used by the media framework to properly schedule @@ -172,8 +173,25 @@ public: virtual status_t getDisplayStats(const sp<IBinder>& display, DisplayStatInfo* stats) = 0; - /* indicates which of the configurations returned by getDisplayInfo is - * currently active */ + /** + * Get transactional state of given display. + */ + virtual status_t getDisplayState(const sp<IBinder>& display, ui::DisplayState*) = 0; + + /** + * Get immutable information about given physical display. + */ + virtual status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo*) = 0; + + /** + * Get configurations supported by given physical display. + */ + virtual status_t getDisplayConfigs(const sp<IBinder>& display, Vector<DisplayConfig>*) = 0; + + /** + * Get the index into configurations returned by getDisplayConfigs, + * corresponding to the active configuration. + */ virtual int getActiveConfig(const sp<IBinder>& display) = 0; virtual status_t getDisplayColorModes(const sp<IBinder>& display, @@ -493,7 +511,7 @@ public: // Java by ActivityManagerService. BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION, CREATE_CONNECTION, - CREATE_GRAPHIC_BUFFER_ALLOC_UNUSED, // unused, fails permissions check + GET_DISPLAY_INFO, CREATE_DISPLAY_EVENT_CONNECTION, CREATE_DISPLAY, DESTROY_DISPLAY, @@ -503,7 +521,7 @@ public: GET_SUPPORTED_FRAME_TIMESTAMPS, GET_DISPLAY_CONFIGS, GET_ACTIVE_CONFIG, - CONNECT_DISPLAY_UNUSED, // unused, fails permissions check + GET_DISPLAY_STATE, CAPTURE_SCREEN, CAPTURE_LAYERS, CLEAR_ANIMATION_FRAME_STATS, @@ -546,8 +564,4 @@ public: Parcel* reply, uint32_t flags = 0); }; -// ---------------------------------------------------------------------------- - -}; // namespace android - -#endif // ANDROID_GUI_ISURFACE_COMPOSER_H +} // namespace android diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 08e6a5a462..6eec2b7a91 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -14,8 +14,7 @@ * limitations under the License. */ -#ifndef ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H -#define ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H +#pragma once #include <stdint.h> #include <sys/types.h> @@ -46,17 +45,12 @@ namespace android { -// --------------------------------------------------------------------------- - -struct DisplayInfo; class HdrCapabilities; class ISurfaceComposerClient; class IGraphicBufferProducer; class IRegionSamplingListener; class Region; -// --------------------------------------------------------------------------- - struct SurfaceControlStats { SurfaceControlStats(const sp<SurfaceControl>& sc, nsecs_t time, const sp<Fence>& prevReleaseFence, uint32_t hint) @@ -102,18 +96,21 @@ public: status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient, void* cookie = nullptr, uint32_t flags = 0); - // Get a list of supported configurations for a given display - static status_t getDisplayConfigs(const sp<IBinder>& display, - Vector<DisplayInfo>* configs); + // Get transactional state of given display. + static status_t getDisplayState(const sp<IBinder>& display, ui::DisplayState*); + + // Get immutable information about given physical display. + static status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo*); - // Get the DisplayInfo for the currently-active configuration - static status_t getDisplayInfo(const sp<IBinder>& display, - DisplayInfo* info); + // Get configurations supported by given physical display. + static status_t getDisplayConfigs(const sp<IBinder>& display, Vector<DisplayConfig>*); - // Get the index of the current active configuration (relative to the list - // returned by getDisplayInfo) + // Get the ID of the active DisplayConfig, as getDisplayConfigs index. static int getActiveConfig(const sp<IBinder>& display); + // Shorthand for getDisplayConfigs element at getActiveConfig index. + static status_t getActiveDisplayConfig(const sp<IBinder>& display, DisplayConfig*); + // Sets the refresh rate boundaries for display configuration. // For all other parameters, default configuration is used. The index for the default is // corresponting to the configs returned from getDisplayConfigs(). @@ -644,8 +641,4 @@ public: void onTransactionCompleted(ListenerStats stats) override; }; -// --------------------------------------------------------------------------- - -}; // namespace android - -#endif // ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H +} // namespace android diff --git a/libs/gui/tests/BLASTBufferQueue_test.cpp b/libs/gui/tests/BLASTBufferQueue_test.cpp index 41f0d40add..a273914caf 100644 --- a/libs/gui/tests/BLASTBufferQueue_test.cpp +++ b/libs/gui/tests/BLASTBufferQueue_test.cpp @@ -25,7 +25,7 @@ #include <gui/IProducerListener.h> #include <gui/SurfaceComposerClient.h> #include <private/gui/ComposerService.h> -#include <ui/DisplayInfo.h> +#include <ui/DisplayConfig.h> #include <ui/GraphicBuffer.h> #include <ui/GraphicTypes.h> #include <ui/Transform.h> @@ -103,10 +103,11 @@ protected: t.apply(); t.clear(); - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplayToken, &info)); - mDisplayWidth = info.w; - mDisplayHeight = info.h; + DisplayConfig config; + ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(mDisplayToken, &config)); + const ui::Size& resolution = config.resolution; + mDisplayWidth = resolution.getWidth(); + mDisplayHeight = resolution.getHeight(); mSurfaceControl = mClient->createSurface(String8("TestSurface"), mDisplayWidth, mDisplayHeight, PIXEL_FORMAT_RGBA_8888, @@ -114,7 +115,7 @@ protected: /*parent*/ nullptr); t.setLayerStack(mSurfaceControl, 0) .setLayer(mSurfaceControl, std::numeric_limits<int32_t>::max()) - .setFrame(mSurfaceControl, Rect(0, 0, mDisplayWidth, mDisplayHeight)) + .setFrame(mSurfaceControl, Rect(resolution)) .show(mSurfaceControl) .setDataspace(mSurfaceControl, ui::Dataspace::V0_SRGB) .apply(); diff --git a/libs/gui/tests/EndToEndNativeInputTest.cpp b/libs/gui/tests/EndToEndNativeInputTest.cpp index 04749e6d13..1a623e21dc 100644 --- a/libs/gui/tests/EndToEndNativeInputTest.cpp +++ b/libs/gui/tests/EndToEndNativeInputTest.cpp @@ -41,7 +41,7 @@ #include <input/InputTransport.h> #include <input/Input.h> -#include <ui/DisplayInfo.h> +#include <ui/DisplayConfig.h> #include <ui/Rect.h> #include <ui/Region.h> @@ -223,13 +223,13 @@ public: const auto display = mComposerClient->getInternalDisplayToken(); ASSERT_NE(display, nullptr); - DisplayInfo info; - ASSERT_EQ(NO_ERROR, mComposerClient->getDisplayInfo(display, &info)); + DisplayConfig config; + ASSERT_EQ(NO_ERROR, mComposerClient->getActiveDisplayConfig(display, &config)); // After a new buffer is queued, SurfaceFlinger is notified and will // latch the new buffer on next vsync. Let's heuristically wait for 3 // vsyncs. - mBufferPostDelay = int32_t(1e6 / info.fps) * 3; + mBufferPostDelay = static_cast<int32_t>(1e6 / config.refreshRate) * 3; } void TearDown() { diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index 25c032ff08..70fd888aaf 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -718,8 +718,15 @@ public: } void setPowerMode(const sp<IBinder>& /*display*/, int /*mode*/) override {} - status_t getDisplayConfigs(const sp<IBinder>& /*display*/, - Vector<DisplayInfo>* /*configs*/) override { return NO_ERROR; } + status_t getDisplayInfo(const sp<IBinder>& /*display*/, DisplayInfo*) override { + return NO_ERROR; + } + status_t getDisplayConfigs(const sp<IBinder>& /*display*/, Vector<DisplayConfig>*) override { + return NO_ERROR; + } + status_t getDisplayState(const sp<IBinder>& /*display*/, ui::DisplayState*) override { + return NO_ERROR; + } status_t getDisplayStats(const sp<IBinder>& /*display*/, DisplayStatInfo* /*stats*/) override { return NO_ERROR; } int getActiveConfig(const sp<IBinder>& /*display*/) override { return 0; } diff --git a/libs/nativedisplay/ADisplay.cpp b/libs/nativedisplay/ADisplay.cpp index 1e25049eb6..277635cd34 100644 --- a/libs/nativedisplay/ADisplay.cpp +++ b/libs/nativedisplay/ADisplay.cpp @@ -16,6 +16,7 @@ #include <apex/display.h> #include <gui/SurfaceComposerClient.h> +#include <ui/DisplayConfig.h> #include <ui/DisplayInfo.h> #include <ui/GraphicTypes.h> #include <ui/PixelFormat.h> @@ -116,17 +117,12 @@ using namespace android::display::impl; LOG_ALWAYS_FATAL_IF(name == nullptr, "nullptr passed as " #name " argument"); namespace { + sp<IBinder> getToken(ADisplay* display) { DisplayImpl* impl = reinterpret_cast<DisplayImpl*>(display); return SurfaceComposerClient::getPhysicalDisplayToken(impl->id); } -int64_t computeSfOffset(const DisplayInfo& info) { - // This should probably be part of the config instead of extrapolated from - // the presentation deadline and fudged here, but the way the math works out - // here we do get the right offset. - return static_cast<int64_t>((1000000000 / info.fps) - info.presentationDeadline + 1000000); -} } // namespace namespace android { @@ -142,9 +138,16 @@ int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) { int numConfigs = 0; for (int i = 0; i < size; ++i) { const sp<IBinder> token = SurfaceComposerClient::getPhysicalDisplayToken(ids[i]); - Vector<DisplayInfo> configs; - const status_t status = SurfaceComposerClient::getDisplayConfigs(token, &configs); - if (status != OK) { + + DisplayInfo info; + if (const status_t status = SurfaceComposerClient::getDisplayInfo(token, &info); + status != OK) { + return status; + } + + Vector<DisplayConfig> configs; + if (const status_t status = SurfaceComposerClient::getDisplayConfigs(token, &configs); + status != OK) { return status; } if (configs.empty()) { @@ -154,11 +157,11 @@ int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) { numConfigs += configs.size(); configsPerDisplay[i].reserve(configs.size()); for (int j = 0; j < configs.size(); ++j) { - const DisplayInfo config = configs[j]; + const DisplayConfig& config = configs[j]; configsPerDisplay[i].emplace_back( - DisplayConfigImpl{static_cast<int32_t>(config.w), - static_cast<int32_t>(config.h), config.density, config.fps, - computeSfOffset(config), config.appVsyncOffset}); + DisplayConfigImpl{config.resolution.getWidth(), config.resolution.getHeight(), + info.density, config.refreshRate, config.sfVsyncOffset, + config.appVsyncOffset}); } } diff --git a/libs/ui/include/ui/DisplayConfig.h b/libs/ui/include/ui/DisplayConfig.h new file mode 100644 index 0000000000..09b8211a9d --- /dev/null +++ b/libs/ui/include/ui/DisplayConfig.h @@ -0,0 +1,40 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <type_traits> + +#include <ui/Size.h> +#include <utils/Timers.h> + +namespace android { + +// Configuration supported by physical display. +struct DisplayConfig { + ui::Size resolution; + float xDpi = 0; + float yDpi = 0; + + float refreshRate = 0; + nsecs_t appVsyncOffset = 0; + nsecs_t sfVsyncOffset = 0; + nsecs_t presentationDeadline = 0; +}; + +static_assert(std::is_trivially_copyable_v<DisplayConfig>); + +} // namespace android diff --git a/libs/ui/include/ui/DisplayInfo.h b/libs/ui/include/ui/DisplayInfo.h index 38f8d6be02..7773319b84 100644 --- a/libs/ui/include/ui/DisplayInfo.h +++ b/libs/ui/include/ui/DisplayInfo.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 The Android Open Source Project + * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,35 +14,18 @@ * limitations under the License. */ -#ifndef ANDROID_UI_DISPLAY_INFO_H -#define ANDROID_UI_DISPLAY_INFO_H +#pragma once -#include <stdint.h> -#include <sys/types.h> - -#include <ui/Rotation.h> -#include <utils/Timers.h> +#include <type_traits> namespace android { -constexpr uint32_t NO_LAYER_STACK = static_cast<uint32_t>(-1); - +// Immutable information about physical display. struct DisplayInfo { - uint32_t w{0}; - uint32_t h{0}; - float xdpi{0}; - float ydpi{0}; - float fps{0}; - float density{0}; - ui::Rotation orientation{ui::ROTATION_0}; - bool secure{false}; - nsecs_t appVsyncOffset{0}; - nsecs_t presentationDeadline{0}; - uint32_t viewportW{0}; - uint32_t viewportH{0}; - uint32_t layerStack{NO_LAYER_STACK}; + float density = 0.f; + bool secure = false; }; -} // namespace android +static_assert(std::is_trivially_copyable_v<DisplayInfo>); -#endif // ANDROID_COMPOSER_DISPLAY_INFO_H +} // namespace android diff --git a/libs/ui/include/ui/DisplayState.h b/libs/ui/include/ui/DisplayState.h new file mode 100644 index 0000000000..64efc84f1b --- /dev/null +++ b/libs/ui/include/ui/DisplayState.h @@ -0,0 +1,40 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <ui/Rotation.h> +#include <ui/Size.h> + +#include <cstdint> +#include <type_traits> + +namespace android::ui { + +using LayerStack = uint32_t; +constexpr LayerStack NO_LAYER_STACK = static_cast<LayerStack>(-1); + +// Transactional state of physical or virtual display. Note that libgui defines +// android::DisplayState as a superset of android::ui::DisplayState. +struct DisplayState { + LayerStack layerStack = NO_LAYER_STACK; + Rotation orientation = ROTATION_0; + Size viewport; +}; + +static_assert(std::is_trivially_copyable_v<DisplayState>); + +} // namespace android::ui diff --git a/libs/ui/include_vndk/ui/DisplayConfig.h b/libs/ui/include_vndk/ui/DisplayConfig.h new file mode 120000 index 0000000000..1450319502 --- /dev/null +++ b/libs/ui/include_vndk/ui/DisplayConfig.h @@ -0,0 +1 @@ +../../include/ui/DisplayConfig.h
\ No newline at end of file diff --git a/libs/ui/include_vndk/ui/DisplayState.h b/libs/ui/include_vndk/ui/DisplayState.h new file mode 120000 index 0000000000..4e9284925d --- /dev/null +++ b/libs/ui/include_vndk/ui/DisplayState.h @@ -0,0 +1 @@ +../../include/ui/DisplayState.h
\ No newline at end of file diff --git a/opengl/tests/lib/WindowSurface.cpp b/opengl/tests/lib/WindowSurface.cpp index 4dcc1ca4db..dfb9c92b5f 100644 --- a/opengl/tests/lib/WindowSurface.cpp +++ b/opengl/tests/lib/WindowSurface.cpp @@ -16,10 +16,13 @@ #include <WindowSurface.h> -#include <gui/SurfaceComposerClient.h> +#include <utility> + #include <gui/ISurfaceComposer.h> #include <gui/Surface.h> -#include <ui/DisplayInfo.h> +#include <gui/SurfaceComposerClient.h> +#include <ui/DisplayConfig.h> +#include <ui/DisplayState.h> using namespace android; @@ -33,28 +36,33 @@ WindowSurface::WindowSurface() { return; } - // Get main display parameters. - const auto mainDpy = SurfaceComposerClient::getInternalDisplayToken(); - if (mainDpy == nullptr) { + const auto displayToken = SurfaceComposerClient::getInternalDisplayToken(); + if (displayToken == nullptr) { fprintf(stderr, "ERROR: no display\n"); return; } - DisplayInfo mainDpyInfo; - err = SurfaceComposerClient::getDisplayInfo(mainDpy, &mainDpyInfo); + DisplayConfig displayConfig; + err = SurfaceComposerClient::getActiveDisplayConfig(displayToken, &displayConfig); + if (err != NO_ERROR) { + fprintf(stderr, "ERROR: unable to get active display config\n"); + return; + } + + ui::DisplayState displayState; + err = SurfaceComposerClient::getDisplayState(displayToken, &displayState); if (err != NO_ERROR) { - fprintf(stderr, "ERROR: unable to get display characteristics\n"); + fprintf(stderr, "ERROR: unable to get display state\n"); return; } - uint32_t width, height; - if (mainDpyInfo.orientation != ui::ROTATION_0 && mainDpyInfo.orientation != ui::ROTATION_180) { - // rotated - width = mainDpyInfo.h; - height = mainDpyInfo.w; - } else { - width = mainDpyInfo.w; - height = mainDpyInfo.h; + const ui::Size& resolution = displayConfig.resolution; + auto width = resolution.getWidth(); + auto height = resolution.getHeight(); + + if (displayState.orientation == ui::ROTATION_90 || + displayState.orientation == ui::ROTATION_270) { + std::swap(width, height); } sp<SurfaceControl> sc = surfaceComposerClient->createSurface( diff --git a/services/automotive/display/CarWindowService.cpp b/services/automotive/display/CarWindowService.cpp index e95c9e1673..fbefef0d16 100644 --- a/services/automotive/display/CarWindowService.cpp +++ b/services/automotive/display/CarWindowService.cpp @@ -13,8 +13,12 @@ // See the License for the specific language governing permissions and // limitations under the License. // -#include <ui/DisplayInfo.h> + +#include <utility> + #include <gui/bufferqueue/2.0/B2HGraphicBufferProducer.h> +#include <ui/DisplayConfig.h> +#include <ui/DisplayState.h> #include "CarWindowService.h" @@ -38,31 +42,37 @@ Return<sp<IGraphicBufferProducer>> return nullptr; } - // Get main display parameters. - sp<IBinder> mainDpy = SurfaceComposerClient::getInternalDisplayToken(); - if (mainDpy == nullptr) { + const auto displayToken = SurfaceComposerClient::getInternalDisplayToken(); + if (displayToken == nullptr) { ALOGE("Failed to get internal display "); return nullptr; } - DisplayInfo mainDpyInfo; - err = SurfaceComposerClient::getDisplayInfo(mainDpy, &mainDpyInfo); + + DisplayConfig displayConfig; + err = SurfaceComposerClient::getActiveDisplayConfig(displayToken, &displayConfig); if (err != NO_ERROR) { - ALOGE("Failed to get display characteristics"); + ALOGE("Failed to get active display config"); return nullptr; } - unsigned int mWidth, mHeight; - if (mainDpyInfo.orientation != ui::ROTATION_0 && - mainDpyInfo.orientation != ui::ROTATION_180) { - // rotated - mWidth = mainDpyInfo.h; - mHeight = mainDpyInfo.w; - } else { - mWidth = mainDpyInfo.w; - mHeight = mainDpyInfo.h; + + ui::DisplayState displayState; + err = SurfaceComposerClient::getDisplayState(displayToken, &displayState); + if (err != NO_ERROR) { + ALOGE("Failed to get display state"); + return nullptr; + } + + const ui::Size& resolution = displayConfig.resolution; + auto width = resolution.getWidth(); + auto height = resolution.getHeight(); + + if (displayState.orientation == ui::ROTATION_90 || + displayState.orientation == ui::ROTATION_270) { + std::swap(width, height); } mSurfaceControl = mSurfaceComposerClient->createSurface( - String8("Automotive Display"), mWidth, mHeight, + String8("Automotive Display"), width, height, PIXEL_FORMAT_RGBX_8888, ISurfaceComposerClient::eOpaque); if (mSurfaceControl == nullptr || !mSurfaceControl->isValid()) { ALOGE("Failed to create SurfaceControl"); diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 4ae6dadfe8..4e0191d2ed 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -146,12 +146,12 @@ ui::Dataspace DisplayDevice::getCompositionDataSpace() const { return mCompositionDisplay->getState().dataspace; } -void DisplayDevice::setLayerStack(uint32_t stack) { +void DisplayDevice::setLayerStack(ui::LayerStack stack) { mCompositionDisplay->setLayerStackFilter(stack, isPrimary()); } -void DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { - mCompositionDisplay->setBounds(ui::Size(newWidth, newHeight)); +void DisplayDevice::setDisplaySize(int width, int height) { + mCompositionDisplay->setBounds(ui::Size(width, height)); } void DisplayDevice::setProjection(ui::Rotation orientation, Rect viewport, Rect frame) { @@ -286,7 +286,7 @@ bool DisplayDevice::needsFiltering() const { return mCompositionDisplay->getState().needsFiltering; } -uint32_t DisplayDevice::getLayerStack() const { +ui::LayerStack DisplayDevice::getLayerStack() const { return mCompositionDisplay->getState().layerStackId; } diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index ff48ecdedc..fa38dd70cb 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -16,8 +16,6 @@ #pragma once -#include <stdlib.h> - #include <memory> #include <optional> #include <string> @@ -30,7 +28,7 @@ #include <math/mat4.h> #include <renderengine/RenderEngine.h> #include <system/window.h> -#include <ui/DisplayInfo.h> +#include <ui/DisplayState.h> #include <ui/GraphicTypes.h> #include <ui/HdrCapabilities.h> #include <ui/Region.h> @@ -80,12 +78,12 @@ public: // secure surfaces. bool isSecure() const; - int getWidth() const; - int getHeight() const; - - void setLayerStack(uint32_t stack); - void setDisplaySize(const int newWidth, const int newHeight); + int getWidth() const; + int getHeight() const; + ui::Size getSize() const { return {getWidth(), getHeight()}; } + void setLayerStack(ui::LayerStack); + void setDisplaySize(int width, int height); void setProjection(ui::Rotation orientation, Rect viewport, Rect frame); ui::Rotation getPhysicalOrientation() const { return mPhysicalOrientation; } @@ -98,7 +96,7 @@ public: const Rect& getFrame() const; const Rect& getScissor() const; bool needsFiltering() const; - uint32_t getLayerStack() const; + ui::LayerStack getLayerStack() const; const std::optional<DisplayId>& getId() const; const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } @@ -185,7 +183,7 @@ struct DisplayDeviceState { int32_t sequenceId = sNextSequenceId++; std::optional<DisplayId> displayId; sp<IGraphicBufferProducer> surface; - uint32_t layerStack = NO_LAYER_STACK; + ui::LayerStack layerStack = ui::NO_LAYER_STACK; Rect viewport; Rect frame; ui::Rotation orientation = ui::ROTATION_0; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 62d47e1d6e..c1d86e885b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -61,8 +61,10 @@ #include <renderengine/RenderEngine.h> #include <ui/ColorSpace.h> #include <ui/DebugUtils.h> +#include <ui/DisplayConfig.h> #include <ui/DisplayInfo.h> #include <ui/DisplayStatInfo.h> +#include <ui/DisplayState.h> #include <ui/GraphicBufferAllocator.h> #include <ui/PixelFormat.h> #include <ui/UiConfig.h> @@ -115,6 +117,7 @@ #include "android-base/parseint.h" #include "android-base/stringprintf.h" +#include <android/configuration.h> #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> #include <android/hardware/configstore/1.1/ISurfaceFlingerConfigs.h> #include <android/hardware/configstore/1.1/types.h> @@ -182,6 +185,19 @@ private: bool mLocked; }; +// TODO(b/141333600): Consolidate with HWC2::Display::Config::Builder::getDefaultDensity. +constexpr float FALLBACK_DENSITY = ACONFIGURATION_DENSITY_TV / 160.f; + +float getDensityFromProperty(const char* property, bool required) { + char value[PROPERTY_VALUE_MAX]; + const float density = property_get(property, value, nullptr) > 0 ? std::atof(value) : 0.f; + if (!density && required) { + ALOGE("%s must be defined as a build property", property); + return FALLBACK_DENSITY; + } + return density / 160.f; +} + // Currently we only support V0_SRGB and DISPLAY_P3 as composition preference. bool validateCompositionDataspace(Dataspace dataspace) { return dataspace == Dataspace::V0_SRGB || dataspace == Dataspace::DISPLAY_P3; @@ -249,7 +265,8 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag) mFrameTracer(std::make_unique<FrameTracer>()), mEventQueue(mFactory.createMessageQueue()), mCompositionEngine(mFactory.createCompositionEngine()), - mPendingSyncInputWindows(false) {} + mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)), + mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)) {} SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization) { ALOGI("SurfaceFlinger is starting"); @@ -734,8 +751,56 @@ status_t SurfaceFlinger::getSupportedFrameTimestamps( return NO_ERROR; } +status_t SurfaceFlinger::getDisplayState(const sp<IBinder>& displayToken, ui::DisplayState* state) { + if (!displayToken || !state) { + return BAD_VALUE; + } + + Mutex::Autolock lock(mStateLock); + + const auto display = getDisplayDeviceLocked(displayToken); + if (!display) { + return NAME_NOT_FOUND; + } + + state->layerStack = display->getLayerStack(); + state->orientation = display->getOrientation(); + + const Rect viewport = display->getViewport(); + state->viewport = viewport.isValid() ? viewport.getSize() : display->getSize(); + + return NO_ERROR; +} + +status_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& displayToken, DisplayInfo* info) { + if (!displayToken || !info) { + return BAD_VALUE; + } + + Mutex::Autolock lock(mStateLock); + + const auto display = getDisplayDeviceLocked(displayToken); + if (!display) { + return NAME_NOT_FOUND; + } + + if (display->isVirtual()) { + return INVALID_OPERATION; + } + + if (mEmulatedDisplayDensity) { + info->density = mEmulatedDisplayDensity; + } else { + info->density = display->isPrimary() ? mInternalDisplayDensity : FALLBACK_DENSITY; + } + + info->secure = display->isSecure(); + + return NO_ERROR; +} + status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken, - Vector<DisplayInfo>* configs) { + Vector<DisplayConfig>* configs) { if (!displayToken || !configs) { return BAD_VALUE; } @@ -747,78 +812,42 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken, return NAME_NOT_FOUND; } - // TODO: Not sure if display density should handled by SF any longer - class Density { - static float getDensityFromProperty(char const* propName) { - char property[PROPERTY_VALUE_MAX]; - float density = 0.0f; - if (property_get(propName, property, nullptr) > 0) { - density = strtof(property, nullptr); - } - return density; - } - public: - static float getEmuDensity() { - return getDensityFromProperty("qemu.sf.lcd_density"); } - static float getBuildDensity() { - return getDensityFromProperty("ro.sf.lcd_density"); } - }; + const bool isInternal = (displayId == getInternalDisplayIdLocked()); configs->clear(); for (const auto& hwConfig : getHwComposer().getConfigs(*displayId)) { - DisplayInfo info = DisplayInfo(); - - float xdpi = hwConfig->getDpiX(); - float ydpi = hwConfig->getDpiY(); - - info.w = hwConfig->getWidth(); - info.h = hwConfig->getHeight(); - // Default display viewport to display width and height - info.viewportW = info.w; - info.viewportH = info.h; - - if (displayId == getInternalDisplayIdLocked()) { - // The density of the device is provided by a build property - float density = Density::getBuildDensity() / 160.0f; - if (density == 0) { - // the build doesn't provide a density -- this is wrong! - // use xdpi instead - ALOGE("ro.sf.lcd_density must be defined as a build property"); - density = xdpi / 160.0f; - } - if (Density::getEmuDensity()) { - // if "qemu.sf.lcd_density" is specified, it overrides everything - xdpi = ydpi = density = Density::getEmuDensity(); - density /= 160.0f; - } - info.density = density; + DisplayConfig config; - const auto display = getDefaultDisplayDeviceLocked(); - info.orientation = display->getOrientation(); + auto width = hwConfig->getWidth(); + auto height = hwConfig->getHeight(); - // This is for screenrecord - const Rect viewport = display->getViewport(); - if (viewport.isValid()) { - info.viewportW = uint32_t(viewport.getWidth()); - info.viewportH = uint32_t(viewport.getHeight()); - } - info.layerStack = display->getLayerStack(); - } else { - // TODO: where should this value come from? - static const int TV_DENSITY = 213; - info.density = TV_DENSITY / 160.0f; + auto xDpi = hwConfig->getDpiX(); + auto yDpi = hwConfig->getDpiY(); + + if (isInternal && + (internalDisplayOrientation == ui::ROTATION_90 || + internalDisplayOrientation == ui::ROTATION_270)) { + std::swap(width, height); + std::swap(xDpi, yDpi); + } - const auto display = getDisplayDeviceLocked(displayToken); - info.layerStack = display->getLayerStack(); + config.resolution = ui::Size(width, height); + + if (mEmulatedDisplayDensity) { + config.xDpi = mEmulatedDisplayDensity; + config.yDpi = mEmulatedDisplayDensity; + } else { + config.xDpi = xDpi; + config.yDpi = yDpi; } - info.xdpi = xdpi; - info.ydpi = ydpi; - info.fps = 1e9 / hwConfig->getVsyncPeriod(); + const nsecs_t period = hwConfig->getVsyncPeriod(); + config.refreshRate = 1e9f / period; - const auto offset = mPhaseConfiguration->getOffsetsForRefreshRate(info.fps); - info.appVsyncOffset = offset.late.app; + const auto offsets = mPhaseConfiguration->getOffsetsForRefreshRate(config.refreshRate); + config.appVsyncOffset = offsets.late.app; + config.sfVsyncOffset = offsets.late.sf; // This is how far in advance a buffer must be queued for // presentation at a given time. If you want a buffer to appear @@ -832,18 +861,9 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken, // // We add an additional 1ms to allow for processing time and // differences between the ideal and actual refresh rate. - info.presentationDeadline = hwConfig->getVsyncPeriod() - offset.late.sf + 1000000; + config.presentationDeadline = period - config.sfVsyncOffset + 1000000; - // All non-virtual displays are currently considered secure. - info.secure = true; - - if (displayId == getInternalDisplayIdLocked() && - (internalDisplayOrientation == ui::ROTATION_90 || - internalDisplayOrientation == ui::ROTATION_270)) { - std::swap(info.w, info.h); - } - - configs->push_back(info); + configs->push_back(config); } return NO_ERROR; @@ -4614,7 +4634,9 @@ status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) { case GET_PHYSICAL_DISPLAY_TOKEN: case GET_DISPLAY_COLOR_MODES: case GET_DISPLAY_NATIVE_PRIMARIES: + case GET_DISPLAY_INFO: case GET_DISPLAY_CONFIGS: + case GET_DISPLAY_STATE: case GET_DISPLAY_STATS: case GET_SUPPORTED_FRAME_TIMESTAMPS: // Calling setTransactionState is safe, because you need to have been @@ -4644,12 +4666,6 @@ status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) { } return OK; } - // The following codes are deprecated and should never be allowed to access SF. - case CONNECT_DISPLAY_UNUSED: - case CREATE_GRAPHIC_BUFFER_ALLOC_UNUSED: { - ALOGE("Attempting to access SurfaceFlinger with unused code: %u", code); - return PERMISSION_DENIED; - } case CAPTURE_SCREEN_BY_ID: { IPCThreadState* ipc = IPCThreadState::self(); const int uid = ipc->getCallingUid(); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index f8980a513f..7eb066cbac 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -433,13 +433,13 @@ private: float frameScale, bool childrenOnly) override; status_t getDisplayStats(const sp<IBinder>& displayToken, DisplayStatInfo* stats) override; - status_t getDisplayConfigs(const sp<IBinder>& displayToken, - Vector<DisplayInfo>* configs) override; + status_t getDisplayState(const sp<IBinder>& displayToken, ui::DisplayState*) override; + status_t getDisplayInfo(const sp<IBinder>& displayToken, DisplayInfo*) override; + status_t getDisplayConfigs(const sp<IBinder>& displayToken, Vector<DisplayConfig>*) override; int getActiveConfig(const sp<IBinder>& displayToken) override; - status_t getDisplayColorModes(const sp<IBinder>& displayToken, - Vector<ui::ColorMode>* configs) override; + status_t getDisplayColorModes(const sp<IBinder>& displayToken, Vector<ui::ColorMode>*) override; status_t getDisplayNativePrimaries(const sp<IBinder>& displayToken, - ui::DisplayPrimaries &primaries); + ui::DisplayPrimaries&) override; ui::ColorMode getActiveColorMode(const sp<IBinder>& displayToken) override; status_t setActiveColorMode(const sp<IBinder>& displayToken, ui::ColorMode colorMode) override; status_t getAutoLowLatencyModeSupport(const sp<IBinder>& displayToken, @@ -1164,6 +1164,9 @@ private: sp<RegionSamplingThread> mRegionSamplingThread; ui::DisplayPrimaries mInternalDisplayPrimaries; + const float mInternalDisplayDensity; + const float mEmulatedDisplayDensity; + sp<IInputFlinger> mInputFlinger; InputWindowCommands mPendingInputWindowCommands GUARDED_BY(mStateLock); // Should only be accessed by the main thread. @@ -1180,7 +1183,7 @@ private: const sp<SetInputWindowsListener> mSetInputWindowsListener = new SetInputWindowsListener(this); - bool mPendingSyncInputWindows GUARDED_BY(mStateLock); + bool mPendingSyncInputWindows GUARDED_BY(mStateLock) = false; Hwc2::impl::PowerAdvisor mPowerAdvisor; // This should only be accessed on the main thread. diff --git a/services/surfaceflinger/tests/Credentials_test.cpp b/services/surfaceflinger/tests/Credentials_test.cpp index f339ab01d7..507d28b143 100644 --- a/services/surfaceflinger/tests/Credentials_test.cpp +++ b/services/surfaceflinger/tests/Credentials_test.cpp @@ -1,20 +1,15 @@ -#include <algorithm> -#include <functional> -#include <limits> -#include <ostream> - #include <gtest/gtest.h> - #include <gui/ISurfaceComposer.h> #include <gui/LayerDebugInfo.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> - #include <private/android_filesystem_config.h> #include <private/gui/ComposerService.h> -#include <ui/DisplayInfo.h> +#include <ui/DisplayConfig.h> #include <utils/String8.h> +#include <functional> + namespace android { using Transaction = SurfaceComposerClient::Transaction; @@ -67,14 +62,13 @@ protected: mDisplay = SurfaceComposerClient::getInternalDisplayToken(); ASSERT_FALSE(mDisplay == nullptr); - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info)); - const ssize_t displayWidth = info.w; - const ssize_t displayHeight = info.h; + DisplayConfig config; + ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(mDisplay, &config)); // Background surface mBGSurfaceControl = - mComposerClient->createSurface(SURFACE_NAME, displayWidth, displayHeight, + mComposerClient->createSurface(SURFACE_NAME, config.resolution.getWidth(), + config.resolution.getHeight(), PIXEL_FORMAT_RGBA_8888, 0); ASSERT_TRUE(mBGSurfaceControl != nullptr); ASSERT_TRUE(mBGSurfaceControl->isValid()); @@ -188,10 +182,10 @@ TEST_F(CredentialsTest, AllowedGetterMethodsTest) { const auto display = SurfaceComposerClient::getInternalDisplayToken(); ASSERT_TRUE(display != nullptr); - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); + DisplayConfig config; + ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); - Vector<DisplayInfo> configs; + Vector<DisplayConfig> configs; ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayConfigs(display, &configs)); ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveConfig(display)); @@ -255,17 +249,6 @@ TEST_F(CredentialsTest, CreateDisplayTest) { ASSERT_NO_FATAL_FAILURE(checkWithPrivileges(condition, true, false)); } -TEST_F(CredentialsTest, DISABLED_DestroyDisplayTest) { - setupVirtualDisplay(); - - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mVirtualDisplay, &info)); - SurfaceComposerClient::destroyDisplay(mVirtualDisplay); - // This test currently fails. TODO(b/112002626): Find a way to properly create - // a display in the test environment, so that destroy display can remove it. - ASSERT_EQ(NAME_NOT_FOUND, SurfaceComposerClient::getDisplayInfo(mVirtualDisplay, &info)); -} - TEST_F(CredentialsTest, CaptureTest) { const auto display = SurfaceComposerClient::getInternalDisplayToken(); std::function<status_t()> condition = [=]() { diff --git a/services/surfaceflinger/tests/DisplayConfigs_test.cpp b/services/surfaceflinger/tests/DisplayConfigs_test.cpp index 3aa4474b6b..0ed2ffb505 100644 --- a/services/surfaceflinger/tests/DisplayConfigs_test.cpp +++ b/services/surfaceflinger/tests/DisplayConfigs_test.cpp @@ -46,24 +46,25 @@ TEST_F(RefreshRateRangeTest, setAllConfigs) { &initialMin, &initialMax); ASSERT_EQ(res, NO_ERROR); - Vector<DisplayInfo> configs; + Vector<DisplayConfig> configs; res = SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &configs); ASSERT_EQ(res, NO_ERROR); for (size_t i = 0; i < configs.size(); i++) { - res = SurfaceComposerClient::setDesiredDisplayConfigSpecs(mDisplayToken, i, configs[i].fps, - configs[i].fps); + res = SurfaceComposerClient::setDesiredDisplayConfigSpecs(mDisplayToken, i, + configs[i].refreshRate, + configs[i].refreshRate); ASSERT_EQ(res, NO_ERROR); int defaultConfig; - float minFps; - float maxFps; + float minRefreshRate; + float maxRefreshRate; res = SurfaceComposerClient::getDesiredDisplayConfigSpecs(mDisplayToken, &defaultConfig, - &minFps, &maxFps); + &minRefreshRate, &maxRefreshRate); ASSERT_EQ(res, NO_ERROR); ASSERT_EQ(defaultConfig, i); - ASSERT_EQ(minFps, configs[i].fps); - ASSERT_EQ(maxFps, configs[i].fps); + ASSERT_EQ(minRefreshRate, configs[i].refreshRate); + ASSERT_EQ(maxRefreshRate, configs[i].refreshRate); } res = SurfaceComposerClient::setDesiredDisplayConfigSpecs(mDisplayToken, initialDefaultConfig, diff --git a/services/surfaceflinger/tests/IPC_test.cpp b/services/surfaceflinger/tests/IPC_test.cpp index 8a756a668c..4023c66e52 100644 --- a/services/surfaceflinger/tests/IPC_test.cpp +++ b/services/surfaceflinger/tests/IPC_test.cpp @@ -14,24 +14,20 @@ * limitations under the License. */ -#include <gtest/gtest.h> - #include <binder/IInterface.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <binder/ProcessState.h> - +#include <gtest/gtest.h> #include <gui/ISurfaceComposer.h> #include <gui/LayerState.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> +#include <ui/DisplayConfig.h> +#include <utils/String8.h> #include <limits> -#include <ui/DisplayInfo.h> - -#include <utils/String8.h> - #include "BufferGenerator.h" #include "utils/CallbackUtils.h" #include "utils/ColorUtils.h" @@ -231,10 +227,10 @@ public: ASSERT_EQ(NO_ERROR, mClient->initCheck()); mPrimaryDisplay = mClient->getInternalDisplayToken(); - DisplayInfo info; - mClient->getDisplayInfo(mPrimaryDisplay, &info); - mDisplayWidth = info.w; - mDisplayHeight = info.h; + DisplayConfig config; + mClient->getActiveDisplayConfig(mPrimaryDisplay, &config); + mDisplayWidth = config.resolution.getWidth(); + mDisplayHeight = config.resolution.getHeight(); Transaction setupTransaction; setupTransaction.setDisplayLayerStack(mPrimaryDisplay, 0); diff --git a/services/surfaceflinger/tests/LayerTransactionTest.h b/services/surfaceflinger/tests/LayerTransactionTest.h index f7a6d964f0..5eb1739219 100644 --- a/services/surfaceflinger/tests/LayerTransactionTest.h +++ b/services/surfaceflinger/tests/LayerTransactionTest.h @@ -13,17 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ANDROID_LAYER_TRANSACTION_TEST_H -#define ANDROID_LAYER_TRANSACTION_TEST_H -#include <gtest/gtest.h> +#pragma once +#include <gtest/gtest.h> #include <gui/ISurfaceComposer.h> #include <gui/SurfaceComposerClient.h> #include <hardware/hwcomposer_defs.h> #include <private/gui/ComposerService.h> - -#include <ui/DisplayInfo.h> +#include <ui/DisplayConfig.h> #include "BufferGenerator.h" #include "utils/ScreenshotUtils.h" @@ -255,18 +253,16 @@ private: mDisplay = mClient->getInternalDisplayToken(); ASSERT_FALSE(mDisplay == nullptr) << "failed to get display"; - // get display width/height - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info)); - mDisplayWidth = info.w; - mDisplayHeight = info.h; - mDisplayRect = - Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight)); + DisplayConfig config; + ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(mDisplay, &config)); + mDisplayRect = Rect(config.resolution); + mDisplayWidth = mDisplayRect.getWidth(); + mDisplayHeight = mDisplayRect.getHeight(); // After a new buffer is queued, SurfaceFlinger is notified and will // latch the new buffer on next vsync. Let's heuristically wait for 3 // vsyncs. - mBufferPostDelay = int32_t(1e6 / info.fps) * 3; + mBufferPostDelay = static_cast<int32_t>(1e6 / config.refreshRate) * 3; mDisplayLayerStack = 0; @@ -295,6 +291,5 @@ private: friend class LayerRenderPathTestHarness; }; -} // namespace android -#endif +} // namespace android diff --git a/services/surfaceflinger/tests/LayerUpdate_test.cpp b/services/surfaceflinger/tests/LayerUpdate_test.cpp index 0459386936..a1c412801d 100644 --- a/services/surfaceflinger/tests/LayerUpdate_test.cpp +++ b/services/surfaceflinger/tests/LayerUpdate_test.cpp @@ -36,14 +36,13 @@ protected: const auto display = SurfaceComposerClient::getInternalDisplayToken(); ASSERT_FALSE(display == nullptr); - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - - ssize_t displayWidth = info.w; - ssize_t displayHeight = info.h; + DisplayConfig config; + ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + const ui::Size& resolution = config.resolution; // Background surface - mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth, displayHeight, 0); + mBGSurfaceControl = createLayer(String8("BG Test Surface"), resolution.getWidth(), + resolution.getHeight(), 0); ASSERT_TRUE(mBGSurfaceControl != nullptr); ASSERT_TRUE(mBGSurfaceControl->isValid()); TransactionUtils::fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195); @@ -73,7 +72,8 @@ protected: .show(mFGSurfaceControl); t.setLayer(mSyncSurfaceControl, INT32_MAX - 1) - .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2) + .setPosition(mSyncSurfaceControl, resolution.getWidth() - 2, + resolution.getHeight() - 2) .show(mSyncSurfaceControl); }); } diff --git a/services/surfaceflinger/tests/MultiDisplayLayerBounds_test.cpp b/services/surfaceflinger/tests/MultiDisplayLayerBounds_test.cpp index e525e2af9b..c9fdc3b799 100644 --- a/services/surfaceflinger/tests/MultiDisplayLayerBounds_test.cpp +++ b/services/surfaceflinger/tests/MultiDisplayLayerBounds_test.cpp @@ -18,6 +18,8 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wconversion" +#include <ui/DisplayState.h> + #include "LayerTransactionTest.h" namespace android { @@ -34,12 +36,14 @@ protected: ASSERT_EQ(NO_ERROR, mClient->initCheck()); mMainDisplay = SurfaceComposerClient::getInternalDisplayToken(); - SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo); + SurfaceComposerClient::getDisplayState(mMainDisplay, &mMainDisplayState); + SurfaceComposerClient::getActiveDisplayConfig(mMainDisplay, &mMainDisplayConfig); sp<IGraphicBufferConsumer> consumer; BufferQueue::createBufferQueue(&mProducer, &consumer); consumer->setConsumerName(String8("Virtual disp consumer")); - consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h); + consumer->setDefaultBufferSize(mMainDisplayConfig.resolution.getWidth(), + mMainDisplayConfig.resolution.getHeight()); } virtual void TearDown() { @@ -48,14 +52,14 @@ protected: mColorLayer = 0; } - void createDisplay(const Rect& layerStackRect, uint32_t layerStack) { + void createDisplay(const ui::Size& layerStackSize, uint32_t layerStack) { mVirtualDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/); asTransaction([&](Transaction& t) { t.setDisplaySurface(mVirtualDisplay, mProducer); t.setDisplayLayerStack(mVirtualDisplay, layerStack); - t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect, - Rect(mMainDisplayInfo.w, mMainDisplayInfo.h)); + t.setDisplayProjection(mVirtualDisplay, mMainDisplayState.orientation, + Rect(layerStackSize), Rect(mMainDisplayConfig.resolution)); }); } @@ -76,7 +80,8 @@ protected: }); } - DisplayInfo mMainDisplayInfo; + ui::DisplayState mMainDisplayState; + DisplayConfig mMainDisplayConfig; sp<IBinder> mMainDisplay; sp<IBinder> mVirtualDisplay; sp<IGraphicBufferProducer> mProducer; @@ -85,7 +90,7 @@ protected: }; TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) { - createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */); + createDisplay(mMainDisplayState.viewport, 1 /* layerStack */); createColorLayer(1 /* layerStack */); asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); }); @@ -108,7 +113,7 @@ TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) { // Assumption here is that the new mirrored display has the same viewport as the // primary display that it is mirroring. - createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */); + createDisplay(mMainDisplayState.viewport, 0 /* layerStack */); createColorLayer(0 /* layerStack */); asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); }); diff --git a/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp b/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp index 4a2ab7c080..0e7eba8d76 100644 --- a/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp +++ b/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp @@ -20,18 +20,13 @@ #include <frameworks/native/cmds/surfacereplayer/proto/src/trace.pb.h> #include <google/protobuf/io/zero_copy_stream_impl.h> - #include <gtest/gtest.h> - -#include <android/native_window.h> - #include <gui/ISurfaceComposer.h> #include <gui/LayerState.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> - #include <private/gui/ComposerService.h> -#include <ui/DisplayInfo.h> +#include <ui/DisplayConfig.h> #include <fstream> #include <random> @@ -271,21 +266,21 @@ void SurfaceInterceptorTest::setupBackgroundSurface() { const auto display = SurfaceComposerClient::getInternalDisplayToken(); ASSERT_FALSE(display == nullptr); - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - - ssize_t displayWidth = info.w; - ssize_t displayHeight = info.h; + DisplayConfig config; + ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + const ui::Size& resolution = config.resolution; // Background surface - mBGSurfaceControl = mComposerClient->createSurface(String8(TEST_BG_SURFACE_NAME), displayWidth, - displayHeight, PIXEL_FORMAT_RGBA_8888, 0); + mBGSurfaceControl = + mComposerClient->createSurface(String8(TEST_BG_SURFACE_NAME), resolution.getWidth(), + resolution.getHeight(), PIXEL_FORMAT_RGBA_8888, 0); ASSERT_TRUE(mBGSurfaceControl != nullptr); ASSERT_TRUE(mBGSurfaceControl->isValid()); // Foreground surface - mFGSurfaceControl = mComposerClient->createSurface(String8(TEST_FG_SURFACE_NAME), displayWidth, - displayHeight, PIXEL_FORMAT_RGBA_8888, 0); + mFGSurfaceControl = + mComposerClient->createSurface(String8(TEST_FG_SURFACE_NAME), resolution.getWidth(), + resolution.getHeight(), PIXEL_FORMAT_RGBA_8888, 0); ASSERT_TRUE(mFGSurfaceControl != nullptr); ASSERT_TRUE(mFGSurfaceControl->isValid()); diff --git a/services/surfaceflinger/tests/TransactionTestHarnesses.h b/services/surfaceflinger/tests/TransactionTestHarnesses.h index 5612bb21c7..040852f87e 100644 --- a/services/surfaceflinger/tests/TransactionTestHarnesses.h +++ b/services/surfaceflinger/tests/TransactionTestHarnesses.h @@ -16,41 +16,10 @@ #ifndef ANDROID_TRANSACTION_TEST_HARNESSES #define ANDROID_TRANSACTION_TEST_HARNESSES -/*#include <algorithm> -#include <chrono> -#include <cinttypes> -#include <functional> -#include <limits> -#include <ostream> - -#include <android/native_window.h> - -#include <binder/ProcessState.h> -#include <gui/BufferItemConsumer.h> -#include <gui/IProducerListener.h> -#include <gui/ISurfaceComposer.h> -#include <gui/LayerState.h> -#include <gui/Surface.h> -#include <gui/SurfaceComposerClient.h> -#include <hardware/hwcomposer_defs.h> -#include <private/android_filesystem_config.h> -#include <private/gui/ComposerService.h> - -#include <ui/DisplayInfo.h> - -#include <math.h> -#include <math/vec3.h> -#include <sys/types.h> -#include <unistd.h> - -#include "BufferGenerator.h" -*/ +#include <ui/DisplayState.h> + #include "LayerTransactionTest.h" -/*#include "utils/CallbackUtils.h" -#include "utils/ColorUtils.h" -#include "utils/ScreenshotUtils.h" -#include "utils/TransactionUtils.h" -*/ + namespace android { using android::hardware::graphics::common::V1_1::BufferUsage; @@ -66,9 +35,14 @@ public: return mDelegate->screenshot(); case RenderPath::VIRTUAL_DISPLAY: - const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken(); - DisplayInfo mainDisplayInfo; - SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo); + const auto displayToken = SurfaceComposerClient::getInternalDisplayToken(); + + ui::DisplayState displayState; + SurfaceComposerClient::getDisplayState(displayToken, &displayState); + + DisplayConfig displayConfig; + SurfaceComposerClient::getActiveDisplayConfig(displayToken, &displayConfig); + const ui::Size& resolution = displayConfig.resolution; sp<IBinder> vDisplay; sp<IGraphicBufferProducer> producer; @@ -77,7 +51,7 @@ public: BufferQueue::createBufferQueue(&producer, &consumer); consumer->setConsumerName(String8("Virtual disp consumer")); - consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h); + consumer->setDefaultBufferSize(resolution.getWidth(), resolution.getHeight()); itemConsumer = new BufferItemConsumer(consumer, // Sample usage bits from screenrecord @@ -90,9 +64,8 @@ public: SurfaceComposerClient::Transaction t; t.setDisplaySurface(vDisplay, producer); t.setDisplayLayerStack(vDisplay, 0); - t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation, - Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH), - Rect(mainDisplayInfo.w, mainDisplayInfo.h)); + t.setDisplayProjection(vDisplay, displayState.orientation, + Rect(displayState.viewport), Rect(resolution)); t.apply(); SurfaceComposerClient::Transaction().apply(true); BufferItem item; diff --git a/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp b/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp index 6874f6f3a7..e75149653c 100644 --- a/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp +++ b/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp @@ -41,7 +41,7 @@ #include <hwbinder/ProcessState.h> #include <log/log.h> #include <private/gui/ComposerService.h> -#include <ui/DisplayInfo.h> +#include <ui/DisplayConfig.h> #include <utils/Looper.h> #include <gmock/gmock.h> @@ -338,15 +338,16 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(EXTERNAL_DISPLAY); EXPECT_FALSE(display == nullptr); - DisplayInfo info; - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(200u, info.w); - EXPECT_EQ(400u, info.h); - EXPECT_EQ(1e9f / 16'666'666, info.fps); + DisplayConfig config; + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + const ui::Size& resolution = config.resolution; + EXPECT_EQ(ui::Size(200, 400), resolution); + EXPECT_EQ(1e9f / 16'666'666, config.refreshRate); auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -369,8 +370,8 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(EXTERNAL_DISPLAY); EXPECT_TRUE(display == nullptr); - DisplayInfo info; - EXPECT_NE(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); + DisplayConfig config; + EXPECT_NE(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); } } @@ -398,17 +399,18 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(EXTERNAL_DISPLAY); EXPECT_FALSE(display == nullptr); - DisplayInfo info; - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(200u, info.w); - EXPECT_EQ(400u, info.h); - EXPECT_EQ(1e9f / 16'666'666, info.fps); + DisplayConfig config; + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(200, 400), config.resolution); + EXPECT_EQ(1e9f / 16'666'666, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -421,7 +423,7 @@ protected: } } - Vector<DisplayInfo> configs; + Vector<DisplayConfig> configs; EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayConfigs(display, &configs)); EXPECT_EQ(configs.size(), 2); @@ -436,27 +438,29 @@ protected: } for (int i = 0; i < configs.size(); i++) { - if (configs[i].w == 800u) { + const auto& config = configs[i]; + if (config.resolution.getWidth() == 800) { EXPECT_EQ(NO_ERROR, SurfaceComposerClient::setDesiredDisplayConfigSpecs(display, i, - configs[i].fps, - configs[i].fps)); + config.refreshRate, + config.refreshRate)); waitForDisplayTransaction(); EXPECT_TRUE(waitForConfigChangedEvent(EXTERNAL_DISPLAY, i)); break; } } - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(800u, info.w); - EXPECT_EQ(1600u, info.h); - EXPECT_EQ(1e9f / 11'111'111, info.fps); + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(800, 1600), config.resolution); + EXPECT_EQ(1e9f / 11'111'111, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -500,17 +504,18 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(EXTERNAL_DISPLAY); EXPECT_FALSE(display == nullptr); - DisplayInfo info; - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(800u, info.w); - EXPECT_EQ(1600u, info.h); - EXPECT_EQ(1e9f / 16'666'666, info.fps); + DisplayConfig config; + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(800, 1600), config.resolution); + EXPECT_EQ(1e9f / 16'666'666, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -523,7 +528,7 @@ protected: } } - Vector<DisplayInfo> configs; + Vector<DisplayConfig> configs; EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayConfigs(display, &configs)); EXPECT_EQ(configs.size(), 2); @@ -537,27 +542,29 @@ protected: } for (int i = 0; i < configs.size(); i++) { - if (configs[i].fps == 1e9f / 11'111'111) { + const auto& config = configs[i]; + if (config.refreshRate == 1e9f / 11'111'111) { EXPECT_EQ(NO_ERROR, SurfaceComposerClient::setDesiredDisplayConfigSpecs(display, i, - configs[i].fps, - configs[i].fps)); + config.refreshRate, + config.refreshRate)); waitForDisplayTransaction(); EXPECT_TRUE(waitForConfigChangedEvent(EXTERNAL_DISPLAY, i)); break; } } - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(800u, info.w); - EXPECT_EQ(1600u, info.h); - EXPECT_EQ(1e9f / 11'111'111, info.fps); + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(800, 1600), config.resolution); + EXPECT_EQ(1e9f / 11'111'111, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -611,17 +618,18 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(EXTERNAL_DISPLAY); EXPECT_FALSE(display == nullptr); - DisplayInfo info; - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(800u, info.w); - EXPECT_EQ(1600u, info.h); - EXPECT_EQ(1e9f / 16'666'666, info.fps); + DisplayConfig config; + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(800, 1600), config.resolution); + EXPECT_EQ(1e9f / 16'666'666, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -634,7 +642,7 @@ protected: } } - Vector<DisplayInfo> configs; + Vector<DisplayConfig> configs; EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayConfigs(display, &configs)); EXPECT_EQ(configs.size(), 4); @@ -648,27 +656,29 @@ protected: } for (int i = 0; i < configs.size(); i++) { - if (configs[i].w == 800u && configs[i].fps == 1e9f / 11'111'111) { + const auto& config = configs[i]; + if (config.resolution.getWidth() == 800 && config.refreshRate == 1e9f / 11'111'111) { EXPECT_EQ(NO_ERROR, SurfaceComposerClient::setDesiredDisplayConfigSpecs(display, i, - configs[i].fps, - configs[i].fps)); + configs[i].refreshRate, + configs[i].refreshRate)); waitForDisplayTransaction(); EXPECT_TRUE(waitForConfigChangedEvent(EXTERNAL_DISPLAY, i)); break; } } - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(800u, info.w); - EXPECT_EQ(1600u, info.h); - EXPECT_EQ(1e9f / 11'111'111, info.fps); + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(800, 1600), config.resolution); + EXPECT_EQ(1e9f / 11'111'111, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -691,27 +701,29 @@ protected: } for (int i = 0; i < configs.size(); i++) { - if (configs[i].fps == 1e9f / 8'333'333) { + const auto& config = configs[i]; + if (config.refreshRate == 1e9f / 8'333'333) { EXPECT_EQ(NO_ERROR, SurfaceComposerClient::setDesiredDisplayConfigSpecs(display, i, - configs[i].fps, - configs[i].fps)); + config.refreshRate, + config.refreshRate)); waitForDisplayTransaction(); EXPECT_TRUE(waitForConfigChangedEvent(EXTERNAL_DISPLAY, i)); break; } } - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(1600u, info.w); - EXPECT_EQ(3200u, info.h); - EXPECT_EQ(1e9f / 8'333'333, info.fps); + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(1600, 3200), config.resolution); + EXPECT_EQ(1e9f / 8'333'333, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -734,27 +746,29 @@ protected: } for (int i = 0; i < configs.size(); i++) { - if (configs[i].w == 1600 && configs[i].fps == 1e9f / 11'111'111) { + const auto& config = configs[i]; + if (config.resolution.getWidth() == 1600 && config.refreshRate == 1e9f / 11'111'111) { EXPECT_EQ(NO_ERROR, SurfaceComposerClient::setDesiredDisplayConfigSpecs(display, i, - configs[i].fps, - configs[i].fps)); + config.refreshRate, + config.refreshRate)); waitForDisplayTransaction(); EXPECT_TRUE(waitForConfigChangedEvent(EXTERNAL_DISPLAY, i)); break; } } - EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); - EXPECT_EQ(1600u, info.w); - EXPECT_EQ(3200u, info.h); - EXPECT_EQ(1e9f / 11'111'111, info.fps); + EXPECT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); + EXPECT_EQ(ui::Size(1600, 3200), config.resolution); + EXPECT_EQ(1e9f / 11'111'111, config.refreshRate); mFakeComposerClient->clearFrames(); { + const ui::Size& resolution = config.resolution; auto surfaceControl = - mComposerClient->createSurface(String8("Display Test Surface Foo"), info.w, - info.h, PIXEL_FORMAT_RGBA_8888, 0); + mComposerClient->createSurface(String8("Display Test Surface Foo"), + resolution.getWidth(), resolution.getHeight(), + PIXEL_FORMAT_RGBA_8888, 0); EXPECT_TRUE(surfaceControl != nullptr); EXPECT_TRUE(surfaceControl->isValid()); fillSurfaceRGBA8(surfaceControl, BLUE); @@ -787,8 +801,8 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(PRIMARY_DISPLAY); EXPECT_TRUE(display == nullptr); - DisplayInfo info; - auto result = SurfaceComposerClient::getDisplayInfo(display, &info); + DisplayConfig config; + auto result = SurfaceComposerClient::getActiveDisplayConfig(display, &config); EXPECT_NE(NO_ERROR, result); } @@ -813,12 +827,11 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(PRIMARY_DISPLAY); EXPECT_FALSE(display == nullptr); - DisplayInfo info; - auto result = SurfaceComposerClient::getDisplayInfo(display, &info); + DisplayConfig config; + auto result = SurfaceComposerClient::getActiveDisplayConfig(display, &config); EXPECT_EQ(NO_ERROR, result); - ASSERT_EQ(400u, info.w); - ASSERT_EQ(200u, info.h); - EXPECT_EQ(1e9f / 16'666'666, info.fps); + ASSERT_EQ(ui::Size(400, 200), config.resolution); + EXPECT_EQ(1e9f / 16'666'666, config.refreshRate); } } @@ -968,11 +981,12 @@ protected: const auto display = SurfaceComposerClient::getPhysicalDisplayToken(PRIMARY_DISPLAY); ASSERT_FALSE(display == nullptr); - DisplayInfo info; - ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info)); + DisplayConfig config; + ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayConfig(display, &config)); - mDisplayWidth = info.w; - mDisplayHeight = info.h; + const ui::Size& resolution = config.resolution; + mDisplayWidth = resolution.getWidth(); + mDisplayHeight = resolution.getHeight(); // Background surface mBGSurfaceControl = |