diff options
-rw-r--r-- | hwc3/ComposerClient.cpp | 3 | ||||
-rw-r--r-- | hwc3/ComposerCommandEngine.cpp | 6 | ||||
-rw-r--r-- | hwc3/ComposerServiceWriter.h | 3 | ||||
-rw-r--r-- | hwc3/impl/HalImpl.cpp | 7 | ||||
-rw-r--r-- | hwc3/impl/HalImpl.h | 3 | ||||
-rw-r--r-- | hwc3/include/IComposerHal.h | 4 | ||||
-rw-r--r-- | include/displaycolor/displaycolor.h | 15 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 8 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 5 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosHwc3Types.h | 6 |
10 files changed, 45 insertions, 15 deletions
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp index 8638d08..6997087 100644 --- a/hwc3/ComposerClient.cpp +++ b/hwc3/ComposerClient.cpp @@ -554,7 +554,8 @@ void ComposerClient::destroyResources() { std::vector<int32_t> requestMasks; ClientTargetProperty clientTargetProperty; mHal->validateDisplay(display, &changedLayers, &compositionTypes, &displayRequestMask, - &requestedLayers, &requestMasks, &clientTargetProperty); + &requestedLayers, &requestMasks, &clientTargetProperty, + nullptr /* outDimmingStage */); mHal->acceptDisplayChanges(display); ndk::ScopedFileDescriptor presentFence; diff --git a/hwc3/ComposerCommandEngine.cpp b/hwc3/ComposerCommandEngine.cpp index 6daf215..ff66f9d 100644 --- a/hwc3/ComposerCommandEngine.cpp +++ b/hwc3/ComposerCommandEngine.cpp @@ -139,15 +139,17 @@ int32_t ComposerCommandEngine::executeValidateDisplayInternal(int64_t display) { std::vector<int32_t> requestMasks; ClientTargetProperty clientTargetProperty{common::PixelFormat::RGBA_8888, common::Dataspace::UNKNOWN}; + DimmingStage dimmingStage; auto err = mHal->validateDisplay(display, &changedLayers, &compositionTypes, &displayRequestMask, - &requestedLayers, &requestMasks, &clientTargetProperty); + &requestedLayers, &requestMasks, &clientTargetProperty, + &dimmingStage); mResources->setDisplayMustValidateState(display, false); if (!err) { mWriter->setChangedCompositionTypes(display, changedLayers, compositionTypes); mWriter->setDisplayRequests(display, displayRequestMask, requestedLayers, requestMasks); static constexpr float kBrightness = 1.f; - mWriter->setClientTargetProperty(display, clientTargetProperty, kBrightness); + mWriter->setClientTargetProperty(display, clientTargetProperty, kBrightness, dimmingStage); } else { LOG(ERROR) << __func__ << ": err " << err; mWriter->setError(mCommandIndex, err); diff --git a/hwc3/ComposerServiceWriter.h b/hwc3/ComposerServiceWriter.h index ee1607b..6c3970f 100644 --- a/hwc3/ComposerServiceWriter.h +++ b/hwc3/ComposerServiceWriter.h @@ -108,11 +108,12 @@ public: } void setClientTargetProperty(int64_t display, const ClientTargetProperty& clientTargetProperty, - float brightness) { + float brightness, const DimmingStage& dimmingStage) { ClientTargetPropertyWithBrightness clientTargetPropertyWithBrightness; clientTargetPropertyWithBrightness.display = display; clientTargetPropertyWithBrightness.clientTargetProperty = clientTargetProperty; clientTargetPropertyWithBrightness.brightness = brightness; + clientTargetPropertyWithBrightness.dimmingStage = dimmingStage; mCommandsResults.emplace_back(std::move(clientTargetPropertyWithBrightness)); } diff --git a/hwc3/impl/HalImpl.cpp b/hwc3/impl/HalImpl.cpp index 8da3c0e..e2be900 100644 --- a/hwc3/impl/HalImpl.cpp +++ b/hwc3/impl/HalImpl.cpp @@ -953,7 +953,8 @@ int32_t HalImpl::validateDisplay(int64_t display, std::vector<int64_t>* outChang uint32_t* outDisplayRequestMask, std::vector<int64_t>* outRequestedLayers, std::vector<int32_t>* outRequestMasks, - ClientTargetProperty* outClientTargetProperty) { + ClientTargetProperty* outClientTargetProperty, + DimmingStage* outDimmingStage) { ExynosDisplay* halDisplay; RET_IF_ERR(getHalDisplay(display, halDisplay)); @@ -982,7 +983,9 @@ int32_t HalImpl::validateDisplay(int64_t display, std::vector<int64_t>* outChang h2a::translate(hwcRequestedLayers, *outRequestedLayers); hwc_client_target_property hwcProperty; - if (!halDisplay->getClientTargetProperty(&hwcProperty)) { + HwcDimmingStage hwcDimmingStage; + if (!halDisplay->getClientTargetProperty(&hwcProperty, &hwcDimmingStage)) { + h2a::translate(hwcDimmingStage, *outDimmingStage); h2a::translate(hwcProperty, *outClientTargetProperty); } // else ignore this error diff --git a/hwc3/impl/HalImpl.h b/hwc3/impl/HalImpl.h index f48b930..f772ca4 100644 --- a/hwc3/impl/HalImpl.h +++ b/hwc3/impl/HalImpl.h @@ -146,7 +146,8 @@ class HalImpl : public IComposerHal { uint32_t* outDisplayRequestMask, std::vector<int64_t>* outRequestedLayers, std::vector<int32_t>* outRequestMasks, - ClientTargetProperty* outClientTargetProperty) override; + ClientTargetProperty* outClientTargetProperty, + DimmingStage* outDimmingStage) override; int32_t setExpectedPresentTime( int64_t display, const std::optional<ClockMonotonicTimestamp> expectedPresentTime) override; diff --git a/hwc3/include/IComposerHal.h b/hwc3/include/IComposerHal.h index ac5866b..6fe25c5 100644 --- a/hwc3/include/IComposerHal.h +++ b/hwc3/include/IComposerHal.h @@ -41,6 +41,7 @@ #include <aidl/android/hardware/graphics/composer3/CommandResultPayload.h> #include <aidl/android/hardware/graphics/composer3/Composition.h> #include <aidl/android/hardware/graphics/composer3/ContentType.h> +#include <aidl/android/hardware/graphics/composer3/DimmingStage.h> #include <aidl/android/hardware/graphics/composer3/DisplayAttribute.h> #include <aidl/android/hardware/graphics/composer3/DisplayBrightness.h> #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h> @@ -210,7 +211,8 @@ class IComposerHal { uint32_t* outDisplayRequestMask, std::vector<int64_t>* outRequestedLayers, std::vector<int32_t>* outRequestMasks, - ClientTargetProperty* outClientTargetProperty) = 0; + ClientTargetProperty* outClientTargetProperty, + DimmingStage* outDimmingStage) = 0; virtual int32_t setExpectedPresentTime( int64_t display, const std::optional<ClockMonotonicTimestamp> expectedPresentTime) = 0; virtual int32_t setIdleTimerEnabled(int64_t display, int32_t timeout) = 0; diff --git a/include/displaycolor/displaycolor.h b/include/displaycolor/displaycolor.h index 74bebcf..eb96ce0 100644 --- a/include/displaycolor/displaycolor.h +++ b/include/displaycolor/displaycolor.h @@ -34,6 +34,8 @@ using android::hardware::graphics::common::V1_2::PixelFormat; /** * hwc/displaycolor interface history * + * 6.0.0.2022-02-22 Get whether dimming in linear. + * 5.0.0.2022-02-17 Add layer dim ratio. * 4.0.0.2021-12-20 Get pixel format and dataspace of blending stage. * 3.0.0.2021-11-18 calibration info intf * 2.0.0.2021-08-27 pass brightness table for hdr10+ @@ -57,7 +59,7 @@ constexpr struct DisplayColorIntfVer { } } kInterfaceVersion { - 4, + 6, 0, 0, }; @@ -116,7 +118,8 @@ struct LayerColorData { bool operator==(const LayerColorData &rhs) const { return dataspace == rhs.dataspace && matrix == rhs.matrix && static_metadata == rhs.static_metadata && - dynamic_metadata == rhs.dynamic_metadata; + dynamic_metadata == rhs.dynamic_metadata && + dim_ratio == rhs.dim_ratio; } /** @@ -221,6 +224,11 @@ struct LayerColorData { * indicates this is an HDR layer. */ HdrDynamicMetadata dynamic_metadata; + + /** + * @brief the layer's luminance dim ratio + */ + float dim_ratio = 1.0f; }; /** @@ -372,7 +380,8 @@ class IDisplayColorGeneric { */ virtual int GetBlendingProperty(DisplayType display, hwc::PixelFormat &pixel_format, - hwc::Dataspace &dataspace) const = 0; + hwc::Dataspace &dataspace, + bool &dimming_linear) const = 0; }; extern "C" { diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp index a932556..4b8e350 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.cpp +++ b/libhwc2.1/libdevice/ExynosDisplay.cpp @@ -4090,10 +4090,14 @@ int32_t ExynosDisplay::setContentType(int32_t /* hwc2_content_type_t */ contentT return HWC2_ERROR_UNSUPPORTED; } -int32_t ExynosDisplay::getClientTargetProperty(hwc_client_target_property_t* outClientTargetProperty) -{ +int32_t ExynosDisplay::getClientTargetProperty( + hwc_client_target_property_t *outClientTargetProperty, + HwcDimmingStage *outDimmingStage) { outClientTargetProperty->pixelFormat = HAL_PIXEL_FORMAT_RGBA_8888; outClientTargetProperty->dataspace = HAL_DATASPACE_UNKNOWN; + if (outDimmingStage != nullptr) + *outDimmingStage = HwcDimmingStage::DIMMING_NONE; + return HWC2_ERROR_NONE; } diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index b2f5b61..5a893d4 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1069,14 +1069,15 @@ class ExynosDisplay { * composer requests. If dataspace field is set to UNKNOWN, it means * the hardware composer requests nothing, the client must ignore the * returned client target property structure. - * + * outDimmingStage - where should the SDR dimming happen. HWC3 only. * Returns HWC2_ERROR_NONE or one of the following errors: * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in * HWC2_ERROR_NOT_VALIDATED - validateDisplay has not been called for this * display */ virtual int32_t getClientTargetProperty( - hwc_client_target_property_t* outClientTargetProperty); + hwc_client_target_property_t* outClientTargetProperty, + HwcDimmingStage *outDimmingStage = nullptr); /* * HWC3 diff --git a/libhwc2.1/libdevice/ExynosHwc3Types.h b/libhwc2.1/libdevice/ExynosHwc3Types.h index 769b758..6e97e13 100644 --- a/libhwc2.1/libdevice/ExynosHwc3Types.h +++ b/libhwc2.1/libdevice/ExynosHwc3Types.h @@ -23,4 +23,10 @@ enum class HwcMountOrientation { ROT_270, }; +enum class HwcDimmingStage { + DIMMING_NONE = 0, + DIMMING_LINEAR, + DIMMING_OETF, +}; + #endif // EXYNOS_HWC3_TYPES_H_ |