From fad9d8cd070e94749d8eb5be8f92011c9567a44c Mon Sep 17 00:00:00 2001 From: Courtney Goeltzenleuchter Date: Thu, 23 Jun 2016 11:49:50 -0600 Subject: [PATCH] Add support for multiple color modes Bug: 29044347 Change-Id: Iea048eaa62f072a9bbefc4f3a6c29a9e593eab69 --- .../surfaceflinger/DisplayHardware/HWComposer.cpp | 21 +++++++++++++++++++++ .../surfaceflinger/DisplayHardware/HWComposer.h | 2 ++ services/surfaceflinger/SurfaceFlinger.cpp | 16 ++++++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 26297943b5..133e5f1f6d 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -359,6 +359,27 @@ std::shared_ptr return config; } +std::vector HWComposer::getColorModes(int32_t displayId) const { + std::vector modes; + + if (!isValidDisplay(displayId)) { + ALOGE("getColorModes: Attempted to access invalid display %d", + displayId); + return modes; + } + const std::shared_ptr& hwcDisplay = + mDisplayData[displayId].hwcDisplay; + + auto error = hwcDisplay->getColorModes(&modes); + if (error != HWC2::Error::None) { + ALOGE("getColorModes failed for display %d: %s (%d)", displayId, + to_string(error).c_str(), static_cast(error)); + return std::vector(); + } + + return modes; +} + void HWComposer::setVsyncEnabled(int32_t disp, HWC2::Vsync enabled) { if (disp < 0 || disp >= HWC_DISPLAY_VIRTUAL) { ALOGD("setVsyncEnabled: Ignoring for virtual display %d", disp); diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index 1a2a153280..aa233df1db 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -149,6 +149,8 @@ public: std::shared_ptr getActiveConfig(int32_t displayId) const; + std::vector getColorModes(int32_t displayId) const; + // for debugging ---------------------------------------------------------- void dump(String8& out) const; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index e156e1abf8..5c7db2b32f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -614,9 +614,6 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp& display, info.fps = 1e9 / hwConfig->getVsyncPeriod(); info.appVsyncOffset = VSYNC_EVENT_PHASE_OFFSET_NS; - // TODO: Hook this back up - info.colorTransform = 0; - // This is how far in advance a buffer must be queued for // presentation at a given time. If you want a buffer to appear // on the screen at time N, you must submit the buffer before @@ -635,7 +632,18 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp& display, // All non-virtual displays are currently considered secure. info.secure = true; - configs->push_back(info); + // DisplayManager expects each color mode to be its own display + // info record. + std::vector modes = getHwComposer().getColorModes(type); + + if (modes.size() == 0) { + info.colorTransform = 0; + configs->push_back(info); + } + for (int32_t mode : modes) { + info.colorTransform = mode; + configs->push_back(info); + } } return NO_ERROR; -- 2.11.0