diff options
-rw-r--r-- | include/gui/ISurfaceComposer.h | 9 | ||||
-rw-r--r-- | include/gui/SurfaceComposerClient.h | 4 | ||||
-rw-r--r-- | include/ui/HdrCapabilities.h | 66 | ||||
-rw-r--r-- | libs/gui/ISurfaceComposer.cpp | 40 | ||||
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 6 | ||||
-rw-r--r-- | libs/ui/Android.mk | 2 | ||||
-rw-r--r-- | libs/ui/HdrCapabilities.cpp | 59 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWC2.cpp | 106 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWC2.h | 5 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp | 14 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.cpp | 20 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 22 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger_hwc1.cpp | 9 |
16 files changed, 333 insertions, 37 deletions
diff --git a/include/gui/ISurfaceComposer.h b/include/gui/ISurfaceComposer.h index 8c3d49e64e..af26721b35 100644 --- a/include/gui/ISurfaceComposer.h +++ b/include/gui/ISurfaceComposer.h @@ -39,6 +39,7 @@ class ComposerState; class DisplayState; struct DisplayInfo; struct DisplayStatInfo; +class HdrCapabilities; class IDisplayEventConnection; class IMemoryHeap; class Rect; @@ -157,6 +158,13 @@ public: * Requires the ACCESS_SURFACE_FLINGER permission. */ virtual status_t getAnimationFrameStats(FrameStats* outStats) const = 0; + + /* Gets the supported HDR capabilities of the given display. + * + * Requires the ACCESS_SURFACE_FLINGER permission. + */ + virtual status_t getHdrCapabilities(const sp<IBinder>& display, + HdrCapabilities* outCapabilities) const = 0; }; // ---------------------------------------------------------------------------- @@ -184,6 +192,7 @@ public: GET_ANIMATION_FRAME_STATS, SET_POWER_MODE, GET_DISPLAY_STATS, + GET_HDR_CAPABILITIES, }; virtual status_t onTransact(uint32_t code, const Parcel& data, diff --git a/include/gui/SurfaceComposerClient.h b/include/gui/SurfaceComposerClient.h index 794fe4c069..9161dbb442 100644 --- a/include/gui/SurfaceComposerClient.h +++ b/include/gui/SurfaceComposerClient.h @@ -40,6 +40,7 @@ namespace android { class DisplayInfo; class Composer; +class HdrCapabilities; class ISurfaceComposerClient; class IGraphicBufferProducer; class Region; @@ -145,6 +146,9 @@ public: static status_t clearAnimationFrameStats(); static status_t getAnimationFrameStats(FrameStats* outStats); + static status_t getHdrCapabilities(const sp<IBinder>& display, + HdrCapabilities* outCapabilities); + static void setDisplaySurface(const sp<IBinder>& token, const sp<IGraphicBufferProducer>& bufferProducer); static void setDisplayLayerStack(const sp<IBinder>& token, diff --git a/include/ui/HdrCapabilities.h b/include/ui/HdrCapabilities.h new file mode 100644 index 0000000000..a7cd5fb58e --- /dev/null +++ b/include/ui/HdrCapabilities.h @@ -0,0 +1,66 @@ +/* + * Copyright 2016 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. + */ + +#ifndef ANDROID_UI_HDR_CAPABILTIES_H +#define ANDROID_UI_HDR_CAPABILTIES_H + +#include <binder/Parcelable.h> + +namespace android { + +class HdrCapabilities : public Parcelable +{ +public: + HdrCapabilities(const std::vector<int32_t /*android_hdr_t*/>& types, + float maxLuminance, float maxAverageLuminance, float minLuminance) + : mSupportedHdrTypes(types), + mMaxLuminance(maxLuminance), + mMaxAverageLuminance(maxAverageLuminance), + mMinLuminance(minLuminance) {} + + // Make this move-constructable and move-assignable + HdrCapabilities(HdrCapabilities&& other) = default; + HdrCapabilities& operator=(HdrCapabilities&& other) = default; + + HdrCapabilities() + : mSupportedHdrTypes(), + mMaxLuminance(-1.0f), + mMaxAverageLuminance(-1.0f), + mMinLuminance(-1.0f) {} + + virtual ~HdrCapabilities() = default; + + const std::vector<int32_t /*android_hdr_t*/>& getSupportedHdrTypes() const { + return mSupportedHdrTypes; + } + float getDesiredMaxLuminance() const { return mMaxLuminance; } + float getDesiredMaxAverageLuminance() const { return mMaxAverageLuminance; } + float getDesiredMinLuminance() const { return mMinLuminance; } + + // Parcelable interface + virtual status_t writeToParcel(Parcel* parcel) const override; + virtual status_t readFromParcel(const Parcel* parcel) override; + +private: + std::vector<int32_t /*android_hdr_t*/> mSupportedHdrTypes; + float mMaxLuminance; + float mMaxAverageLuminance; + float mMinLuminance; +}; + +} // namespace android + +#endif diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index b4cbf84286..a8b4fa8226 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -34,6 +34,7 @@ #include <ui/DisplayInfo.h> #include <ui/DisplayStatInfo.h> +#include <ui/HdrCapabilities.h> #include <utils/Log.h> @@ -282,6 +283,28 @@ public: reply.read(*outStats); return reply.readInt32(); } + + virtual status_t getHdrCapabilities(const sp<IBinder>& display, + HdrCapabilities* outCapabilities) const { + Parcel data, reply; + data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); + status_t result = data.writeStrongBinder(display); + if (result != NO_ERROR) { + ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result); + return result; + } + result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES, + data, &reply); + if (result != NO_ERROR) { + ALOGE("getHdrCapabilities failed to transact: %d", result); + return result; + } + result = reply.readInt32(); + if (result == NO_ERROR) { + result = reply.readParcelable(outCapabilities); + } + return result; + } }; // Out-of-line virtual method definition to trigger vtable emission in this @@ -467,6 +490,23 @@ status_t BnSurfaceComposer::onTransact( setPowerMode(display, mode); return NO_ERROR; } + case GET_HDR_CAPABILITIES: { + CHECK_INTERFACE(ISurfaceComposer, data, reply); + sp<IBinder> display = nullptr; + status_t result = data.readStrongBinder(&display); + if (result != NO_ERROR) { + ALOGE("getHdrCapabilities failed to readStrongBinder: %d", + result); + return result; + } + HdrCapabilities capabilities; + result = getHdrCapabilities(display, &capabilities); + reply->writeInt32(result); + if (result == NO_ERROR) { + reply->writeParcelable(capabilities); + } + return NO_ERROR; + } default: { return BBinder::onTransact(code, data, reply, flags); } diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 04b5446d42..418892a1c3 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -722,6 +722,12 @@ status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) { return ComposerService::getComposerService()->getAnimationFrameStats(outStats); } +status_t SurfaceComposerClient::getHdrCapabilities(const sp<IBinder>& display, + HdrCapabilities* outCapabilities) { + return ComposerService::getComposerService()->getHdrCapabilities(display, + outCapabilities); +} + // ---------------------------------------------------------------------------- status_t ScreenshotClient::capture( diff --git a/libs/ui/Android.mk b/libs/ui/Android.mk index e4cdcab04a..ee6c093bcf 100644 --- a/libs/ui/Android.mk +++ b/libs/ui/Android.mk @@ -40,12 +40,14 @@ LOCAL_SRC_FILES := \ GraphicBuffer.cpp \ GraphicBufferAllocator.cpp \ GraphicBufferMapper.cpp \ + HdrCapabilities.cpp \ PixelFormat.cpp \ Rect.cpp \ Region.cpp \ UiConfig.cpp LOCAL_SHARED_LIBRARIES := \ + libbinder \ libcutils \ libhardware \ libsync \ diff --git a/libs/ui/HdrCapabilities.cpp b/libs/ui/HdrCapabilities.cpp new file mode 100644 index 0000000000..511f68ab4c --- /dev/null +++ b/libs/ui/HdrCapabilities.cpp @@ -0,0 +1,59 @@ +/* + * Copyright 2016 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. + */ + +#include <ui/HdrCapabilities.h> + +#include <binder/Parcel.h> + +namespace android { + +status_t HdrCapabilities::writeToParcel(Parcel* parcel) const +{ + status_t result = parcel->writeInt32Vector(mSupportedHdrTypes); + if (result != OK) { + return result; + } + result = parcel->writeFloat(mMaxLuminance); + if (result != OK) { + return result; + } + result = parcel->writeFloat(mMaxAverageLuminance); + if (result != OK) { + return result; + } + result = parcel->writeFloat(mMinLuminance); + return result; +} + +status_t HdrCapabilities::readFromParcel(const Parcel* parcel) +{ + status_t result = parcel->readInt32Vector(&mSupportedHdrTypes); + if (result != OK) { + return result; + } + result = parcel->readFloat(&mMaxLuminance); + if (result != OK) { + return result; + } + result = parcel->readFloat(&mMaxAverageLuminance); + if (result != OK) { + return result; + } + result = parcel->readFloat(&mMinLuminance); + return result; +} + +} // namespace android diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 0e97a5382a..5c78c68ef2 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -74,6 +74,7 @@ extern "C" { using android::Fence; using android::FloatRect; using android::GraphicBuffer; +using android::HdrCapabilities; using android::Rect; using android::Region; using android::sp; @@ -100,6 +101,7 @@ Device::Device(hwc2_device_t* device) mGetDisplayRequests(nullptr), mGetDisplayType(nullptr), mGetDozeSupport(nullptr), + mGetHdrCapabilities(nullptr), mGetReleaseFences(nullptr), mPresentDisplay(nullptr), mSetActiveConfig(nullptr), @@ -307,82 +309,84 @@ void Device::loadFunctionPointers() // loadFunctionPointer specifying which function failed to load // Display function pointers - if(!loadFunctionPointer(FunctionDescriptor::CreateVirtualDisplay, + if (!loadFunctionPointer(FunctionDescriptor::CreateVirtualDisplay, mCreateVirtualDisplay)) return; - if(!loadFunctionPointer(FunctionDescriptor::DestroyVirtualDisplay, + if (!loadFunctionPointer(FunctionDescriptor::DestroyVirtualDisplay, mDestroyVirtualDisplay)) return; - if(!loadFunctionPointer(FunctionDescriptor::Dump, mDump)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetMaxVirtualDisplayCount, + if (!loadFunctionPointer(FunctionDescriptor::Dump, mDump)) return; + if (!loadFunctionPointer(FunctionDescriptor::GetMaxVirtualDisplayCount, mGetMaxVirtualDisplayCount)) return; - if(!loadFunctionPointer(FunctionDescriptor::RegisterCallback, + if (!loadFunctionPointer(FunctionDescriptor::RegisterCallback, mRegisterCallback)) return; // Device function pointers - if(!loadFunctionPointer(FunctionDescriptor::AcceptDisplayChanges, + if (!loadFunctionPointer(FunctionDescriptor::AcceptDisplayChanges, mAcceptDisplayChanges)) return; - if(!loadFunctionPointer(FunctionDescriptor::CreateLayer, + if (!loadFunctionPointer(FunctionDescriptor::CreateLayer, mCreateLayer)) return; - if(!loadFunctionPointer(FunctionDescriptor::DestroyLayer, + if (!loadFunctionPointer(FunctionDescriptor::DestroyLayer, mDestroyLayer)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetActiveConfig, + if (!loadFunctionPointer(FunctionDescriptor::GetActiveConfig, mGetActiveConfig)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetChangedCompositionTypes, + if (!loadFunctionPointer(FunctionDescriptor::GetChangedCompositionTypes, mGetChangedCompositionTypes)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetDisplayAttribute, + if (!loadFunctionPointer(FunctionDescriptor::GetDisplayAttribute, mGetDisplayAttribute)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetDisplayConfigs, + if (!loadFunctionPointer(FunctionDescriptor::GetDisplayConfigs, mGetDisplayConfigs)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetDisplayName, + if (!loadFunctionPointer(FunctionDescriptor::GetDisplayName, mGetDisplayName)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetDisplayRequests, + if (!loadFunctionPointer(FunctionDescriptor::GetDisplayRequests, mGetDisplayRequests)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetDisplayType, + if (!loadFunctionPointer(FunctionDescriptor::GetDisplayType, mGetDisplayType)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetDozeSupport, + if (!loadFunctionPointer(FunctionDescriptor::GetDozeSupport, mGetDozeSupport)) return; - if(!loadFunctionPointer(FunctionDescriptor::GetReleaseFences, + if (!loadFunctionPointer(FunctionDescriptor::GetHdrCapabilities, + mGetHdrCapabilities)) return; + if (!loadFunctionPointer(FunctionDescriptor::GetReleaseFences, mGetReleaseFences)) return; - if(!loadFunctionPointer(FunctionDescriptor::PresentDisplay, + if (!loadFunctionPointer(FunctionDescriptor::PresentDisplay, mPresentDisplay)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetActiveConfig, + if (!loadFunctionPointer(FunctionDescriptor::SetActiveConfig, mSetActiveConfig)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetClientTarget, + if (!loadFunctionPointer(FunctionDescriptor::SetClientTarget, mSetClientTarget)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetOutputBuffer, + if (!loadFunctionPointer(FunctionDescriptor::SetOutputBuffer, mSetOutputBuffer)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetPowerMode, + if (!loadFunctionPointer(FunctionDescriptor::SetPowerMode, mSetPowerMode)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetVsyncEnabled, + if (!loadFunctionPointer(FunctionDescriptor::SetVsyncEnabled, mSetVsyncEnabled)) return; - if(!loadFunctionPointer(FunctionDescriptor::ValidateDisplay, + if (!loadFunctionPointer(FunctionDescriptor::ValidateDisplay, mValidateDisplay)) return; // Layer function pointers - if(!loadFunctionPointer(FunctionDescriptor::SetCursorPosition, + if (!loadFunctionPointer(FunctionDescriptor::SetCursorPosition, mSetCursorPosition)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerBuffer, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerBuffer, mSetLayerBuffer)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerSurfaceDamage, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerSurfaceDamage, mSetLayerSurfaceDamage)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerBlendMode, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerBlendMode, mSetLayerBlendMode)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerColor, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerColor, mSetLayerColor)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerCompositionType, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerCompositionType, mSetLayerCompositionType)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerDisplayFrame, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerDisplayFrame, mSetLayerDisplayFrame)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerPlaneAlpha, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerPlaneAlpha, mSetLayerPlaneAlpha)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerSidebandStream, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerSidebandStream, mSetLayerSidebandStream)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerSourceCrop, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerSourceCrop, mSetLayerSourceCrop)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerTransform, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerTransform, mSetLayerTransform)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerVisibleRegion, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerVisibleRegion, mSetLayerVisibleRegion)) return; - if(!loadFunctionPointer(FunctionDescriptor::SetLayerZOrder, + if (!loadFunctionPointer(FunctionDescriptor::SetLayerZOrder, mSetLayerZOrder)) return; } @@ -637,6 +641,34 @@ Error Display::supportsDoze(bool* outSupport) const return Error::None; } +Error Display::getHdrCapabilities( + std::unique_ptr<HdrCapabilities>* outCapabilities) const +{ + uint32_t numTypes = 0; + float maxLuminance = -1.0f; + float maxAverageLuminance = -1.0f; + float minLuminance = -1.0f; + int32_t intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, + &numTypes, nullptr, &maxLuminance, &maxAverageLuminance, + &minLuminance); + auto error = static_cast<HWC2::Error>(intError); + if (error != Error::None) { + return error; + } + + std::vector<int32_t> types(numTypes); + intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, &numTypes, + types.data(), &maxLuminance, &maxAverageLuminance, &minLuminance); + error = static_cast<HWC2::Error>(intError); + if (error != Error::None) { + return error; + } + + *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types), + maxLuminance, maxAverageLuminance, minLuminance); + return Error::None; +} + Error Display::getReleaseFences( std::unordered_map<std::shared_ptr<Layer>, sp<Fence>>* outFences) const { diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index a7bd28c2e7..7d33a0a4d4 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -23,6 +23,8 @@ #undef HWC2_INCLUDE_STRINGIFICATION #undef HWC2_USE_CPP11 +#include <ui/HdrCapabilities.h> + #include <utils/Log.h> #include <utils/StrongPointer.h> #include <utils/Timers.h> @@ -145,6 +147,7 @@ private: HWC2_PFN_GET_DISPLAY_REQUESTS mGetDisplayRequests; HWC2_PFN_GET_DISPLAY_TYPE mGetDisplayType; HWC2_PFN_GET_DOZE_SUPPORT mGetDozeSupport; + HWC2_PFN_GET_HDR_CAPABILITIES mGetHdrCapabilities; HWC2_PFN_GET_RELEASE_FENCES mGetReleaseFences; HWC2_PFN_PRESENT_DISPLAY mPresentDisplay; HWC2_PFN_SET_ACTIVE_CONFIG mSetActiveConfig; @@ -279,6 +282,8 @@ public: outLayerRequests); [[clang::warn_unused_result]] Error getType(DisplayType* outType) const; [[clang::warn_unused_result]] Error supportsDoze(bool* outSupport) const; + [[clang::warn_unused_result]] Error getHdrCapabilities( + std::unique_ptr<android::HdrCapabilities>* outCapabilities) const; [[clang::warn_unused_result]] Error getReleaseFences( std::unordered_map<std::shared_ptr<Layer>, android::sp<android::Fence>>* outFences) const; diff --git a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp index dabc77fb09..6ebcdfeba6 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp @@ -238,6 +238,11 @@ hwc2_function_pointer_t HWC2On1Adapter::doGetFunction( return asFP<HWC2_PFN_GET_DOZE_SUPPORT>( displayHook<decltype(&Display::getDozeSupport), &Display::getDozeSupport, int32_t*>); + case FunctionDescriptor::GetHdrCapabilities: + return asFP<HWC2_PFN_GET_HDR_CAPABILITIES>( + displayHook<decltype(&Display::getHdrCapabilities), + &Display::getHdrCapabilities, uint32_t*, int32_t*, float*, + float*, float*>); case FunctionDescriptor::GetReleaseFences: return asFP<HWC2_PFN_GET_RELEASE_FENCES>( displayHook<decltype(&Display::getReleaseFences), @@ -709,6 +714,15 @@ Error HWC2On1Adapter::Display::getDozeSupport(int32_t* outSupport) return Error::None; } +Error HWC2On1Adapter::Display::getHdrCapabilities(uint32_t* outNumTypes, + int32_t* /*outTypes*/, float* /*outMaxLuminance*/, + float* /*outMaxAverageLuminance*/, float* /*outMinLuminance*/) +{ + // This isn't supported on HWC1, so per the HWC2 header, return numTypes = 0 + *outNumTypes = 0; + return Error::None; +} + Error HWC2On1Adapter::Display::getName(uint32_t* outSize, char* outName) { std::unique_lock<std::recursive_mutex> lock(mStateMutex); diff --git a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h index bffeefe75d..6fdb1840af 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h +++ b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h @@ -194,6 +194,9 @@ private: HWC2::Error getConfigs(uint32_t* outNumConfigs, hwc2_config_t* outConfigIds); HWC2::Error getDozeSupport(int32_t* outSupport); + HWC2::Error getHdrCapabilities(uint32_t* outNumTypes, + int32_t* outTypes, float* outMaxLuminance, + float* outMaxAverageLuminance, float* outMinLuminance); HWC2::Error getName(uint32_t* outSize, char* outName); HWC2::Error getReleaseFences(uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outFences); diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 26f951979c..cd2e05f3a8 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -736,6 +736,26 @@ void HWComposer::clearReleaseFences(int32_t displayId) { mDisplayData[displayId].releaseFences.clear(); } +std::unique_ptr<HdrCapabilities> HWComposer::getHdrCapabilities( + int32_t displayId) { + if (!isValidDisplay(displayId)) { + ALOGE("getHdrCapabilities: Display %d is not valid", displayId); + return nullptr; + } + + auto& hwcDisplay = mDisplayData[displayId].hwcDisplay; + std::unique_ptr<HdrCapabilities> capabilities; + auto error = hwcDisplay->getHdrCapabilities(&capabilities); + if (error != HWC2::Error::None) { + ALOGE("getOutputCapabilities: Failed to get capabilities on display %d:" + " %s (%d)", displayId, to_string(error).c_str(), + static_cast<int32_t>(error)); + return nullptr; + } + + return capabilities; +} + // 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 30c8f6719a..d407877bf0 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -130,6 +130,9 @@ public: // it can call this to clear the shared pointers in the release fence map void clearReleaseFences(int32_t displayId); + // Returns the HDR capabilities of the given display + std::unique_ptr<HdrCapabilities> getHdrCapabilities(int32_t displayId); + // Events handling --------------------------------------------------------- void setVsyncEnabled(int32_t disp, HWC2::Vsync enabled); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 40e9ae78c9..1f85bee079 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -715,6 +715,27 @@ status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const { return NO_ERROR; } +status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display, + HdrCapabilities* outCapabilities) const { + Mutex::Autolock _l(mStateLock); + + sp<const DisplayDevice> displayDevice(getDisplayDevice(display)); + if (displayDevice == nullptr) { + ALOGE("getHdrCapabilities: Invalid display %p", displayDevice.get()); + return BAD_VALUE; + } + + std::unique_ptr<HdrCapabilities> capabilities = + mHwc->getHdrCapabilities(displayDevice->getHwcDisplayId()); + if (capabilities) { + std::swap(*outCapabilities, *capabilities); + } else { + return BAD_VALUE; + } + + return NO_ERROR; +} + // ---------------------------------------------------------------------------- sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() { @@ -2881,6 +2902,7 @@ status_t SurfaceFlinger::onTransact( case CLEAR_ANIMATION_FRAME_STATS: case GET_ANIMATION_FRAME_STATS: case SET_POWER_MODE: + case GET_HDR_CAPABILITIES: { // codes that require permission check IPCThreadState* ipc = IPCThreadState::self(); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 37110b9260..8c974d0baa 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -222,6 +222,8 @@ private: virtual status_t setActiveConfig(const sp<IBinder>& display, int id); virtual status_t clearAnimationFrameStats(); virtual status_t getAnimationFrameStats(FrameStats* outStats) const; + virtual status_t getHdrCapabilities(const sp<IBinder>& display, + HdrCapabilities* outCapabilities) const; /* ------------------------------------------------------------------------ * DeathRecipient interface diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index a63ec50ba5..e9b3d99101 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -45,6 +45,7 @@ #include <gui/GraphicBufferAlloc.h> #include <ui/GraphicBufferAllocator.h> +#include <ui/HdrCapabilities.h> #include <ui/PixelFormat.h> #include <ui/UiConfig.h> @@ -748,6 +749,13 @@ status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const { return NO_ERROR; } +status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/, + HdrCapabilities* outCapabilities) const { + // HWC1 does not provide HDR capabilities + *outCapabilities = HdrCapabilities(); + return NO_ERROR; +} + // ---------------------------------------------------------------------------- sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() { @@ -2917,6 +2925,7 @@ status_t SurfaceFlinger::onTransact( case CLEAR_ANIMATION_FRAME_STATS: case GET_ANIMATION_FRAME_STATS: case SET_POWER_MODE: + case GET_HDR_CAPABILITIES: { // codes that require permission check IPCThreadState* ipc = IPCThreadState::self(); |