summaryrefslogtreecommitdiffstats
path: root/sdm
diff options
context:
space:
mode:
authorNaseer Ahmed <naseer@codeaurora.org>2018-05-04 01:37:51 -0400
committerNaseer Ahmed <naseer@codeaurora.org>2018-05-12 12:56:46 -0400
commit22bc506c43d74f429bc3223edc3283bd40b44e62 (patch)
treee1e0340abba481d4d98b642f78cd4f80d1ee2068 /sdm
parent8fb317a73d6a22032f85150a014f1464d9fe1710 (diff)
downloadandroid_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.cpp23
-rw-r--r--sdm/libs/hwc2/hwc_display.h2
-rw-r--r--sdm/libs/hwc2/hwc_layers.cpp50
-rw-r--r--sdm/libs/hwc2/hwc_layers.h8
-rw-r--r--sdm/libs/hwc2/hwc_session.cpp19
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());