diff options
Diffstat (limited to 'libs/nativedisplay/ADisplay.cpp')
-rw-r--r-- | libs/nativedisplay/ADisplay.cpp | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/libs/nativedisplay/ADisplay.cpp b/libs/nativedisplay/ADisplay.cpp index 277635cd34..6288194714 100644 --- a/libs/nativedisplay/ADisplay.cpp +++ b/libs/nativedisplay/ADisplay.cpp @@ -16,10 +16,11 @@ #include <apex/display.h> #include <gui/SurfaceComposerClient.h> -#include <ui/DisplayConfig.h> -#include <ui/DisplayInfo.h> +#include <ui/DisplayMode.h> +#include <ui/DynamicDisplayInfo.h> #include <ui/GraphicTypes.h> #include <ui/PixelFormat.h> +#include <ui/StaticDisplayInfo.h> #include <algorithm> #include <optional> @@ -33,6 +34,11 @@ namespace android::display::impl { */ struct DisplayConfigImpl { /** + * The ID of the display configuration. + */ + size_t id; + + /** * The width in pixels of the display configuration. */ int32_t width{0}; @@ -134,34 +140,36 @@ int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) { return NO_INIT; } - std::vector<DisplayConfigImpl> configsPerDisplay[size]; - int numConfigs = 0; + std::vector<DisplayConfigImpl> modesPerDisplay[size]; + int numModes = 0; for (int i = 0; i < size; ++i) { const sp<IBinder> token = SurfaceComposerClient::getPhysicalDisplayToken(ids[i]); - DisplayInfo info; - if (const status_t status = SurfaceComposerClient::getDisplayInfo(token, &info); + ui::StaticDisplayInfo staticInfo; + if (const status_t status = SurfaceComposerClient::getStaticDisplayInfo(token, &staticInfo); status != OK) { return status; } - Vector<DisplayConfig> configs; - if (const status_t status = SurfaceComposerClient::getDisplayConfigs(token, &configs); + ui::DynamicDisplayInfo dynamicInfo; + if (const status_t status = + SurfaceComposerClient::getDynamicDisplayInfo(token, &dynamicInfo); status != OK) { return status; } - if (configs.empty()) { + const auto& modes = dynamicInfo.supportedDisplayModes; + if (modes.empty()) { return NO_INIT; } - numConfigs += configs.size(); - configsPerDisplay[i].reserve(configs.size()); - for (int j = 0; j < configs.size(); ++j) { - const DisplayConfig& config = configs[j]; - configsPerDisplay[i].emplace_back( - DisplayConfigImpl{config.resolution.getWidth(), config.resolution.getHeight(), - info.density, config.refreshRate, config.sfVsyncOffset, - config.appVsyncOffset}); + numModes += modes.size(); + modesPerDisplay[i].reserve(modes.size()); + for (int j = 0; j < modes.size(); ++j) { + const ui::DisplayMode& mode = modes[j]; + modesPerDisplay[i].emplace_back( + DisplayConfigImpl{static_cast<size_t>(mode.id), mode.resolution.getWidth(), + mode.resolution.getHeight(), staticInfo.density, + mode.refreshRate, mode.sfVsyncOffset, mode.appVsyncOffset}); } } @@ -192,7 +200,7 @@ int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) { // contiguous block of DisplayConfigImpls specific to that display. DisplayImpl** const impls = reinterpret_cast<DisplayImpl**>( malloc((sizeof(DisplayImpl) + sizeof(DisplayImpl*)) * size + - sizeof(DisplayConfigImpl) * numConfigs)); + sizeof(DisplayConfigImpl) * numModes)); DisplayImpl* const displayData = reinterpret_cast<DisplayImpl*>(impls + size); DisplayConfigImpl* configData = reinterpret_cast<DisplayConfigImpl*>(displayData + size); @@ -200,7 +208,7 @@ int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) { const PhysicalDisplayId id = ids[i]; const ADisplayType type = (internalId == id) ? ADisplayType::DISPLAY_TYPE_INTERNAL : ADisplayType::DISPLAY_TYPE_EXTERNAL; - const std::vector<DisplayConfigImpl>& configs = configsPerDisplay[i]; + const std::vector<DisplayConfigImpl>& configs = modesPerDisplay[i]; memcpy(configData, configs.data(), sizeof(DisplayConfigImpl) * configs.size()); displayData[i] = DisplayImpl{id, @@ -257,15 +265,22 @@ int ADisplay_getCurrentConfig(ADisplay* display, ADisplayConfig** outConfig) { CHECK_NOT_NULL(display); sp<IBinder> token = getToken(display); - const int index = SurfaceComposerClient::getActiveConfig(token); - if (index < 0) { - return index; + ui::DynamicDisplayInfo info; + if (const auto status = SurfaceComposerClient::getDynamicDisplayInfo(token, &info); + status != OK) { + return status; } DisplayImpl* impl = reinterpret_cast<DisplayImpl*>(display); + for (size_t i = 0; i < impl->numConfigs; i++) { + auto* config = impl->configs + i; + if (config->id == info.activeDisplayModeId) { + *outConfig = reinterpret_cast<ADisplayConfig*>(config); + return OK; + } + } - *outConfig = reinterpret_cast<ADisplayConfig*>(impl->configs + index); - return OK; + return NAME_NOT_FOUND; } float ADisplayConfig_getDensity(ADisplayConfig* config) { |