diff options
author | Naseer Ahmed <naseer@codeaurora.org> | 2018-05-04 01:37:51 -0400 |
---|---|---|
committer | Naseer Ahmed <naseer@codeaurora.org> | 2018-05-12 12:56:46 -0400 |
commit | 22bc506c43d74f429bc3223edc3283bd40b44e62 (patch) | |
tree | e1e0340abba481d4d98b642f78cd4f80d1ee2068 /sdm | |
parent | 8fb317a73d6a22032f85150a014f1464d9fe1710 (diff) | |
download | android_hardware_qcom_sdm710_display-22bc506c43d74f429bc3223edc3283bd40b44e62.tar.gz android_hardware_qcom_sdm710_display-22bc506c43d74f429bc3223edc3283bd40b44e62.tar.bz2 android_hardware_qcom_sdm710_display-22bc506c43d74f429bc3223edc3283bd40b44e62.zip |
hwc2: Add support for per frame layer metadata
Change-Id: Icd7093690954b30ce99e72119a740c6bfb636a7d
CRs-Fixed: 2237407
Diffstat (limited to 'sdm')
-rw-r--r-- | sdm/libs/hwc2/hwc_display.cpp | 23 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display.h | 2 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_layers.cpp | 50 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_layers.h | 8 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_session.cpp | 19 |
5 files changed, 101 insertions, 1 deletions
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp index a437ce8d..66a0d79a 100644 --- a/sdm/libs/hwc2/hwc_display.cpp +++ b/sdm/libs/hwc2/hwc_display.cpp @@ -908,6 +908,29 @@ HWC2::Error HWCDisplay::GetDisplayType(int32_t *out_type) { } } +HWC2::Error HWCDisplay::GetPerFrameMetadataKeys(uint32_t *out_num_keys, + PerFrameMetadataKey *out_keys) { + if (out_num_keys == nullptr) { + return HWC2::Error::BadParameter; + } + *out_num_keys = UINT32(PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL) + 1; + if (out_keys != nullptr) { + out_keys[0] = PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X; + out_keys[1] = PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y; + out_keys[2] = PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X; + out_keys[3] = PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y; + out_keys[4] = PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X; + out_keys[5] = PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y; + out_keys[6] = PerFrameMetadataKey::WHITE_POINT_X; + out_keys[7] = PerFrameMetadataKey::WHITE_POINT_Y; + out_keys[8] = PerFrameMetadataKey::MAX_LUMINANCE; + out_keys[9] = PerFrameMetadataKey::MIN_LUMINANCE; + out_keys[10] = PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL; + out_keys[11] = PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL; + } + return HWC2::Error::None; +} + HWC2::Error HWCDisplay::GetActiveConfig(hwc2_config_t *out_config) { if (out_config == nullptr) { return HWC2::Error::BadDisplay; diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h index d406b87d..85730986 100644 --- a/sdm/libs/hwc2/hwc_display.h +++ b/sdm/libs/hwc2/hwc_display.h @@ -245,6 +245,8 @@ class HWCDisplay : public DisplayEventHandler { float* out_max_luminance, float* out_max_average_luminance, float* out_min_luminance); + virtual HWC2::Error GetPerFrameMetadataKeys(uint32_t *out_num_keys, + PerFrameMetadataKey *out_keys); virtual HWC2::Error SetDisplayAnimating(bool animating) { animating_ = animating; validated_ = false; diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp index cc4ece99..53610204 100644 --- a/sdm/libs/hwc2/hwc_layers.cpp +++ b/sdm/libs/hwc2/hwc_layers.cpp @@ -511,6 +511,56 @@ HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) { return HWC2::Error::None; } +HWC2::Error HWCLayer::SetLayerPerFrameMetadata(uint32_t num_elements, + const PerFrameMetadataKey *keys, + const float *metadata) { + auto &mastering_display = layer_->input_buffer.color_metadata.masteringDisplayInfo; + auto &content_light = layer_->input_buffer.color_metadata.contentLightLevel; + for (uint32_t i = 0; i < num_elements; i++) { + switch (keys[i]) { + case PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X: + mastering_display.colorVolumeSEIEnabled = true; + mastering_display.primaries.rgbPrimaries[0][0] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y: + mastering_display.primaries.rgbPrimaries[0][1] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X: + mastering_display.primaries.rgbPrimaries[1][0] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y: + mastering_display.primaries.rgbPrimaries[1][1] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X: + mastering_display.primaries.rgbPrimaries[2][0] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y: + mastering_display.primaries.rgbPrimaries[2][1] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::WHITE_POINT_X: + mastering_display.primaries.whitePoint[0] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::WHITE_POINT_Y: + mastering_display.primaries.whitePoint[1] = UINT32(metadata[i] * 50000); + break; + case PerFrameMetadataKey::MAX_LUMINANCE: + mastering_display.maxDisplayLuminance = UINT32(metadata[i]); + break; + case PerFrameMetadataKey::MIN_LUMINANCE: + mastering_display.minDisplayLuminance = UINT32(metadata[i] * 10000); + break; + case PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL: + content_light.lightLevelSEIEnabled = true; + content_light.maxContentLightLevel = UINT32(metadata[i]); + break; + case PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL: + content_light.minPicAverageLightLevel = UINT32(metadata[i] * 10000); + break; + } + } + return HWC2::Error::None; +} + void HWCLayer::SetRect(const hwc_rect_t &source, LayerRect *target) { target->left = FLOAT(source.left); target->top = FLOAT(source.top); diff --git a/sdm/libs/hwc2/hwc_layers.h b/sdm/libs/hwc2/hwc_layers.h index 41ec6ede..81957cbc 100644 --- a/sdm/libs/hwc2/hwc_layers.h +++ b/sdm/libs/hwc2/hwc_layers.h @@ -31,12 +31,16 @@ #include <hardware/hwcomposer2.h> #undef HWC2_INCLUDE_STRINGIFICATION #undef HWC2_USE_CPP11 -#include <map> +#include <android/hardware/graphics/composer/2.2/IComposerClient.h> #include <deque> +#include <map> #include <set> #include "core/buffer_allocator.h" #include "hwc_buffer_allocator.h" +using PerFrameMetadataKey = + android::hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadataKey; + namespace sdm { DisplayError SetCSC(const private_handle_t *pvt_handle, ColorMetaData *color_metadata); @@ -80,6 +84,8 @@ class HWCLayer { HWC2::Error SetLayerSurfaceDamage(hwc_region_t damage); HWC2::Error SetLayerTransform(HWC2::Transform transform); HWC2::Error SetLayerVisibleRegion(hwc_region_t visible); + HWC2::Error SetLayerPerFrameMetadata(uint32_t num_elements, const PerFrameMetadataKey *keys, + const float *metadata); HWC2::Error SetLayerZOrder(uint32_t z); void SetComposition(const LayerComposition &sdm_composition); HWC2::Composition GetClientRequestedCompositionType() { return client_requested_; } diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp index 30904e16..43796efd 100644 --- a/sdm/libs/hwc2/hwc_session.cpp +++ b/sdm/libs/hwc2/hwc_session.cpp @@ -487,6 +487,21 @@ static int32_t GetDataspaceSaturationMatrix(hwc2_device_t *device, return HWC2_ERROR_NONE; } +static int32_t GetPerFrameMetadataKeys(hwc2_device_t *device, hwc2_display_t display, + uint32_t *out_num_keys, int32_t *int_out_keys) { + auto out_keys = reinterpret_cast<PerFrameMetadataKey *>(int_out_keys); + return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetPerFrameMetadataKeys, + out_num_keys, out_keys); +} + +static int32_t SetLayerPerFrameMetadata(hwc2_device_t *device, hwc2_display_t display, + hwc2_layer_t layer, uint32_t num_elements, + const int32_t *int_keys, const float *metadata) { + auto keys = reinterpret_cast<const PerFrameMetadataKey *>(int_keys); + return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerPerFrameMetadata, + num_elements, keys, metadata); +} + static int32_t GetDisplayAttribute(hwc2_device_t *device, hwc2_display_t display, hwc2_config_t config, int32_t int_attribute, int32_t *out_value) { @@ -956,6 +971,10 @@ hwc2_function_pointer_t HWCSession::GetFunction(struct hwc2_device *device, HWCSession::SetColorModeWithRenderIntent); case HWC2::FunctionDescriptor::GetDataspaceSaturationMatrix: return AsFP<HWC2_PFN_GET_DATASPACE_SATURATION_MATRIX>(GetDataspaceSaturationMatrix); + case HWC2::FunctionDescriptor::GetPerFrameMetadataKeys: + return AsFP<HWC2_PFN_GET_PER_FRAME_METADATA_KEYS>(GetPerFrameMetadataKeys); + case HWC2::FunctionDescriptor::SetLayerPerFrameMetadata: + return AsFP<HWC2_PFN_SET_LAYER_PER_FRAME_METADATA>(SetLayerPerFrameMetadata); default: DLOGD("Unknown/Unimplemented function descriptor: %d (%s)", int_descriptor, to_string(descriptor).c_str()); |