From 8cf697c2581c68831f1aa43a53750fd530583a72 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Thu, 1 Mar 2018 17:27:39 -0800 Subject: libs/ui/DebugUtils.cpp typo fix Fix a typo in this debug utility. Replace HAL_DATASPACE_V0_BT709 with HAL_DATASPACE_BT709 at a couple places. Also remove an extra ')'. Test: dumpsys SurfaceFlinger should print correct message for BT709. Bug: b/74087087 Change-Id: I1b8f28a550fd6de1d4047ad5d717cfebc32a5408 --- libs/ui/DebugUtils.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'libs/ui/DebugUtils.cpp') diff --git a/libs/ui/DebugUtils.cpp b/libs/ui/DebugUtils.cpp index 2d72944665..17ebf80329 100644 --- a/libs/ui/DebugUtils.cpp +++ b/libs/ui/DebugUtils.cpp @@ -74,7 +74,7 @@ std::string decodeStandard(android_dataspace dataspace) { case HAL_DATASPACE_SRGB: return std::string("(deprecated) sRGB"); - case HAL_DATASPACE_V0_BT709: + case HAL_DATASPACE_BT709: return std::string("(deprecated) BT709"); case HAL_DATASPACE_ARBITRARY: @@ -84,7 +84,7 @@ std::string decodeStandard(android_dataspace dataspace) { // Fallthrough default: return android::base::StringPrintf("Unknown deprecated dataspace code %d", - dataspaceSelect); + dataspace); } } @@ -98,7 +98,7 @@ std::string decodeTransfer(android_dataspace dataspace) { case HAL_DATASPACE_JFIF: case HAL_DATASPACE_BT601_625: case HAL_DATASPACE_BT601_525: - case HAL_DATASPACE_V0_BT709: + case HAL_DATASPACE_BT709: return std::string("SMPTE_170M"); case HAL_DATASPACE_SRGB_LINEAR: @@ -159,8 +159,8 @@ std::string decodeRange(android_dataspace dataspace) { case HAL_DATASPACE_BT601_625: case HAL_DATASPACE_BT601_525: - case HAL_DATASPACE_V0_BT709: - return std::string("Limited range)"); + case HAL_DATASPACE_BT709: + return std::string("Limited range"); case HAL_DATASPACE_ARBITRARY: case HAL_DATASPACE_UNKNOWN: -- cgit v1.2.3-59-g8ed1b From a52f0295622a42849f5ef81c44589b816b2ccacb Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Wed, 14 Mar 2018 17:26:31 -0700 Subject: [Native] Replace android_color_mode usage with ColorMode. To ease the pain when we add color mode v1.1, we replace all current android_color_mode usage in framework native with ColorMode directly from HAL. BUG: 73824924 Test: Build & flash Change-Id: I4436fc225c7807506825c7148bc794cb99f278dc --- libs/gui/Android.bp | 2 + libs/gui/ISurfaceComposer.cpp | 26 +++++----- libs/gui/Surface.cpp | 10 ++-- libs/gui/SurfaceComposerClient.cpp | 6 +-- libs/gui/include/gui/ISurfaceComposer.h | 7 +-- libs/gui/include/gui/SurfaceComposerClient.h | 7 +-- libs/gui/tests/Surface_test.cpp | 8 +-- libs/ui/DebugUtils.cpp | 43 ++++++++-------- libs/ui/include/ui/DebugUtils.h | 4 +- libs/ui/include/ui/GraphicsTypes.h | 26 ++++++++++ services/surfaceflinger/DisplayDevice.cpp | 6 +-- services/surfaceflinger/DisplayDevice.h | 9 ++-- services/surfaceflinger/DisplayHardware/HWC2.cpp | 11 ++-- services/surfaceflinger/DisplayHardware/HWC2.h | 5 +- .../surfaceflinger/DisplayHardware/HWComposer.cpp | 8 +-- .../surfaceflinger/DisplayHardware/HWComposer.h | 5 +- services/surfaceflinger/RenderArea.h | 4 +- services/surfaceflinger/SurfaceFlinger.cpp | 58 +++++++++++----------- services/surfaceflinger/SurfaceFlinger.h | 10 ++-- services/surfaceflinger/layerproto/Android.bp | 1 + services/surfaceflinger/tests/hwc2/Hwc2Test.cpp | 46 +++++++++-------- 21 files changed, 170 insertions(+), 132 deletions(-) create mode 100644 libs/ui/include/ui/GraphicsTypes.h (limited to 'libs/ui/DebugUtils.cpp') diff --git a/libs/gui/Android.bp b/libs/gui/Android.bp index a1a0928154..2768ad8560 100644 --- a/libs/gui/Android.bp +++ b/libs/gui/Android.bp @@ -122,6 +122,7 @@ cc_library_shared { ], shared_libs: [ + "android.hardware.graphics.common@1.1", "libsync", "libbinder", "libbufferhubqueue", // TODO(b/70046255): Remove this once BufferHub is integrated into libgui. @@ -154,6 +155,7 @@ cc_library_shared { "libui", "android.hidl.token@1.0-utils", "android.hardware.graphics.bufferqueue@1.0", + "android.hardware.graphics.common@1.1", ], export_header_lib_headers: [ diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index beda778396..0244bb512e 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -350,7 +350,7 @@ public: } virtual status_t getDisplayColorModes(const sp& display, - Vector* outColorModes) { + Vector* outColorModes) { Parcel data, reply; status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); if (result != NO_ERROR) { @@ -373,34 +373,34 @@ public: outColorModes->clear(); outColorModes->resize(numModes); for (size_t i = 0; i < numModes; ++i) { - outColorModes->replaceAt(static_cast(reply.readInt32()), i); + outColorModes->replaceAt(static_cast(reply.readInt32()), i); } } return result; } - virtual android_color_mode_t getActiveColorMode(const sp& display) { + virtual ColorMode getActiveColorMode(const sp& display) { Parcel data, reply; status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); if (result != NO_ERROR) { ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result); - return static_cast(result); + return static_cast(result); } result = data.writeStrongBinder(display); if (result != NO_ERROR) { ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result); - return static_cast(result); + return static_cast(result); } result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply); if (result != NO_ERROR) { ALOGE("getActiveColorMode failed to transact: %d", result); - return static_cast(result); + return static_cast(result); } - return static_cast(reply.readInt32()); + return static_cast(reply.readInt32()); } virtual status_t setActiveColorMode(const sp& display, - android_color_mode_t colorMode) { + ColorMode colorMode) { Parcel data, reply; status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); if (result != NO_ERROR) { @@ -412,7 +412,7 @@ public: ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result); return result; } - result = data.writeInt32(colorMode); + result = data.writeInt32(static_cast(colorMode)); if (result != NO_ERROR) { ALOGE("setActiveColorMode failed to writeInt32: %d", result); return result; @@ -739,7 +739,7 @@ status_t BnSurfaceComposer::onTransact( } case GET_DISPLAY_COLOR_MODES: { CHECK_INTERFACE(ISurfaceComposer, data, reply); - Vector colorModes; + Vector colorModes; sp display = nullptr; status_t result = data.readStrongBinder(&display); if (result != NO_ERROR) { @@ -751,7 +751,7 @@ status_t BnSurfaceComposer::onTransact( if (result == NO_ERROR) { reply->writeUint32(static_cast(colorModes.size())); for (size_t i = 0; i < colorModes.size(); ++i) { - reply->writeInt32(colorModes[i]); + reply->writeInt32(static_cast(colorModes[i])); } } return NO_ERROR; @@ -764,7 +764,7 @@ status_t BnSurfaceComposer::onTransact( ALOGE("getActiveColorMode failed to readStrongBinder: %d", result); return result; } - android_color_mode_t colorMode = getActiveColorMode(display); + ColorMode colorMode = getActiveColorMode(display); result = reply->writeInt32(static_cast(colorMode)); return result; } @@ -783,7 +783,7 @@ status_t BnSurfaceComposer::onTransact( return result; } result = setActiveColorMode(display, - static_cast(colorModeInt)); + static_cast(colorModeInt)); result = reply->writeInt32(result); return result; } diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index e08d6b0bae..2e1c24b755 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -326,7 +326,7 @@ status_t Surface::getWideColorSupport(bool* supported) { sp display( composerService()->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); - Vector colorModes; + Vector colorModes; status_t err = composerService()->getDisplayColorModes(display, &colorModes); @@ -338,11 +338,11 @@ status_t Surface::getWideColorSupport(bool* supported) { &ISurfaceFlingerConfigs::hasWideColorDisplay>(false); *supported = false; - for (android_color_mode_t colorMode : colorModes) { + for (ColorMode colorMode : colorModes) { switch (colorMode) { - case HAL_COLOR_MODE_DISPLAY_P3: - case HAL_COLOR_MODE_ADOBE_RGB: - case HAL_COLOR_MODE_DCI_P3: + case ColorMode::DISPLAY_P3: + case ColorMode::ADOBE_RGB: + case ColorMode::DCI_P3: if (wideColorBoardConfig) { *supported = true; } diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 0d7ffc3d71..61ed976fcc 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -698,16 +698,16 @@ status_t SurfaceComposerClient::setActiveConfig(const sp& display, int } status_t SurfaceComposerClient::getDisplayColorModes(const sp& display, - Vector* outColorModes) { + Vector* outColorModes) { return ComposerService::getComposerService()->getDisplayColorModes(display, outColorModes); } -android_color_mode_t SurfaceComposerClient::getActiveColorMode(const sp& display) { +ColorMode SurfaceComposerClient::getActiveColorMode(const sp& display) { return ComposerService::getComposerService()->getActiveColorMode(display); } status_t SurfaceComposerClient::setActiveColorMode(const sp& display, - android_color_mode_t colorMode) { + ColorMode colorMode) { return ComposerService::getComposerService()->setActiveColorMode(display, colorMode); } diff --git a/libs/gui/include/gui/ISurfaceComposer.h b/libs/gui/include/gui/ISurfaceComposer.h index 5ab64454e5..afe9358c0a 100644 --- a/libs/gui/include/gui/ISurfaceComposer.h +++ b/libs/gui/include/gui/ISurfaceComposer.h @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -160,10 +161,10 @@ public: virtual status_t setActiveConfig(const sp& display, int id) = 0; virtual status_t getDisplayColorModes(const sp& display, - Vector* outColorModes) = 0; - virtual android_color_mode_t getActiveColorMode(const sp& display) = 0; + Vector* outColorModes) = 0; + virtual ColorMode getActiveColorMode(const sp& display) = 0; virtual status_t setActiveColorMode(const sp& display, - android_color_mode_t colorMode) = 0; + ColorMode colorMode) = 0; /* Capture the specified screen. requires READ_FRAME_BUFFER permission * This function will fail if there is a secure window on screen. diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index fe46146ff5..162fe6e4e6 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -88,13 +89,13 @@ public: // Gets the list of supported color modes for the given display static status_t getDisplayColorModes(const sp& display, - Vector* outColorModes); + Vector* outColorModes); // Gets the active color mode for the given display - static android_color_mode_t getActiveColorMode(const sp& display); + static ColorMode getActiveColorMode(const sp& display); // Sets the active color mode for the given display - static status_t setActiveColorMode(const sp& display, android_color_mode_t colorMode); + static status_t setActiveColorMode(const sp& display, ColorMode colorMode); /* Triggers screen on/off or low power mode and waits for it to complete */ static void setDisplayPowerMode(const sp& display, int mode); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index 4fb51e1b96..66d5595fb9 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -577,15 +577,15 @@ public: return NO_ERROR; } status_t getDisplayColorModes(const sp& /*display*/, - Vector* /*outColorModes*/) override { + Vector* /*outColorModes*/) override { return NO_ERROR; } - android_color_mode_t getActiveColorMode(const sp& /*display*/) + ColorMode getActiveColorMode(const sp& /*display*/) override { - return HAL_COLOR_MODE_NATIVE; + return ColorMode::NATIVE; } status_t setActiveColorMode(const sp& /*display*/, - android_color_mode_t /*colorMode*/) override { return NO_ERROR; } + ColorMode /*colorMode*/) override { return NO_ERROR; } status_t captureScreen(const sp& /*display*/, sp* /*outBuffer*/, Rect /*sourceCrop*/, uint32_t /*reqWidth*/, uint32_t /*reqHeight*/, diff --git a/libs/ui/DebugUtils.cpp b/libs/ui/DebugUtils.cpp index 17ebf80329..d7e191db89 100644 --- a/libs/ui/DebugUtils.cpp +++ b/libs/ui/DebugUtils.cpp @@ -22,6 +22,7 @@ #include using android::base::StringPrintf; +using android::ColorMode; std::string decodeStandard(android_dataspace dataspace) { const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK); @@ -197,37 +198,37 @@ std::string dataspaceDetails(android_dataspace dataspace) { decodeRange(dataspace).c_str()); } -std::string decodeColorMode(android_color_mode colorMode) { +std::string decodeColorMode(ColorMode colorMode) { switch (colorMode) { - case HAL_COLOR_MODE_NATIVE: - return std::string("HAL_COLOR_MODE_NATIVE"); + case ColorMode::NATIVE: + return std::string("ColorMode::NATIVE"); - case HAL_COLOR_MODE_STANDARD_BT601_625: - return std::string("HAL_COLOR_MODE_BT601_625"); + case ColorMode::STANDARD_BT601_625: + return std::string("ColorMode::BT601_625"); - case HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED: - return std::string("HAL_COLOR_MODE_BT601_625_UNADJUSTED"); + case ColorMode::STANDARD_BT601_625_UNADJUSTED: + return std::string("ColorMode::BT601_625_UNADJUSTED"); - case HAL_COLOR_MODE_STANDARD_BT601_525: - return std::string("HAL_COLOR_MODE_BT601_525"); + case ColorMode::STANDARD_BT601_525: + return std::string("ColorMode::BT601_525"); - case HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED: - return std::string("HAL_COLOR_MODE_BT601_525_UNADJUSTED"); + case ColorMode::STANDARD_BT601_525_UNADJUSTED: + return std::string("ColorMode::BT601_525_UNADJUSTED"); - case HAL_COLOR_MODE_STANDARD_BT709: - return std::string("HAL_COLOR_MODE_BT709"); + case ColorMode::STANDARD_BT709: + return std::string("ColorMode::BT709"); - case HAL_COLOR_MODE_DCI_P3: - return std::string("HAL_COLOR_MODE_DCI_P3"); + case ColorMode::DCI_P3: + return std::string("ColorMode::DCI_P3"); - case HAL_COLOR_MODE_SRGB: - return std::string("HAL_COLOR_MODE_SRGB"); + case ColorMode::SRGB: + return std::string("ColorMode::SRGB"); - case HAL_COLOR_MODE_ADOBE_RGB: - return std::string("HAL_COLOR_MODE_ADOBE_RGB"); + case ColorMode::ADOBE_RGB: + return std::string("ColorMode::ADOBE_RGB"); - case HAL_COLOR_MODE_DISPLAY_P3: - return std::string("HAL_COLOR_MODE_DISPLAY_P3"); + case ColorMode::DISPLAY_P3: + return std::string("ColorMode::DISPLAY_P3"); } return android::base::StringPrintf("Unknown color mode %d", colorMode); diff --git a/libs/ui/include/ui/DebugUtils.h b/libs/ui/include/ui/DebugUtils.h index dad9446b3a..33701070a9 100644 --- a/libs/ui/include/ui/DebugUtils.h +++ b/libs/ui/include/ui/DebugUtils.h @@ -16,7 +16,7 @@ #pragma once -#include +#include #include #include @@ -29,6 +29,6 @@ std::string decodeStandard(android_dataspace dataspace); std::string decodeTransfer(android_dataspace dataspace); std::string decodeRange(android_dataspace dataspace); std::string dataspaceDetails(android_dataspace dataspace); -std::string decodeColorMode(android_color_mode colormode); +std::string decodeColorMode(android::ColorMode colormode); std::string decodePixelFormat(android::PixelFormat format); std::string to_string(const android::Rect& rect); diff --git a/libs/ui/include/ui/GraphicsTypes.h b/libs/ui/include/ui/GraphicsTypes.h new file mode 100644 index 0000000000..fa9a812d97 --- /dev/null +++ b/libs/ui/include/ui/GraphicsTypes.h @@ -0,0 +1,26 @@ +/* + * Copyright 2018 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 +#include + +namespace android { + +using android::hardware::graphics::common::V1_0::ColorMode; + +} // namespace android diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index d40666e6f1..92d5e21f34 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -99,7 +99,7 @@ DisplayDevice::DisplayDevice( mNativeWindow = surface = new Surface(producer, false); ANativeWindow* const window = mNativeWindow.get(); - mActiveColorMode = HAL_COLOR_MODE_NATIVE; + mActiveColorMode = ColorMode::NATIVE; mDisplayHasWideColor = supportWideColor; mDisplayHasHdr = supportHdr; @@ -292,11 +292,11 @@ int DisplayDevice::getActiveConfig() const { } // ---------------------------------------------------------------------------- -void DisplayDevice::setActiveColorMode(android_color_mode_t mode) { +void DisplayDevice::setActiveColorMode(ColorMode mode) { mActiveColorMode = mode; } -android_color_mode_t DisplayDevice::getActiveColorMode() const { +ColorMode DisplayDevice::getActiveColorMode() const { return mActiveColorMode; } diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index d5ed15fa28..737971f83d 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -31,6 +31,7 @@ #include #include +#include #include "RenderArea.h" #include "RenderEngine/Surface.h" @@ -155,8 +156,8 @@ public: void setPowerMode(int mode); bool isDisplayOn() const; - android_color_mode_t getActiveColorMode() const; - void setActiveColorMode(android_color_mode_t mode); + ColorMode getActiveColorMode() const; + void setActiveColorMode(ColorMode mode); void setCompositionDataSpace(android_dataspace dataspace); /* ------------------------------------------------------------------------ @@ -230,7 +231,7 @@ private: // Current active config int mActiveConfig; // current active color mode - android_color_mode_t mActiveColorMode; + ColorMode mActiveColorMode; // Need to know if display is wide-color capable or not. // Initialized by SurfaceFlinger when the DisplayDevice is created. @@ -279,7 +280,7 @@ public: bool needsFiltering() const override { return mDevice->needsFiltering(); } Rect getSourceCrop() const override { return mSourceCrop; } bool getWideColorSupport() const override { return mDevice->getWideColorSupport(); } - android_color_mode_t getActiveColorMode() const override { + ColorMode getActiveColorMode() const override { return mDevice->getActiveColorMode(); } diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index f14c2fe10b..b7bf964f29 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -362,9 +362,9 @@ Error Display::getChangedCompositionTypes( return Error::None; } -Error Display::getColorModes(std::vector* outModes) const +Error Display::getColorModes(std::vector* outModes) const { - std::vector modes; + std::vector modes; auto intError = mComposer.getColorModes(mId, &modes); uint32_t numModes = modes.size(); auto error = static_cast(intError); @@ -374,7 +374,7 @@ Error Display::getColorModes(std::vector* outModes) const outModes->resize(numModes); for (size_t i = 0; i < numModes; i++) { - (*outModes)[i] = static_cast(modes[i]); + (*outModes)[i] = modes[i]; } return Error::None; } @@ -537,10 +537,9 @@ Error Display::setClientTarget(uint32_t slot, const sp& target, return static_cast(intError); } -Error Display::setColorMode(android_color_mode_t mode) +Error Display::setColorMode(android::ColorMode mode) { - auto intError = mComposer.setColorMode( - mId, static_cast(mode)); + auto intError = mComposer.setColorMode(mId, mode); return static_cast(intError); } diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index e74f00dccc..0fc37ece56 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -209,7 +210,7 @@ public: [[clang::warn_unused_result]] Error getChangedCompositionTypes( std::unordered_map* outTypes); [[clang::warn_unused_result]] Error getColorModes( - std::vector* outModes) const; + std::vector* outModes) const; // Doesn't call into the HWC2 device, so no errors are possible std::vector> getConfigs() const; @@ -233,7 +234,7 @@ public: uint32_t slot, const android::sp& target, const android::sp& acquireFence, android_dataspace_t dataspace); - [[clang::warn_unused_result]] Error setColorMode(android_color_mode_t mode); + [[clang::warn_unused_result]] Error setColorMode(android::ColorMode mode); [[clang::warn_unused_result]] Error setColorTransform( const android::mat4& matrix, android_color_transform_t hint); [[clang::warn_unused_result]] Error setOutputBuffer( diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 2cafd8e9f9..6d5917db2f 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -311,8 +311,8 @@ std::shared_ptr return config; } -std::vector HWComposer::getColorModes(int32_t displayId) const { - std::vector modes; +std::vector HWComposer::getColorModes(int32_t displayId) const { + std::vector modes; if (!isValidDisplay(displayId)) { ALOGE("getColorModes: Attempted to access invalid display %d", @@ -324,13 +324,13 @@ std::vector HWComposer::getColorModes(int32_t displayId) c 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 std::vector(); } return modes; } -status_t HWComposer::setActiveColorMode(int32_t displayId, android_color_mode_t mode) { +status_t HWComposer::setActiveColorMode(int32_t displayId, ColorMode mode) { if (!isValidDisplay(displayId)) { ALOGE("setActiveColorMode: Display %d is not valid", displayId); return BAD_INDEX; diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index b75dc6adf7..c442b2f191 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -158,9 +159,9 @@ public: std::shared_ptr getActiveConfig(int32_t displayId) const; - std::vector getColorModes(int32_t displayId) const; + std::vector getColorModes(int32_t displayId) const; - status_t setActiveColorMode(int32_t displayId, android_color_mode_t mode); + status_t setActiveColorMode(int32_t displayId, ColorMode mode); bool isUsingVrComposer() const; diff --git a/services/surfaceflinger/RenderArea.h b/services/surfaceflinger/RenderArea.h index 940a34ce1c..b9c4909d5a 100644 --- a/services/surfaceflinger/RenderArea.h +++ b/services/surfaceflinger/RenderArea.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "Transform.h" #include @@ -30,7 +32,7 @@ public: int getReqWidth() const { return mReqWidth; }; Transform::orientation_flags getRotationFlags() const { return mRotationFlags; }; virtual bool getWideColorSupport() const = 0; - virtual android_color_mode_t getActiveColorMode() const = 0; + virtual ColorMode getActiveColorMode() const = 0; status_t updateDimensions(); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 38b93b110b..5dd5d7c9f2 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -913,7 +913,7 @@ status_t SurfaceFlinger::setActiveConfig(const sp& display, int mode) { return NO_ERROR; } status_t SurfaceFlinger::getDisplayColorModes(const sp& display, - Vector* outColorModes) { + Vector* outColorModes) { if ((outColorModes == nullptr) || (display.get() == nullptr)) { return BAD_VALUE; } @@ -934,7 +934,7 @@ status_t SurfaceFlinger::getDisplayColorModes(const sp& display, return type; } - std::vector modes; + std::vector modes; { ConditionalLock _l(mStateLock, std::this_thread::get_id() != mMainThreadId); @@ -946,18 +946,18 @@ status_t SurfaceFlinger::getDisplayColorModes(const sp& display, return NO_ERROR; } -android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp& display) { +ColorMode SurfaceFlinger::getActiveColorMode(const sp& display) { sp device(getDisplayDevice(display)); if (device != nullptr) { return device->getActiveColorMode(); } - return static_cast(BAD_VALUE); + return static_cast(BAD_VALUE); } void SurfaceFlinger::setActiveColorModeInternal(const sp& hw, - android_color_mode_t mode) { + ColorMode mode) { int32_t type = hw->getDisplayType(); - android_color_mode_t currentMode = hw->getActiveColorMode(); + ColorMode currentMode = hw->getActiveColorMode(); if (mode == currentMode) { return; @@ -977,20 +977,20 @@ void SurfaceFlinger::setActiveColorModeInternal(const sp& hw, status_t SurfaceFlinger::setActiveColorMode(const sp& display, - android_color_mode_t colorMode) { + ColorMode colorMode) { class MessageSetActiveColorMode: public MessageBase { SurfaceFlinger& mFlinger; sp mDisplay; - android_color_mode_t mMode; + ColorMode mMode; public: MessageSetActiveColorMode(SurfaceFlinger& flinger, const sp& disp, - android_color_mode_t mode) : + ColorMode mode) : mFlinger(flinger), mDisplay(disp) { mMode = mode; } virtual bool handler() { - Vector modes; + Vector modes; mFlinger.getDisplayColorModes(mDisplay, &modes); bool exists = std::find(std::begin(modes), std::end(modes), mMode) != std::end(modes); - if (mMode < 0 || !exists) { + if (mMode < ColorMode::NATIVE || !exists) { ALOGE("Attempt to set invalid active color mode %s (%d) for display %p", decodeColorMode(mMode).c_str(), mMode, mDisplay.get()); return true; @@ -1783,9 +1783,9 @@ mat4 SurfaceFlinger::computeSaturationMatrix() const { // pickColorMode translates a given dataspace into the best available color mode. // Currently only support sRGB and Display-P3. -android_color_mode SurfaceFlinger::pickColorMode(android_dataspace dataSpace) const { +ColorMode SurfaceFlinger::pickColorMode(android_dataspace dataSpace) const { if (mForceNativeColorMode) { - return HAL_COLOR_MODE_NATIVE; + return ColorMode::NATIVE; } switch (dataSpace) { @@ -1794,18 +1794,18 @@ android_color_mode SurfaceFlinger::pickColorMode(android_dataspace dataSpace) co case HAL_DATASPACE_UNKNOWN: case HAL_DATASPACE_SRGB: case HAL_DATASPACE_V0_SRGB: - return HAL_COLOR_MODE_SRGB; + return ColorMode::SRGB; break; case HAL_DATASPACE_DISPLAY_P3: - return HAL_COLOR_MODE_DISPLAY_P3; + return ColorMode::DISPLAY_P3; break; default: // TODO (courtneygo): Do we want to assert an error here? ALOGE("No color mode mapping for %s (%#x)", dataspaceDetails(dataSpace).c_str(), dataSpace); - return HAL_COLOR_MODE_SRGB; + return ColorMode::SRGB; break; } } @@ -1927,7 +1927,7 @@ void SurfaceFlinger::setUpHWComposer() { } if (hasWideColorDisplay) { - android_color_mode newColorMode; + ColorMode newColorMode; android_dataspace newDataSpace = HAL_DATASPACE_V0_SRGB; for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) { @@ -2269,13 +2269,13 @@ void SurfaceFlinger::processDisplayChangesLocked() { if (dispSurface != nullptr) { bool hasWideColorSupport = false; if (hasWideColorDisplay) { - std::vector modes = + std::vector modes = getHwComposer().getColorModes(state.type); - for (android_color_mode_t colorMode : modes) { + for (ColorMode colorMode : modes) { switch (colorMode) { - case HAL_COLOR_MODE_DISPLAY_P3: - case HAL_COLOR_MODE_ADOBE_RGB: - case HAL_COLOR_MODE_DCI_P3: + case ColorMode::DISPLAY_P3: + case ColorMode::ADOBE_RGB: + case ColorMode::DCI_P3: hasWideColorSupport = true; break; default: @@ -2298,9 +2298,9 @@ void SurfaceFlinger::processDisplayChangesLocked() { dispSurface, producer, hasWideColorSupport, hasHdrSupport); - android_color_mode defaultColorMode = HAL_COLOR_MODE_NATIVE; + ColorMode defaultColorMode = ColorMode::NATIVE; if (hasWideColorSupport) { - defaultColorMode = HAL_COLOR_MODE_SRGB; + defaultColorMode = ColorMode::SRGB; } setActiveColorModeInternal(hw, defaultColorMode); hw->setCompositionDataSpace(HAL_DATASPACE_UNKNOWN); @@ -2741,7 +2741,7 @@ bool SurfaceFlinger::doComposeSurfaces(const sp& displayDev android_dataspace outputDataspace = HAL_DATASPACE_UNKNOWN; if (displayDevice->getWideColorSupport() && - displayDevice->getActiveColorMode() == HAL_COLOR_MODE_DISPLAY_P3) { + displayDevice->getActiveColorMode() == ColorMode::DISPLAY_P3) { outputDataspace = HAL_DATASPACE_DISPLAY_P3; } getBE().mRenderEngine->setOutputDataSpace(outputDataspace); @@ -3879,12 +3879,12 @@ void SurfaceFlinger::dumpWideColorInfo(String8& result) const { } result.appendFormat("Display %d color modes:\n", hwcId); - std::vector modes = getHwComposer().getColorModes(hwcId); + std::vector modes = getHwComposer().getColorModes(hwcId); for (auto&& mode : modes) { result.appendFormat(" %s (%d)\n", decodeColorMode(mode).c_str(), mode); } - android_color_mode_t currentMode = displayDevice->getActiveColorMode(); + ColorMode currentMode = displayDevice->getActiveColorMode(); result.appendFormat(" Current color mode: %s (%d)\n", decodeColorMode(currentMode).c_str(), currentMode); } @@ -4476,7 +4476,7 @@ status_t SurfaceFlinger::captureLayers(const sp& layerHandleBinder, } } bool getWideColorSupport() const override { return false; } - android_color_mode_t getActiveColorMode() const override { return HAL_COLOR_MODE_NATIVE; } + ColorMode getActiveColorMode() const override { return ColorMode::NATIVE; } private: const sp mLayer; @@ -4650,7 +4650,7 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, android_dataspace outputDataspace = HAL_DATASPACE_UNKNOWN; if (renderArea.getWideColorSupport() && - renderArea.getActiveColorMode() == HAL_COLOR_MODE_DISPLAY_P3) { + renderArea.getActiveColorMode() == ColorMode::DISPLAY_P3) { outputDataspace = HAL_DATASPACE_DISPLAY_P3; } getBE().mRenderEngine->setOutputDataSpace(outputDataspace); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 33786e8558..104adef4d3 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -394,9 +394,9 @@ private: Vector* configs); virtual int getActiveConfig(const sp& display); virtual status_t getDisplayColorModes(const sp& display, - Vector* configs); - virtual android_color_mode_t getActiveColorMode(const sp& display); - virtual status_t setActiveColorMode(const sp& display, android_color_mode_t colorMode); + Vector* configs); + virtual ColorMode getActiveColorMode(const sp& display); + virtual status_t setActiveColorMode(const sp& display, ColorMode colorMode); virtual void setPowerMode(const sp& display, int mode); virtual status_t setActiveConfig(const sp& display, int id); virtual status_t clearAnimationFrameStats(); @@ -446,7 +446,7 @@ private: bool stateLockHeld); // Called on the main thread in response to setActiveColorMode() - void setActiveColorModeInternal(const sp& hw, android_color_mode_t colorMode); + void setActiveColorModeInternal(const sp& hw, ColorMode colorMode); // Returns whether the transaction actually modified any state bool handleMessageTransaction(); @@ -619,7 +619,7 @@ private: // Given a dataSpace, returns the appropriate color_mode to use // to display that dataSpace. - android_color_mode pickColorMode(android_dataspace dataSpace) const; + ColorMode pickColorMode(android_dataspace dataSpace) const; android_dataspace bestTargetDataSpace(android_dataspace a, android_dataspace b, bool hasHdr) const; diff --git a/services/surfaceflinger/layerproto/Android.bp b/services/surfaceflinger/layerproto/Android.bp index 485090c778..ac147fe182 100644 --- a/services/surfaceflinger/layerproto/Android.bp +++ b/services/surfaceflinger/layerproto/Android.bp @@ -10,6 +10,7 @@ cc_library_shared { ], shared_libs: [ + "android.hardware.graphics.common@1.1", "libui", "libprotobuf-cpp-lite", "libbase", diff --git a/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp b/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp index 4878c140ed..86e2e1ec30 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp +++ b/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #define HWC2_INCLUDE_STRINGIFICATION #define HWC2_USE_CPP11 @@ -34,6 +35,8 @@ #include "Hwc2TestClientTarget.h" #include "Hwc2TestVirtualDisplay.h" +using android::ColorMode; + void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, hwc2_display_t display, int32_t connected); void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData, @@ -865,7 +868,7 @@ public: } void getColorModes(hwc2_display_t display, - std::vector* outColorModes, + std::vector* outColorModes, hwc2_error_t* outErr = nullptr) { auto pfn = reinterpret_cast( @@ -892,7 +895,7 @@ public: } } - void setColorMode(hwc2_display_t display, android_color_mode_t colorMode, + void setColorMode(hwc2_display_t display, ColorMode colorMode, hwc2_error_t* outErr = nullptr) { auto pfn = reinterpret_cast( @@ -905,7 +908,7 @@ public: *outErr = err; } else { ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color mode " - << colorMode; + << static_cast(colorMode); } } @@ -4252,33 +4255,33 @@ TEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display) EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; } -static const std::array androidColorModes = {{ - HAL_COLOR_MODE_NATIVE, - HAL_COLOR_MODE_STANDARD_BT601_625, - HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED, - HAL_COLOR_MODE_STANDARD_BT601_525, - HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED, - HAL_COLOR_MODE_STANDARD_BT709, - HAL_COLOR_MODE_DCI_P3, - HAL_COLOR_MODE_SRGB, - HAL_COLOR_MODE_ADOBE_RGB, +static const std::array androidColorModes = {{ + ColorMode::NATIVE, + ColorMode::STANDARD_BT601_625, + ColorMode::STANDARD_BT601_625_UNADJUSTED, + ColorMode::STANDARD_BT601_525, + ColorMode::STANDARD_BT601_525_UNADJUSTED, + ColorMode::STANDARD_BT709, + ColorMode::DCI_P3, + ColorMode::SRGB, + ColorMode::ADOBE_RGB, }}; /* TESTCASE: Tests that the HWC2 can get the color modes for a display. The - * display must support HAL_COLOR_MODE_NATIVE */ + * display must support ColorMode::NATIVE */ TEST_F(Hwc2Test, GET_COLOR_MODES) { ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig( [] (Hwc2Test* test, hwc2_display_t display) { - std::vector colorModes; + std::vector colorModes; ASSERT_NO_FATAL_FAILURE(test->getColorModes(display, &colorModes)); EXPECT_NE(std::count(colorModes.begin(), colorModes.end(), - HAL_COLOR_MODE_NATIVE), 0) << "all displays" - " must support HAL_COLOR_MODE_NATIVE"; + ColorMode::NATIVE), 0) << "all displays" + " must support ColorMode::NATIVE"; } )); } @@ -4287,7 +4290,7 @@ TEST_F(Hwc2Test, GET_COLOR_MODES) TEST_F(Hwc2Test, GET_COLOR_MODES_bad_display) { hwc2_display_t display; - std::vector colorModes; + std::vector colorModes; hwc2_error_t err = HWC2_ERROR_NONE; ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); @@ -4302,7 +4305,7 @@ TEST_F(Hwc2Test, SET_COLOR_MODES) ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig( [] (Hwc2Test* test, hwc2_display_t display) { - const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE; + const ColorMode colorMode = ColorMode::NATIVE; EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode)); } @@ -4313,7 +4316,7 @@ TEST_F(Hwc2Test, SET_COLOR_MODES) TEST_F(Hwc2Test, SET_COLOR_MODES_bad_display) { hwc2_display_t display; - const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE; + const ColorMode colorMode = ColorMode::NATIVE; hwc2_error_t err = HWC2_ERROR_NONE; ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); @@ -4328,8 +4331,7 @@ TEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter) ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig( [] (Hwc2Test* test, hwc2_display_t display) { - const android_color_mode_t colorMode = - static_cast(-1); + const ColorMode colorMode = static_cast(-1); hwc2_error_t err = HWC2_ERROR_NONE; ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode, -- cgit v1.2.3-59-g8ed1b From fd997e0969100418b4df8b8d97d21d497afa76c3 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Wed, 28 Mar 2018 15:29:00 -0700 Subject: Add proper namespace to GraphicTypes. Renamed GraphicsTypes.h to GraphicTypes.h and added proper namespace to avoid naming conflict. BUG: 77156734 Test: Build and flash Change-Id: Ibd9f454b5b72d5f8c6d94a3869a60a1bf821f106 Merged-In: Ibd9f454b5b72d5f8c6d94a3869a60a1bf821f106 --- libs/gui/ISurfaceComposer.cpp | 2 ++ libs/gui/Surface.cpp | 2 ++ libs/gui/SurfaceComposerClient.cpp | 2 ++ libs/gui/include/gui/ISurfaceComposer.h | 8 +++--- libs/gui/include/gui/SurfaceComposerClient.h | 9 ++++--- libs/gui/tests/Surface_test.cpp | 1 + libs/ui/DebugUtils.cpp | 2 +- libs/ui/include/ui/DebugUtils.h | 4 +-- libs/ui/include/ui/GraphicTypes.h | 30 ++++++++++++++++++++++ libs/ui/include/ui/GraphicsTypes.h | 26 ------------------- services/surfaceflinger/DisplayDevice.cpp | 7 ++--- services/surfaceflinger/DisplayDevice.h | 10 ++++---- services/surfaceflinger/DisplayHardware/HWC2.cpp | 18 +++---------- services/surfaceflinger/DisplayHardware/HWC2.h | 11 ++++---- .../surfaceflinger/DisplayHardware/HWComposer.cpp | 8 +++--- .../surfaceflinger/DisplayHardware/HWComposer.h | 6 ++--- services/surfaceflinger/RenderArea.h | 4 +-- services/surfaceflinger/SurfaceFlinger.cpp | 1 + services/surfaceflinger/SurfaceFlinger.h | 10 ++++---- services/surfaceflinger/tests/hwc2/Hwc2Test.cpp | 4 +-- 20 files changed, 85 insertions(+), 80 deletions(-) create mode 100644 libs/ui/include/ui/GraphicTypes.h delete mode 100644 libs/ui/include/ui/GraphicsTypes.h (limited to 'libs/ui/DebugUtils.cpp') diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index 0244bb512e..e22bc708c9 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -43,6 +43,8 @@ namespace android { +using ui::ColorMode; + class BpSurfaceComposer : public BpInterface { public: diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 2e1c24b755..6a1aebd6d6 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -44,6 +44,8 @@ namespace android { +using ui::ColorMode; + Surface::Surface(const sp& bufferProducer, bool controlledByApp) : mGraphicBufferProducer(bufferProducer), mCrop(Rect::EMPTY_RECT), diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 4c041bc4f5..bbf681ea90 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -43,6 +43,8 @@ #include namespace android { + +using ui::ColorMode; // --------------------------------------------------------------------------- ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); diff --git a/libs/gui/include/gui/ISurfaceComposer.h b/libs/gui/include/gui/ISurfaceComposer.h index afe9358c0a..3591090172 100644 --- a/libs/gui/include/gui/ISurfaceComposer.h +++ b/libs/gui/include/gui/ISurfaceComposer.h @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include @@ -161,10 +161,10 @@ public: virtual status_t setActiveConfig(const sp& display, int id) = 0; virtual status_t getDisplayColorModes(const sp& display, - Vector* outColorModes) = 0; - virtual ColorMode getActiveColorMode(const sp& display) = 0; + Vector* outColorModes) = 0; + virtual ui::ColorMode getActiveColorMode(const sp& display) = 0; virtual status_t setActiveColorMode(const sp& display, - ColorMode colorMode) = 0; + ui::ColorMode colorMode) = 0; /* Capture the specified screen. requires READ_FRAME_BUFFER permission * This function will fail if there is a secure window on screen. diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index b45ce4f86c..ffc22f6437 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include @@ -89,13 +89,14 @@ public: // Gets the list of supported color modes for the given display static status_t getDisplayColorModes(const sp& display, - Vector* outColorModes); + Vector* outColorModes); // Gets the active color mode for the given display - static ColorMode getActiveColorMode(const sp& display); + static ui::ColorMode getActiveColorMode(const sp& display); // Sets the active color mode for the given display - static status_t setActiveColorMode(const sp& display, ColorMode colorMode); + static status_t setActiveColorMode(const sp& display, + ui::ColorMode colorMode); /* Triggers screen on/off or low power mode and waits for it to complete */ static void setDisplayPowerMode(const sp& display, int mode); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index df391ed4bb..2c02ba657d 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -42,6 +42,7 @@ using namespace std::chrono_literals; // retrieve wide-color and hdr settings from configstore using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; +using ui::ColorMode; using Transaction = SurfaceComposerClient::Transaction; diff --git a/libs/ui/DebugUtils.cpp b/libs/ui/DebugUtils.cpp index d7e191db89..d7d8618703 100644 --- a/libs/ui/DebugUtils.cpp +++ b/libs/ui/DebugUtils.cpp @@ -22,7 +22,7 @@ #include using android::base::StringPrintf; -using android::ColorMode; +using android::ui::ColorMode; std::string decodeStandard(android_dataspace dataspace) { const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK); diff --git a/libs/ui/include/ui/DebugUtils.h b/libs/ui/include/ui/DebugUtils.h index 33701070a9..6350d0cf95 100644 --- a/libs/ui/include/ui/DebugUtils.h +++ b/libs/ui/include/ui/DebugUtils.h @@ -16,7 +16,7 @@ #pragma once -#include +#include #include #include @@ -29,6 +29,6 @@ std::string decodeStandard(android_dataspace dataspace); std::string decodeTransfer(android_dataspace dataspace); std::string decodeRange(android_dataspace dataspace); std::string dataspaceDetails(android_dataspace dataspace); -std::string decodeColorMode(android::ColorMode colormode); +std::string decodeColorMode(android::ui::ColorMode colormode); std::string decodePixelFormat(android::PixelFormat format); std::string to_string(const android::Rect& rect); diff --git a/libs/ui/include/ui/GraphicTypes.h b/libs/ui/include/ui/GraphicTypes.h new file mode 100644 index 0000000000..39893b268a --- /dev/null +++ b/libs/ui/include/ui/GraphicTypes.h @@ -0,0 +1,30 @@ +/* + * Copyright 2018 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 +#include + +// android::ui::* in this header file will alias different types as +// the HIDL interface is updated. +namespace android { +namespace ui { + +using android::hardware::graphics::common::V1_0::ColorMode; + +} // namespace ui +} // namespace android diff --git a/libs/ui/include/ui/GraphicsTypes.h b/libs/ui/include/ui/GraphicsTypes.h deleted file mode 100644 index fa9a812d97..0000000000 --- a/libs/ui/include/ui/GraphicsTypes.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2018 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 -#include - -namespace android { - -using android::hardware::graphics::common::V1_0::ColorMode; - -} // namespace android diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index fe0b30ba35..bab6a71057 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -49,13 +49,12 @@ #include #include -// ---------------------------------------------------------------------------- -using namespace android; -// ---------------------------------------------------------------------------- +namespace android { // retrieve triple buffer setting from configstore using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; +using android::ui::ColorMode; /* * Initialize the display to the specified values. @@ -474,3 +473,5 @@ DisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isS viewport.makeInvalid(); frame.makeInvalid(); } + +} // namespace android diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index fbb0d462f3..df729f5ce9 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -31,7 +31,7 @@ #include #include -#include +#include #include "RenderArea.h" #include "RenderEngine/Surface.h" @@ -161,8 +161,8 @@ public: void setPowerMode(int mode); bool isDisplayOn() const; - ColorMode getActiveColorMode() const; - void setActiveColorMode(ColorMode mode); + ui::ColorMode getActiveColorMode() const; + void setActiveColorMode(ui::ColorMode mode); void setCompositionDataSpace(android_dataspace dataspace); /* ------------------------------------------------------------------------ @@ -236,7 +236,7 @@ private: // Current active config int mActiveConfig; // current active color mode - ColorMode mActiveColorMode; + ui::ColorMode mActiveColorMode; // Need to know if display is wide-color capable or not. // Initialized by SurfaceFlinger when the DisplayDevice is created. @@ -285,7 +285,7 @@ public: bool needsFiltering() const override { return mDevice->needsFiltering(); } Rect getSourceCrop() const override { return mSourceCrop; } bool getWideColorSupport() const override { return mDevice->getWideColorSupport(); } - ColorMode getActiveColorMode() const override { + ui::ColorMode getActiveColorMode() const override { return mDevice->getActiveColorMode(); } diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 0c77aba498..98daec3e47 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -362,20 +362,10 @@ Error Display::getChangedCompositionTypes( return Error::None; } -Error Display::getColorModes(std::vector* outModes) const +Error Display::getColorModes(std::vector* outModes) const { - std::vector modes; - auto intError = mComposer.getColorModes(mId, &modes); - uint32_t numModes = modes.size(); - auto error = static_cast(intError); - if (error != Error::None) { - return error; - } - - outModes->resize(numModes); - for (size_t i = 0; i < numModes; i++) { - (*outModes)[i] = modes[i]; - } + auto intError = mComposer.getColorModes(mId, outModes); + return static_cast(intError); return Error::None; } @@ -537,7 +527,7 @@ Error Display::setClientTarget(uint32_t slot, const sp& target, return static_cast(intError); } -Error Display::setColorMode(android::ColorMode mode) +Error Display::setColorMode(android::ui::ColorMode mode) { auto intError = mComposer.setColorMode(mId, mode); return static_cast(intError); diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index 5b53b54d71..71c094a035 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include @@ -211,7 +211,7 @@ public: [[clang::warn_unused_result]] Error getChangedCompositionTypes( std::unordered_map* outTypes); [[clang::warn_unused_result]] Error getColorModes( - std::vector* outModes) const; + std::vector* outModes) const; // Doesn't call into the HWC2 device, so no errors are possible std::vector> getConfigs() const; @@ -235,7 +235,8 @@ public: uint32_t slot, const android::sp& target, const android::sp& acquireFence, android_dataspace_t dataspace); - [[clang::warn_unused_result]] Error setColorMode(android::ColorMode mode); + [[clang::warn_unused_result]] Error setColorMode( + android::ui::ColorMode mode); [[clang::warn_unused_result]] Error setColorTransform( const android::mat4& matrix, android_color_transform_t hint); [[clang::warn_unused_result]] Error setOutputBuffer( @@ -246,8 +247,8 @@ public: [[clang::warn_unused_result]] Error validate(uint32_t* outNumTypes, uint32_t* outNumRequests); [[clang::warn_unused_result]] Error presentOrValidate(uint32_t* outNumTypes, - uint32_t* outNumRequests, - android::sp* outPresentFence, uint32_t* state); + uint32_t* outNumRequests, + android::sp* outPresentFence, uint32_t* state); // Other Display methods diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 6d5917db2f..6bf2ee9362 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -311,8 +311,8 @@ std::shared_ptr return config; } -std::vector HWComposer::getColorModes(int32_t displayId) const { - std::vector modes; +std::vector HWComposer::getColorModes(int32_t displayId) const { + std::vector modes; if (!isValidDisplay(displayId)) { ALOGE("getColorModes: Attempted to access invalid display %d", @@ -324,13 +324,13 @@ std::vector HWComposer::getColorModes(int32_t displayId) const { 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 std::vector(); } return modes; } -status_t HWComposer::setActiveColorMode(int32_t displayId, ColorMode mode) { +status_t HWComposer::setActiveColorMode(int32_t displayId, ui::ColorMode mode) { if (!isValidDisplay(displayId)) { ALOGE("setActiveColorMode: Display %d is not valid", displayId); return BAD_INDEX; diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index c442b2f191..0366a0d164 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include @@ -159,9 +159,9 @@ public: std::shared_ptr getActiveConfig(int32_t displayId) const; - std::vector getColorModes(int32_t displayId) const; + std::vector getColorModes(int32_t displayId) const; - status_t setActiveColorMode(int32_t displayId, ColorMode mode); + status_t setActiveColorMode(int32_t displayId, ui::ColorMode mode); bool isUsingVrComposer() const; diff --git a/services/surfaceflinger/RenderArea.h b/services/surfaceflinger/RenderArea.h index b9c4909d5a..bf0707f13b 100644 --- a/services/surfaceflinger/RenderArea.h +++ b/services/surfaceflinger/RenderArea.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include "Transform.h" @@ -32,7 +32,7 @@ public: int getReqWidth() const { return mReqWidth; }; Transform::orientation_flags getRotationFlags() const { return mRotationFlags; }; virtual bool getWideColorSupport() const = 0; - virtual ColorMode getActiveColorMode() const = 0; + virtual ui::ColorMode getActiveColorMode() const = 0; status_t updateDimensions(); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 5c69b98b98..09e67b62cb 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -104,6 +104,7 @@ namespace android { using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; +using ui::ColorMode; namespace { class ConditionalLock { diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 42d8112b90..448509bc8f 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -410,9 +410,9 @@ private: Vector* configs); virtual int getActiveConfig(const sp& display); virtual status_t getDisplayColorModes(const sp& display, - Vector* configs); - virtual ColorMode getActiveColorMode(const sp& display); - virtual status_t setActiveColorMode(const sp& display, ColorMode colorMode); + Vector* configs); + virtual ui::ColorMode getActiveColorMode(const sp& display); + virtual status_t setActiveColorMode(const sp& display, ui::ColorMode colorMode); virtual void setPowerMode(const sp& display, int mode); virtual status_t setActiveConfig(const sp& display, int id); virtual status_t clearAnimationFrameStats(); @@ -462,7 +462,7 @@ private: bool stateLockHeld); // Called on the main thread in response to setActiveColorMode() - void setActiveColorModeInternal(const sp& hw, ColorMode colorMode); + void setActiveColorModeInternal(const sp& hw, ui::ColorMode colorMode); // Returns whether the transaction actually modified any state bool handleMessageTransaction(); @@ -635,7 +635,7 @@ private: // Given a dataSpace, returns the appropriate color_mode to use // to display that dataSpace. - ColorMode pickColorMode(android_dataspace dataSpace) const; + ui::ColorMode pickColorMode(android_dataspace dataSpace) const; android_dataspace bestTargetDataSpace(android_dataspace a, android_dataspace b, bool hasHdr) const; diff --git a/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp b/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp index 86e2e1ec30..b3f1b69f71 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp +++ b/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp @@ -22,7 +22,7 @@ #include #include #include -#include +#include #define HWC2_INCLUDE_STRINGIFICATION #define HWC2_USE_CPP11 @@ -35,7 +35,7 @@ #include "Hwc2TestClientTarget.h" #include "Hwc2TestVirtualDisplay.h" -using android::ColorMode; +using android::ui::ColorMode; void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, hwc2_display_t display, int32_t connected); -- cgit v1.2.3-59-g8ed1b From 7c64f17bd0d70aec63b475c3de850dcf3abaff33 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 7 Mar 2018 14:52:28 -0800 Subject: Implement Display Layer Stats V0.1 Try to collect data for analyzing how many display controller layers we need and what we use them for. This change will collect additional data from per frame point of view. Test: adb shell dumpsys SurfaceFlinger --enable-layer-stats Test: adb shell dumpsys SurfaceFlinger --disable-layer-stats Test: adb shell dumpsys SurfaceFlinger --clear-layer-stats Test: adb shell dumpsys SurfaceFlinger --dump-layer-stats Bug: b/75953772 Change-Id: Ib48777df7e1fed637be7eb1aefbdf1808d1daccd Merged-In: Ib48777df7e1fed637be7eb1aefbdf1808d1daccd --- libs/ui/DebugUtils.cpp | 27 ++++++ libs/ui/include/ui/DebugUtils.h | 1 + services/surfaceflinger/DisplayDevice.cpp | 11 +++ services/surfaceflinger/DisplayDevice.h | 6 ++ services/surfaceflinger/Layer.cpp | 11 +++ services/surfaceflinger/LayerStats.cpp | 97 +++++++++++++++++----- services/surfaceflinger/LayerStats.h | 19 +++-- services/surfaceflinger/SurfaceFlinger.cpp | 11 ++- .../surfaceflinger/layerproto/LayerProtoParser.cpp | 9 +- .../include/layerproto/LayerProtoParser.h | 5 ++ services/surfaceflinger/layerproto/layers.proto | 7 ++ 11 files changed, 171 insertions(+), 33 deletions(-) (limited to 'libs/ui/DebugUtils.cpp') diff --git a/libs/ui/DebugUtils.cpp b/libs/ui/DebugUtils.cpp index d7d8618703..58fed84ea8 100644 --- a/libs/ui/DebugUtils.cpp +++ b/libs/ui/DebugUtils.cpp @@ -234,6 +234,33 @@ std::string decodeColorMode(ColorMode colorMode) { return android::base::StringPrintf("Unknown color mode %d", colorMode); } +std::string decodeColorTransform(android_color_transform colorTransform) { + switch (colorTransform) { + case HAL_COLOR_TRANSFORM_IDENTITY: + return std::string("Identity"); + + case HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX: + return std::string("Arbitrary matrix"); + + case HAL_COLOR_TRANSFORM_VALUE_INVERSE: + return std::string("Inverse value"); + + case HAL_COLOR_TRANSFORM_GRAYSCALE: + return std::string("Grayscale"); + + case HAL_COLOR_TRANSFORM_CORRECT_PROTANOPIA: + return std::string("Correct protanopia"); + + case HAL_COLOR_TRANSFORM_CORRECT_DEUTERANOPIA: + return std::string("Correct deuteranopia"); + + case HAL_COLOR_TRANSFORM_CORRECT_TRITANOPIA: + return std::string("Correct tritanopia"); + } + + return android::base::StringPrintf("Unknown color transform %d", colorTransform); +} + // Converts a PixelFormat to a human-readable string. Max 11 chars. // (Could use a table of prefab String8 objects.) std::string decodePixelFormat(android::PixelFormat format) { diff --git a/libs/ui/include/ui/DebugUtils.h b/libs/ui/include/ui/DebugUtils.h index 6350d0cf95..5e5df43740 100644 --- a/libs/ui/include/ui/DebugUtils.h +++ b/libs/ui/include/ui/DebugUtils.h @@ -30,5 +30,6 @@ std::string decodeTransfer(android_dataspace dataspace); std::string decodeRange(android_dataspace dataspace); std::string dataspaceDetails(android_dataspace dataspace); std::string decodeColorMode(android::ui::ColorMode colormode); +std::string decodeColorTransform(android_color_transform colorTransform); std::string decodePixelFormat(android::PixelFormat format); std::string to_string(const android::Rect& rect); diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 93cb849e28..8281ce0f56 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -97,6 +97,7 @@ DisplayDevice::DisplayDevice( mPowerMode(initialPowerMode), mActiveConfig(0), mActiveColorMode(ColorMode::NATIVE), + mColorTransform(HAL_COLOR_TRANSFORM_IDENTITY), mDisplayHasWideColor(supportWideColor), mDisplayHasHdr(supportHdr) { @@ -267,6 +268,16 @@ ColorMode DisplayDevice::getActiveColorMode() const { return mActiveColorMode; } +void DisplayDevice::setColorTransform(const mat4& transform) { + const bool isIdentity = (transform == mat4()); + mColorTransform = + isIdentity ? HAL_COLOR_TRANSFORM_IDENTITY : HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX; +} + +android_color_transform_t DisplayDevice::getColorTransform() const { + return mColorTransform; +} + void DisplayDevice::setCompositionDataSpace(android_dataspace dataspace) { ANativeWindow* const window = mNativeWindow.get(); native_window_set_buffers_data_space(window, dataspace); diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index df729f5ce9..31bb4d0778 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -21,6 +21,8 @@ #include +#include + #include #include @@ -163,6 +165,8 @@ public: ui::ColorMode getActiveColorMode() const; void setActiveColorMode(ui::ColorMode mode); + android_color_transform_t getColorTransform() const; + void setColorTransform(const mat4& transform); void setCompositionDataSpace(android_dataspace dataspace); /* ------------------------------------------------------------------------ @@ -237,6 +241,8 @@ private: int mActiveConfig; // current active color mode ui::ColorMode mActiveColorMode; + // Current color transform + android_color_transform_t mColorTransform; // Need to know if display is wide-color capable or not. // Initialized by SurfaceFlinger when the DisplayDevice is created. diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index c3eb1bc85f..5c945edb5f 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -42,6 +42,7 @@ #include #include +#include "BufferLayer.h" #include "Colorizer.h" #include "DisplayDevice.h" #include "Layer.h" @@ -1937,6 +1938,16 @@ void Layer::writeToProto(LayerProto* layerInfo, int32_t hwcId) { const int32_t transform = static_cast(hwcInfo.transform); layerInfo->set_hwc_transform(transform); + + const int32_t compositionType = static_cast(hwcInfo.compositionType); + layerInfo->set_hwc_composition_type(compositionType); + + if (std::strcmp(getTypeId(), "BufferLayer") == 0 && + static_cast(this)->isProtected()) { + layerInfo->set_is_protected(true); + } else { + layerInfo->set_is_protected(false); + } } // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/LayerStats.cpp b/services/surfaceflinger/LayerStats.cpp index dc99b41cc6..38ea6edfc5 100644 --- a/services/surfaceflinger/LayerStats.cpp +++ b/services/surfaceflinger/LayerStats.cpp @@ -19,6 +19,7 @@ #include "LayerStats.h" #include "DisplayHardware/HWComposer.h" +#include "ui/DebugUtils.h" #include #include @@ -31,7 +32,7 @@ void LayerStats::enable() { ATRACE_CALL(); std::lock_guard lock(mMutex); if (mEnabled) return; - mLayerStatsMap.clear(); + mLayerShapeStatsMap.clear(); mEnabled = true; ALOGD("Logging enabled"); } @@ -47,7 +48,7 @@ void LayerStats::disable() { void LayerStats::clear() { ATRACE_CALL(); std::lock_guard lock(mMutex); - mLayerStatsMap.clear(); + mLayerShapeStatsMap.clear(); ALOGD("Cleared current layer stats"); } @@ -57,42 +58,69 @@ bool LayerStats::isEnabled() { void LayerStats::traverseLayerTreeStatsLocked( std::vector> layerTree, - const LayerProtoParser::LayerGlobal* layerGlobal) { + const LayerProtoParser::LayerGlobal* layerGlobal, std::vector& layerShapeVec) { for (std::unique_ptr& layer : layerTree) { if (!layer) continue; - traverseLayerTreeStatsLocked(std::move(layer->children), layerGlobal); - std::string key = - base::StringPrintf("%s,%s,%s,%s,%s,%s,%s,%s,%s", - destinationLocation(layer->hwcFrame.left, - layerGlobal->resolution[0], true), - destinationLocation(layer->hwcFrame.top, - layerGlobal->resolution[1], false), - destinationSize(layer->hwcFrame.right - layer->hwcFrame.left, - layerGlobal->resolution[0], true), - destinationSize(layer->hwcFrame.bottom - layer->hwcFrame.top, - layerGlobal->resolution[1], false), - layer->type.c_str(), scaleRatioWH(layer.get()).c_str(), - layerTransform(layer->hwcTransform), layer->pixelFormat.c_str(), - layer->dataspace.c_str()); - mLayerStatsMap[key]++; + traverseLayerTreeStatsLocked(std::move(layer->children), layerGlobal, layerShapeVec); + std::string key = ""; + base::StringAppendF(&key, ",%s", layer->type.c_str()); + base::StringAppendF(&key, ",%s", layerCompositionType(layer->hwcCompositionType)); + base::StringAppendF(&key, ",%d", layer->isProtected); + base::StringAppendF(&key, ",%s", layerTransform(layer->hwcTransform)); + base::StringAppendF(&key, ",%s", layerPixelFormat(layer->activeBuffer.format)); + base::StringAppendF(&key, ",%s", layer->dataspace.c_str()); + base::StringAppendF(&key, ",%s", + destinationLocation(layer->hwcFrame.left, layerGlobal->resolution[0], + true)); + base::StringAppendF(&key, ",%s", + destinationLocation(layer->hwcFrame.top, layerGlobal->resolution[1], + false)); + base::StringAppendF(&key, ",%s", + destinationSize(layer->hwcFrame.right - layer->hwcFrame.left, + layerGlobal->resolution[0], true)); + base::StringAppendF(&key, ",%s", + destinationSize(layer->hwcFrame.bottom - layer->hwcFrame.top, + layerGlobal->resolution[1], false)); + base::StringAppendF(&key, ",%s", scaleRatioWH(layer.get()).c_str()); + base::StringAppendF(&key, ",%s", alpha(static_cast(layer->color.a))); + + layerShapeVec.push_back(key); + ALOGV("%s", key.c_str()); } } void LayerStats::logLayerStats(const LayersProto& layersProto) { ATRACE_CALL(); + ALOGV("Logging"); auto layerGlobal = LayerProtoParser::generateLayerGlobalInfo(layersProto); auto layerTree = LayerProtoParser::generateLayerTree(layersProto); + std::vector layerShapeVec; + std::lock_guard lock(mMutex); - traverseLayerTreeStatsLocked(std::move(layerTree), &layerGlobal); + traverseLayerTreeStatsLocked(std::move(layerTree), &layerGlobal, layerShapeVec); + + std::string layerShapeKey = + base::StringPrintf("%d,%s,%s,%s", static_cast(layerShapeVec.size()), + layerGlobal.colorMode.c_str(), layerGlobal.colorTransform.c_str(), + layerTransform(layerGlobal.globalTransform)); + ALOGV("%s", layerShapeKey.c_str()); + + std::sort(layerShapeVec.begin(), layerShapeVec.end(), std::greater()); + for (auto const& s : layerShapeVec) { + layerShapeKey += s; + } + + mLayerShapeStatsMap[layerShapeKey]++; } void LayerStats::dump(String8& result) { ATRACE_CALL(); ALOGD("Dumping"); - result.append("Count,DstPosX,DstPosY,DstWidth,DstHeight,LayerType,WScale,HScale,"); - result.append("Transform,PixelFormat,Dataspace\n"); std::lock_guard lock(mMutex); - for (auto& u : mLayerStatsMap) { + result.append("Frequency,LayerCount,ColorMode,ColorTransform,Orientation\n"); + result.append("LayerType,CompositionType,IsProtected,Transform,PixelFormat,Dataspace,"); + result.append("DstX,DstY,DstWidth,DstHeight,WScale,HScale,Alpha\n"); + for (auto& u : mLayerShapeStatsMap) { result.appendFormat("%u,%s\n", u.second, u.first.c_str()); } } @@ -129,6 +157,14 @@ const char* LayerStats::layerTransform(int32_t transform) { return getTransformName(static_cast(transform)); } +const char* LayerStats::layerCompositionType(int32_t compositionType) { + return getCompositionName(static_cast(compositionType)); +} + +const char* LayerStats::layerPixelFormat(int32_t pixelFormat) { + return decodePixelFormat(pixelFormat).c_str(); +} + std::string LayerStats::scaleRatioWH(const LayerProtoParser::Layer* layer) { if (!layer->type.compare("ColorLayer")) return "N/A,N/A"; std::string ret = ""; @@ -166,6 +202,21 @@ const char* LayerStats::scaleRatio(int32_t destinationScale, int32_t sourceScale return ">=16"; } +const char* LayerStats::alpha(float a) { + if (a == 1.0f) return "1.0"; + if (a > 0.9f) return "0.99"; + if (a > 0.8f) return "0.9"; + if (a > 0.7f) return "0.8"; + if (a > 0.6f) return "0.7"; + if (a > 0.5f) return "0.6"; + if (a > 0.4f) return "0.5"; + if (a > 0.3f) return "0.4"; + if (a > 0.2f) return "0.3"; + if (a > 0.1f) return "0.2"; + if (a > 0.0f) return "0.1"; + return "0.0"; +} + bool LayerStats::isRotated(int32_t transform) { return transform & HWC_TRANSFORM_ROT_90; } @@ -178,4 +229,4 @@ bool LayerStats::isHFlipped(int32_t transform) { return transform & HWC_TRANSFORM_FLIP_H; } -} // namespace android +} // namespace android diff --git a/services/surfaceflinger/LayerStats.h b/services/surfaceflinger/LayerStats.h index de2b47c3ba..7871fc6602 100644 --- a/services/surfaceflinger/LayerStats.h +++ b/services/surfaceflinger/LayerStats.h @@ -39,17 +39,24 @@ private: // Traverse layer tree to get all visible layers' stats void traverseLayerTreeStatsLocked( std::vector> layerTree, - const LayerProtoParser::LayerGlobal* layerGlobal); + const LayerProtoParser::LayerGlobal* layerGlobal, + std::vector& layerShapeVec); // Convert layer's top-left position into 8x8 percentage of the display static const char* destinationLocation(int32_t location, int32_t range, bool isHorizontal); // Convert layer's size into 8x8 percentage of the display static const char* destinationSize(int32_t size, int32_t range, bool isWidth); // Return the name of the transform static const char* layerTransform(int32_t transform); + // Return the name of the composition type + static const char* layerCompositionType(int32_t compositionType); + // Return the name of the pixel format + static const char* layerPixelFormat(int32_t pixelFormat); // Calculate scale ratios of layer's width/height with rotation information static std::string scaleRatioWH(const LayerProtoParser::Layer* layer); // Calculate scale ratio from source to destination and convert to string static const char* scaleRatio(int32_t destinationScale, int32_t sourceScale); + // Bucket the alpha into designed buckets + static const char* alpha(float a); // Return whether the original buffer is rotated in final composition static bool isRotated(int32_t transform); // Return whether the original buffer is V-flipped in final composition @@ -60,10 +67,10 @@ private: bool mEnabled = false; // Protect mLayersStatsMap std::mutex mMutex; - // Hashmap for tracking the layer stats - // KEY is a concatenation of a particular set of layer properties - // VALUE is the number of times this particular get scanned out - std::unordered_map mLayerStatsMap; + // Hashmap for tracking the frame(layer shape) stats + // KEY is a concatenation of all layers' properties within a frame + // VALUE is the number of times this particular set has been scanned out + std::unordered_map mLayerShapeStatsMap; }; -} // namespace android +} // namespace android diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index babac37d7d..f7f5b58616 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1960,6 +1960,7 @@ void SurfaceFlinger::setUpHWComposer() { continue; } if (colorMatrix != mPreviousColorMatrix) { + displayDevice->setColorTransform(colorMatrix); status_t result = getBE().mHwc->setColorTransform(hwcId, colorMatrix); ALOGE_IF(result != NO_ERROR, "Failed to set color transform on " "display %zd: %d", displayId, result); @@ -4029,15 +4030,19 @@ LayersProto SurfaceFlinger::dumpProtoInfo(LayerVector::StateSet stateSet) const LayersProto SurfaceFlinger::dumpVisibleLayersProtoInfo(int32_t hwcId) const { LayersProto layersProto; - const sp& displayDevice(mDisplays[hwcId]); + SizeProto* resolution = layersProto.mutable_resolution(); resolution->set_w(displayDevice->getWidth()); resolution->set_h(displayDevice->getHeight()); + layersProto.set_color_mode(decodeColorMode(displayDevice->getActiveColorMode())); + layersProto.set_color_transform(decodeColorTransform(displayDevice->getColorTransform())); + layersProto.set_global_transform( + static_cast(displayDevice->getOrientationTransform())); + mDrawingState.traverseInZOrder([&](Layer* layer) { - if (!layer->visibleRegion.isEmpty() && - layer->getBE().mHwcLayers.count(hwcId)) { + if (!layer->visibleRegion.isEmpty() && layer->getBE().mHwcLayers.count(hwcId)) { LayerProto* layerProto = layersProto.add_layers(); layer->writeToProto(layerProto, hwcId); } diff --git a/services/surfaceflinger/layerproto/LayerProtoParser.cpp b/services/surfaceflinger/layerproto/LayerProtoParser.cpp index cef6c21eb1..fcf42f00a9 100644 --- a/services/surfaceflinger/layerproto/LayerProtoParser.cpp +++ b/services/surfaceflinger/layerproto/LayerProtoParser.cpp @@ -44,7 +44,12 @@ bool sortLayerUniquePtrs(const std::unique_ptr& lhs, const LayerProtoParser::LayerGlobal LayerProtoParser::generateLayerGlobalInfo( const LayersProto& layersProto) { - return {{layersProto.resolution().w(), layersProto.resolution().h()}}; + LayerGlobal layerGlobal; + layerGlobal.resolution = {layersProto.resolution().w(), layersProto.resolution().h()}; + layerGlobal.colorMode = layersProto.color_mode(); + layerGlobal.colorTransform = layersProto.color_transform(); + layerGlobal.globalTransform = layersProto.global_transform(); + return layerGlobal; } std::vector> LayerProtoParser::generateLayerTree( @@ -116,6 +121,8 @@ LayerProtoParser::Layer* LayerProtoParser::generateLayer(const LayerProto& layer layer->hwcTransform = layerProto.hwc_transform(); layer->windowType = layerProto.window_type(); layer->appId = layerProto.app_id(); + layer->hwcCompositionType = layerProto.hwc_composition_type(); + layer->isProtected = layerProto.is_protected(); return layer; } diff --git a/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h b/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h index fd893da1b1..74a6f28f2b 100644 --- a/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h +++ b/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h @@ -112,6 +112,8 @@ public: int32_t hwcTransform; int32_t windowType; int32_t appId; + int32_t hwcCompositionType; + bool isProtected; std::string to_string() const; }; @@ -119,6 +121,9 @@ public: class LayerGlobal { public: int2 resolution; + std::string colorMode; + std::string colorTransform; + int32_t globalTransform; }; static const LayerGlobal generateLayerGlobalInfo(const LayersProto& layersProto); diff --git a/services/surfaceflinger/layerproto/layers.proto b/services/surfaceflinger/layerproto/layers.proto index 6675aae797..77c6675b7f 100644 --- a/services/surfaceflinger/layerproto/layers.proto +++ b/services/surfaceflinger/layerproto/layers.proto @@ -8,6 +8,9 @@ package android.surfaceflinger; message LayersProto { repeated LayerProto layers = 1; optional SizeProto resolution = 2; + optional string color_mode = 3; + optional string color_transform = 4; + optional int32 global_transform = 5; } // Information about each layer. @@ -73,6 +76,10 @@ message LayerProto { optional int32 hwc_transform = 32; optional int32 window_type = 33; optional int32 app_id = 34; + // The layer's composition type + optional int32 hwc_composition_type = 35; + // If it's a buffer layer, indicate if the content is protected + optional bool is_protected = 36; } message PositionProto { -- cgit v1.2.3-59-g8ed1b From 0e7a791d51e92aafefd416044a2d38b6eec22a00 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Thu, 5 Apr 2018 14:36:36 -0700 Subject: [SurfaceFlinger] Plumb HAL to hardware composer. Previously we introduced HIDL interfaces for Auto Color support. This patch implements HAL interfaces in DisplayHardware/. BUG: 73824924 BUG: 73825729 Test: Build Change-Id: I4f2011bfa9306552d50a88fe0f065932be3efd0c --- libs/ui/DebugUtils.cpp | 24 +++ libs/ui/include/ui/DebugUtils.h | 1 + libs/ui/include/ui/GraphicTypes.h | 3 +- .../surfaceflinger/DisplayHardware/ComposerHal.cpp | 193 ++++++++++++++------- .../surfaceflinger/DisplayHardware/ComposerHal.h | 28 ++- services/surfaceflinger/DisplayHardware/HWC2.cpp | 18 +- services/surfaceflinger/DisplayHardware/HWC2.h | 8 +- .../surfaceflinger/DisplayHardware/HWComposer.cpp | 49 +++++- .../surfaceflinger/DisplayHardware/HWComposer.h | 8 +- .../RenderEngine/GLES20RenderEngine.cpp | 1 + services/surfaceflinger/SurfaceFlinger.cpp | 3 +- .../tests/unittests/DisplayTransactionTest.cpp | 2 +- .../surfaceflinger/tests/unittests/MockComposer.h | 7 +- 13 files changed, 261 insertions(+), 84 deletions(-) (limited to 'libs/ui/DebugUtils.cpp') diff --git a/libs/ui/DebugUtils.cpp b/libs/ui/DebugUtils.cpp index 58fed84ea8..61df02d41d 100644 --- a/libs/ui/DebugUtils.cpp +++ b/libs/ui/DebugUtils.cpp @@ -23,6 +23,7 @@ using android::base::StringPrintf; using android::ui::ColorMode; +using android::ui::RenderIntent; std::string decodeStandard(android_dataspace dataspace) { const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK); @@ -229,6 +230,15 @@ std::string decodeColorMode(ColorMode colorMode) { case ColorMode::DISPLAY_P3: return std::string("ColorMode::DISPLAY_P3"); + + case ColorMode::BT2020: + return std::string("ColorMode::BT2020"); + + case ColorMode::BT2100_PQ: + return std::string("ColorMode::BT2100_PQ"); + + case ColorMode::BT2100_HLG: + return std::string("ColorMode::BT2100_HLG"); } return android::base::StringPrintf("Unknown color mode %d", colorMode); @@ -294,6 +304,20 @@ std::string decodePixelFormat(android::PixelFormat format) { } } +std::string decodeRenderIntent(RenderIntent renderIntent) { + switch(renderIntent) { + case RenderIntent::COLORIMETRIC: + return std::string("RenderIntent::COLORIMETRIC"); + case RenderIntent::ENHANCE: + return std::string("RenderIntent::ENHANCE"); + case RenderIntent::TONE_MAP_COLORIMETRIC: + return std::string("RenderIntent::TONE_MAP_COLORIMETRIC"); + case RenderIntent::TONE_MAP_ENHANCE: + return std::string("RenderIntent::TONE_MAP_ENHANCE"); + } + return std::string("Unknown RenderIntent"); +} + std::string to_string(const android::Rect& rect) { return StringPrintf("(%4d,%4d,%4d,%4d)", rect.left, rect.top, rect.right, rect.bottom); } diff --git a/libs/ui/include/ui/DebugUtils.h b/libs/ui/include/ui/DebugUtils.h index 5e5df43740..92b2bfb282 100644 --- a/libs/ui/include/ui/DebugUtils.h +++ b/libs/ui/include/ui/DebugUtils.h @@ -32,4 +32,5 @@ std::string dataspaceDetails(android_dataspace dataspace); std::string decodeColorMode(android::ui::ColorMode colormode); std::string decodeColorTransform(android_color_transform colorTransform); std::string decodePixelFormat(android::PixelFormat format); +std::string decodeRenderIntent(android::ui::RenderIntent renderIntent); std::string to_string(const android::Rect& rect); diff --git a/libs/ui/include/ui/GraphicTypes.h b/libs/ui/include/ui/GraphicTypes.h index 92a5519898..bd5722fdb0 100644 --- a/libs/ui/include/ui/GraphicTypes.h +++ b/libs/ui/include/ui/GraphicTypes.h @@ -24,9 +24,10 @@ namespace android { namespace ui { -using android::hardware::graphics::common::V1_0::ColorMode; +using android::hardware::graphics::common::V1_1::ColorMode; using android::hardware::graphics::common::V1_1::Dataspace; using android::hardware::graphics::common::V1_1::PixelFormat; +using android::hardware::graphics::common::V1_1::RenderIntent; } // namespace ui } // namespace android diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp index bbffd0ae7f..5daa87ee35 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp @@ -350,15 +350,29 @@ Error Composer::getColorModes(Display display, std::vector* outModes) { Error error = kDefaultError; - mClient->getColorModes(display, - [&](const auto& tmpError, const auto& tmpModes) { - error = tmpError; - if (error != Error::NONE) { - return; - } - *outModes = tmpModes; - }); + if (mClient_2_2) { + mClient_2_2->getColorModes_2_2(display, + [&](const auto& tmpError, const auto& tmpModes) { + error = tmpError; + if (error != Error::NONE) { + return; + } + + *outModes = tmpModes; + }); + } else { + mClient->getColorModes(display, + [&](const auto& tmpError, const auto& tmpModes) { + error = tmpError; + if (error != Error::NONE) { + return; + } + for (V1_0::ColorMode colorMode : tmpModes) { + outModes->push_back(static_cast(colorMode)); + } + }); + } return error; } @@ -479,25 +493,6 @@ Error Composer::getHdrCapabilities(Display display, return error; } -Error Composer::getPerFrameMetadataKeys( - Display display, std::vector* outKeys) { - if (!mClient_2_2) { - return Error::UNSUPPORTED; - } - - Error error = kDefaultError; - mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) { - error = tmpError; - if (error != Error::NONE) { - return; - } - - *outKeys = tmpKeys; - }); - - return error; -} - Error Composer::getReleaseFences(Display display, std::vector* outLayers, std::vector* outReleaseFences) { @@ -553,9 +548,16 @@ Error Composer::setClientTarget(Display display, uint32_t slot, return Error::NONE; } -Error Composer::setColorMode(Display display, ColorMode mode) +Error Composer::setColorMode(Display display, ColorMode mode, + RenderIntent renderIntent) { - auto ret = mClient->setColorMode(display, mode); + hardware::Return ret(kDefaultError); + if (mClient_2_2) { + ret = mClient_2_2->setColorMode_2_2(display, mode, renderIntent); + } else { + ret = mClient->setColorMode(display, + static_cast(mode)); + } return unwrapRet(ret); } @@ -862,39 +864,44 @@ Error Composer::execute() } Error error = kDefaultError; - auto ret = mClient->executeCommands(commandLength, commandHandles, - [&](const auto& tmpError, const auto& tmpOutChanged, - const auto& tmpOutLength, const auto& tmpOutHandles) - { - error = tmpError; - - // set up new output command queue if necessary - if (error == Error::NONE && tmpOutChanged) { - error = kDefaultError; - mClient->getOutputCommandQueue( - [&](const auto& tmpError, - const auto& tmpDescriptor) - { - error = tmpError; - if (error != Error::NONE) { - return; - } - - mReader.setMQDescriptor(tmpDescriptor); - }); - } - - if (error != Error::NONE) { - return; - } - - if (mReader.readQueue(tmpOutLength, tmpOutHandles)) { - error = mReader.parse(); - mReader.reset(); - } else { - error = Error::NO_RESOURCES; - } - }); + hardware::Return ret; + auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged, + const auto& tmpOutLength, const auto& tmpOutHandles) + { + error = tmpError; + + // set up new output command queue if necessary + if (error == Error::NONE && tmpOutChanged) { + error = kDefaultError; + mClient->getOutputCommandQueue( + [&](const auto& tmpError, + const auto& tmpDescriptor) + { + error = tmpError; + if (error != Error::NONE) { + return; + } + + mReader.setMQDescriptor(tmpDescriptor); + }); + } + + if (error != Error::NONE) { + return; + } + + if (mReader.readQueue(tmpOutLength, tmpOutHandles)) { + error = mReader.parse(); + mReader.reset(); + } else { + error = Error::NO_RESOURCES; + } + }; + if (mClient_2_2) { + ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback); + } else { + ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback); + } // executeCommands can fail because of out-of-fd and we do not want to // abort() in that case if (!ret.isOk()) { @@ -925,6 +932,68 @@ Error Composer::execute() return error; } +// Composer HAL 2.2 + +Error Composer::getPerFrameMetadataKeys( + Display display, std::vector* outKeys) { + if (!mClient_2_2) { + return Error::UNSUPPORTED; + } + + Error error = kDefaultError; + mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) { + error = tmpError; + if (error != Error::NONE) { + return; + } + + *outKeys = tmpKeys; + }); + + return error; +} + +Error Composer::getRenderIntents(Display display, ColorMode colorMode, + std::vector* outRenderIntents) { + if (!mClient_2_2) { + outRenderIntents->push_back(RenderIntent::COLORIMETRIC); + return Error::NONE; + } + + Error error = kDefaultError; + mClient_2_2->getRenderIntents(display, colorMode, + [&](const auto& tmpError, const auto& tmpKeys) { + error = tmpError; + if (error != Error::NONE) { + return; + } + + *outRenderIntents = tmpKeys; + }); + + return error; +} + +Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) +{ + if (!mClient_2_2) { + *outMatrix = mat4(); + return Error::NONE; + } + + Error error = kDefaultError; + mClient_2_2->getDataspaceSaturationMatrix(dataspace, [&](const auto& tmpError, const auto& tmpMatrix) { + error = tmpError; + if (error != Error::NONE) { + return; + } + + *outMatrix = mat4(tmpMatrix.data()); + }); + + return error; +} + CommandReader::~CommandReader() { resetData(); diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h index 98f2f9d387..08901f685f 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -38,12 +39,13 @@ namespace Hwc2 { using android::frameworks::vr::composer::V1_0::IVrComposerClient; -using android::hardware::graphics::common::V1_0::ColorMode; using android::hardware::graphics::common::V1_0::ColorTransform; using android::hardware::graphics::common::V1_0::Hdr; using android::hardware::graphics::common::V1_0::Transform; +using android::hardware::graphics::common::V1_1::ColorMode; using android::hardware::graphics::common::V1_1::Dataspace; using android::hardware::graphics::common::V1_1::PixelFormat; +using android::hardware::graphics::common::V1_1::RenderIntent; using android::hardware::graphics::composer::V2_1::Config; using android::hardware::graphics::composer::V2_1::Display; @@ -114,9 +116,6 @@ public: float* outMaxLuminance, float* outMaxAverageLuminance, float* outMinLuminance) = 0; - virtual Error getPerFrameMetadataKeys( - Display display, std::vector* outKeys) = 0; - virtual Error getReleaseFences(Display display, std::vector* outLayers, std::vector* outReleaseFences) = 0; @@ -132,7 +131,7 @@ public: virtual Error setClientTarget(Display display, uint32_t slot, const sp& target, int acquireFence, Dataspace dataspace, const std::vector& damage) = 0; - virtual Error setColorMode(Display display, ColorMode mode) = 0; + virtual Error setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) = 0; virtual Error setColorTransform(Display display, const float* matrix, ColorTransform hint) = 0; virtual Error setOutputBuffer(Display display, const native_handle_t* buffer, int releaseFence) = 0; @@ -175,6 +174,13 @@ public: const std::vector& visible) = 0; virtual Error setLayerZOrder(Display display, Layer layer, uint32_t z) = 0; virtual Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) = 0; + + // Composer HAL 2.2 + virtual Error getPerFrameMetadataKeys( + Display display, std::vector* outKeys) = 0; + virtual Error getRenderIntents(Display display, ColorMode colorMode, + std::vector* outRenderIntents) = 0; + virtual Error getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) = 0; }; namespace impl { @@ -306,9 +312,6 @@ public: Error getHdrCapabilities(Display display, std::vector* outTypes, float* outMaxLuminance, float* outMaxAverageLuminance, float* outMinLuminance) override; - Error getPerFrameMetadataKeys( - Display display, std::vector* outKeys) override; - Error getReleaseFences(Display display, std::vector* outLayers, std::vector* outReleaseFences) override; @@ -324,7 +327,7 @@ public: Error setClientTarget(Display display, uint32_t slot, const sp& target, int acquireFence, Dataspace dataspace, const std::vector& damage) override; - Error setColorMode(Display display, ColorMode mode) override; + Error setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) override; Error setColorTransform(Display display, const float* matrix, ColorTransform hint) override; Error setOutputBuffer(Display display, const native_handle_t* buffer, int releaseFence) override; @@ -364,6 +367,13 @@ public: Error setLayerZOrder(Display display, Layer layer, uint32_t z) override; Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) override; + // Composer HAL 2.2 + Error getPerFrameMetadataKeys( + Display display, std::vector* outKeys) override; + Error getRenderIntents(Display display, ColorMode colorMode, + std::vector* outRenderIntents) override; + Error getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) override; + private: class CommandWriter : public CommandWriterBase { public: diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 2686788ade..5f94bb4202 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -50,6 +50,7 @@ namespace Hwc2 = android::Hwc2; using android::ui::ColorMode; using android::ui::Dataspace; using android::ui::PixelFormat; +using android::ui::RenderIntent; namespace { @@ -369,6 +370,19 @@ Error Display::getColorModes(std::vector* outModes) const return static_cast(intError); } +Error Display::getRenderIntents(ColorMode colorMode, + std::vector* outRenderIntents) const +{ + auto intError = mComposer.getRenderIntents(mId, colorMode, outRenderIntents); + return static_cast(intError); +} + +Error Display::getDataspaceSaturationMatrix(Dataspace dataspace, android::mat4* outMatrix) +{ + auto intError = mComposer.getDataspaceSaturationMatrix(dataspace, outMatrix); + return static_cast(intError); +} + std::vector> Display::getConfigs() const { std::vector> configs; @@ -526,9 +540,9 @@ Error Display::setClientTarget(uint32_t slot, const sp& target, return static_cast(intError); } -Error Display::setColorMode(ColorMode mode) +Error Display::setColorMode(ColorMode mode, RenderIntent renderIntent) { - auto intError = mComposer.setColorMode(mId, mode); + auto intError = mComposer.setColorMode(mId, mode, renderIntent); return static_cast(intError); } diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index 9b870e3ed9..e5779d40d1 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -212,6 +212,11 @@ public: std::unordered_map* outTypes); [[clang::warn_unused_result]] Error getColorModes( std::vector* outModes) const; + [[clang::warn_unused_result]] Error getRenderIntents( + android::ui::ColorMode colorMode, + std::vector* outRenderIntents) const; + [[clang::warn_unused_result]] Error getDataspaceSaturationMatrix( + android::ui::Dataspace dataspace, android::mat4* outMatrix); // Doesn't call into the HWC2 device, so no errors are possible std::vector> getConfigs() const; @@ -236,7 +241,8 @@ public: const android::sp& acquireFence, android::ui::Dataspace dataspace); [[clang::warn_unused_result]] Error setColorMode( - android::ui::ColorMode mode); + android::ui::ColorMode mode, + android::ui::RenderIntent renderIntent); [[clang::warn_unused_result]] Error setColorTransform( const android::mat4& matrix, android_color_transform_t hint); [[clang::warn_unused_result]] Error setOutputBuffer( diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 29e2727b3e..8db8aa6cd0 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -330,17 +330,20 @@ std::vector HWComposer::getColorModes(int32_t displayId) const { return modes; } -status_t HWComposer::setActiveColorMode(int32_t displayId, ui::ColorMode mode) { +status_t HWComposer::setActiveColorMode(int32_t displayId, ui::ColorMode mode, + ui::RenderIntent renderIntent) { if (!isValidDisplay(displayId)) { ALOGE("setActiveColorMode: Display %d is not valid", displayId); return BAD_INDEX; } auto& displayData = mDisplayData[displayId]; - auto error = displayData.hwcDisplay->setColorMode(mode); + auto error = displayData.hwcDisplay->setColorMode(mode, renderIntent); if (error != HWC2::Error::None) { - ALOGE("setActiveConfig: Failed to set color mode %d on display %d: " - "%s (%d)", mode, displayId, to_string(error).c_str(), + ALOGE("setActiveConfig: Failed to set color mode %d" + "with render intent %d on display %d: " + "%s (%d)", mode, renderIntent, displayId, + to_string(error).c_str(), static_cast(error)); return UNKNOWN_ERROR; } @@ -841,6 +844,44 @@ std::unique_ptr HWComposer::getHdrCapabilities( return capabilities; } +std::vector HWComposer::getRenderIntents(int32_t displayId, + ui::ColorMode colorMode) const { + if (!isValidDisplay(displayId)) { + ALOGE("getRenderIntents: Attempted to access invalid display %d", + displayId); + return {}; + } + + std::vector renderIntents; + auto error = mDisplayData[displayId].hwcDisplay->getRenderIntents(colorMode, &renderIntents); + 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 renderIntents; +} + +mat4 HWComposer::getDataspaceSaturationMatrix(int32_t displayId, ui::Dataspace dataspace) { + if (!isValidDisplay(displayId)) { + ALOGE("getDataSpaceSaturationMatrix: Attempted to access invalid display %d", + displayId); + return {}; + } + + mat4 matrix; + auto error = mDisplayData[displayId].hwcDisplay->getDataspaceSaturationMatrix(dataspace, + &matrix); + if (error != HWC2::Error::None) { + ALOGE("getDataSpaceSaturationMatrix failed for display %d: %s (%d)", displayId, + to_string(error).c_str(), static_cast(error)); + return mat4(); + } + + return matrix; +} + // Converts a PixelFormat to a human-readable string. Max 11 chars. // (Could use a table of prefab String8 objects.) /* diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index 6e2e156abd..e86d6211c8 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -137,6 +137,11 @@ public: // Returns the HDR capabilities of the given display std::unique_ptr getHdrCapabilities(int32_t displayId); + // Returns the available RenderIntent of the given display. + std::vector getRenderIntents(int32_t displayId, ui::ColorMode colorMode) const; + + mat4 getDataspaceSaturationMatrix(int32_t displayId, ui::Dataspace dataspace); + // Events handling --------------------------------------------------------- // Returns true if successful, false otherwise. The @@ -161,7 +166,8 @@ public: std::vector getColorModes(int32_t displayId) const; - status_t setActiveColorMode(int32_t displayId, ui::ColorMode mode); + status_t setActiveColorMode(int32_t displayId, ui::ColorMode mode, + ui::RenderIntent renderIntent); bool isUsingVrComposer() const; diff --git a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp index 1eda900f47..1fc310025d 100644 --- a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp +++ b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp @@ -302,6 +302,7 @@ void GLES20RenderEngine::drawMesh(const Mesh& mesh) { glVertexAttribPointer(Program::position, mesh.getVertexSize(), GL_FLOAT, GL_FALSE, mesh.getByteStride(), mesh.getPositions()); + // TODO(b/73825729) Refactor this code block to handle BT2020 color space properly. // DISPLAY_P3 is the only supported wide color output if (mPlatformHasWideColor && mOutputDataSpace == Dataspace::DISPLAY_P3) { Description wideColorState = mState; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c5bd0eb20e..5be7951972 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -106,6 +106,7 @@ using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; using ui::ColorMode; using ui::Dataspace; +using ui::RenderIntent; namespace { class ConditionalLock { @@ -1007,7 +1008,7 @@ void SurfaceFlinger::setActiveColorModeInternal(const sp& hw, hw->getDisplayType()); hw->setActiveColorMode(mode); - getHwComposer().setActiveColorMode(type, mode); + getHwComposer().setActiveColorMode(type, mode, RenderIntent::COLORIMETRIC); } diff --git a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp index c048c583f2..0705b5c7f8 100644 --- a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +++ b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp @@ -46,8 +46,8 @@ using testing::Mock; using testing::Return; using testing::SetArgPointee; -using android::hardware::graphics::common::V1_0::ColorMode; using android::hardware::graphics::common::V1_0::Hdr; +using android::hardware::graphics::common::V1_1::ColorMode; using android::Hwc2::Error; using android::Hwc2::IComposer; using android::Hwc2::IComposerClient; diff --git a/services/surfaceflinger/tests/unittests/MockComposer.h b/services/surfaceflinger/tests/unittests/MockComposer.h index 00e565b75c..8be277915e 100644 --- a/services/surfaceflinger/tests/unittests/MockComposer.h +++ b/services/surfaceflinger/tests/unittests/MockComposer.h @@ -27,12 +27,13 @@ class GraphicBuffer; namespace Hwc2 { namespace mock { -using android::hardware::graphics::common::V1_0::ColorMode; using android::hardware::graphics::common::V1_0::ColorTransform; using android::hardware::graphics::common::V1_0::Hdr; using android::hardware::graphics::common::V1_0::Transform; +using android::hardware::graphics::common::V1_1::ColorMode; using android::hardware::graphics::common::V1_1::Dataspace; using android::hardware::graphics::common::V1_1::PixelFormat; +using android::hardware::graphics::common::V1_1::RenderIntent; using android::hardware::graphics::composer::V2_1::Config; using android::hardware::graphics::composer::V2_1::Display; @@ -75,13 +76,14 @@ public: MOCK_METHOD5(getHdrCapabilities, Error(Display, std::vector*, float*, float*, float*)); MOCK_METHOD2(getPerFrameMetadataKeys, Error(Display, std::vector*)); + MOCK_METHOD2(getDataspaceSaturationMatrix, Error(Dataspace, mat4*)); MOCK_METHOD3(getReleaseFences, Error(Display, std::vector*, std::vector*)); MOCK_METHOD2(presentDisplay, Error(Display, int*)); MOCK_METHOD2(setActiveConfig, Error(Display, Config)); MOCK_METHOD6(setClientTarget, Error(Display, uint32_t, const sp&, int, Dataspace, const std::vector&)); - MOCK_METHOD2(setColorMode, Error(Display, ColorMode)); + MOCK_METHOD3(setColorMode, Error(Display, ColorMode, RenderIntent)); MOCK_METHOD3(setColorTransform, Error(Display, const float*, ColorTransform)); MOCK_METHOD3(setOutputBuffer, Error(Display, const native_handle_t*, int)); MOCK_METHOD2(setPowerMode, Error(Display, IComposerClient::PowerMode)); @@ -107,6 +109,7 @@ public: Error(Display, Layer, const std::vector&)); MOCK_METHOD3(setLayerZOrder, Error(Display, Layer, uint32_t)); MOCK_METHOD4(setLayerInfo, Error(Display, Layer, uint32_t, uint32_t)); + MOCK_METHOD3(getRenderIntents, Error(Display, ColorMode, std::vector*)); }; } // namespace mock -- cgit v1.2.3-59-g8ed1b