summaryrefslogtreecommitdiff
path: root/sdm
diff options
context:
space:
mode:
authorSushil Chauhan <sushilchauhan@codeaurora.org>2018-06-06 18:41:47 -0700
committerSushil Chauhan <sushilchauhan@codeaurora.org>2018-06-07 10:27:16 -0700
commitdc58f2f991c6bf3d9ac30e3dda059aac89d47729 (patch)
tree8a32d7626e91047404854382071723484b2b3c36 /sdm
parenta0f42d53ee31b155a3eae2ff53727ed0a67aaf69 (diff)
downloaddisplay-dc58f2f991c6bf3d9ac30e3dda059aac89d47729.tar.gz
hwc2: Add support for optional user preferences
Add support for optional user preferences of output buffer format and post-processed flag, in the HWC binder command to dump frame output. CRs-Fixed: 2254012 Change-Id: I33298fab5122c1fa8e687b72dfa429e287261afb
Diffstat (limited to 'sdm')
-rw-r--r--sdm/libs/hwc2/hwc_display.cpp3
-rw-r--r--sdm/libs/hwc2/hwc_display.h3
-rw-r--r--sdm/libs/hwc2/hwc_display_primary.cpp23
-rw-r--r--sdm/libs/hwc2/hwc_display_primary.h3
-rw-r--r--sdm/libs/hwc2/hwc_display_virtual.cpp5
-rw-r--r--sdm/libs/hwc2/hwc_display_virtual.h3
-rw-r--r--sdm/libs/hwc2/hwc_session.cpp16
7 files changed, 42 insertions, 14 deletions
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 570a152c..07dab479 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -984,7 +984,8 @@ DisplayError HWCDisplay::SetMixerResolution(uint32_t width, uint32_t height) {
return kErrorNotSupported;
}
-HWC2::Error HWCDisplay::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type) {
+HWC2::Error HWCDisplay::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type,
+ int32_t format, bool post_processed) {
dump_frame_count_ = count;
dump_frame_index_ = 0;
dump_input_layers_ = ((bit_mask_layer_type & (1 << INPUT_LAYER_DUMP)) != 0);
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index 85730986..8cbd6bb9 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -121,7 +121,8 @@ class HWCDisplay : public DisplayEventHandler {
// Framebuffer configurations
virtual void SetIdleTimeoutMs(uint32_t timeout_ms);
- virtual HWC2::Error SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type);
+ virtual HWC2::Error SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type,
+ int32_t format, bool post_processed);
virtual DisplayError SetMaxMixerStages(uint32_t max_mixer_stages);
virtual DisplayError ControlPartialUpdate(bool enable, uint32_t *pending) {
return kErrorNotSupported;
diff --git a/sdm/libs/hwc2/hwc_display_primary.cpp b/sdm/libs/hwc2/hwc_display_primary.cpp
index a520db52..f86fbe1d 100644
--- a/sdm/libs/hwc2/hwc_display_primary.cpp
+++ b/sdm/libs/hwc2/hwc_display_primary.cpp
@@ -565,8 +565,9 @@ void HWCDisplayPrimary::HandleFrameDump() {
}
}
-HWC2::Error HWCDisplayPrimary::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type) {
- HWCDisplay::SetFrameDumpConfig(count, bit_mask_layer_type);
+HWC2::Error HWCDisplayPrimary::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type,
+ int32_t format, bool post_processed) {
+ HWCDisplay::SetFrameDumpConfig(count, bit_mask_layer_type, format, post_processed);
dump_output_to_file_ = bit_mask_layer_type & (1 << OUTPUT_LAYER_DUMP);
DLOGI("output_layer_dump_enable %d", dump_output_to_file_);
@@ -576,10 +577,18 @@ HWC2::Error HWCDisplayPrimary::SetFrameDumpConfig(uint32_t count, uint32_t bit_m
// Allocate and map output buffer
output_buffer_info_ = {};
- // Since we dump DSPP output use Panel resolution.
- GetPanelResolution(&output_buffer_info_.buffer_config.width,
- &output_buffer_info_.buffer_config.height);
- output_buffer_info_.buffer_config.format = kFormatRGB888;
+
+ if (post_processed) {
+ // To dump post-processed (DSPP) output, use Panel resolution.
+ GetPanelResolution(&output_buffer_info_.buffer_config.width,
+ &output_buffer_info_.buffer_config.height);
+ } else {
+ // To dump Layer Mixer output, use FrameBuffer resolution.
+ GetFrameBufferResolution(&output_buffer_info_.buffer_config.width,
+ &output_buffer_info_.buffer_config.height);
+ }
+
+ output_buffer_info_.buffer_config.format = GetSDMFormat(format, 0);
output_buffer_info_.buffer_config.buffer_count = 1;
if (buffer_allocator_->AllocateBuffer(&output_buffer_info_) != 0) {
DLOGE("Buffer allocation failed");
@@ -599,7 +608,7 @@ HWC2::Error HWCDisplayPrimary::SetFrameDumpConfig(uint32_t count, uint32_t bit_m
output_buffer_base_ = buffer;
const native_handle_t *handle = static_cast<native_handle_t *>(output_buffer_info_.private_data);
- SetReadbackBuffer(handle, -1, true);
+ SetReadbackBuffer(handle, -1, post_processed);
return HWC2::Error::None;
}
diff --git a/sdm/libs/hwc2/hwc_display_primary.h b/sdm/libs/hwc2/hwc_display_primary.h
index 152b9575..7f5e50c9 100644
--- a/sdm/libs/hwc2/hwc_display_primary.h
+++ b/sdm/libs/hwc2/hwc_display_primary.h
@@ -67,7 +67,8 @@ class HWCDisplayPrimary : public HWCDisplay {
virtual void SetSecureDisplay(bool secure_display_active);
virtual DisplayError Refresh();
virtual void SetIdleTimeoutMs(uint32_t timeout_ms);
- virtual HWC2::Error SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type);
+ virtual HWC2::Error SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type,
+ int32_t format, bool post_processed);
virtual int FrameCaptureAsync(const BufferInfo &output_buffer_info, bool post_processed);
virtual bool GetFrameCaptureFence(int32_t *release_fence);
virtual DisplayError SetDetailEnhancerConfig(const DisplayDetailEnhancerData &de_data);
diff --git a/sdm/libs/hwc2/hwc_display_virtual.cpp b/sdm/libs/hwc2/hwc_display_virtual.cpp
index 11193bb8..80677681 100644
--- a/sdm/libs/hwc2/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc2/hwc_display_virtual.cpp
@@ -280,8 +280,9 @@ HWC2::Error HWCDisplayVirtual::SetOutputBuffer(buffer_handle_t buf, int32_t rele
return HWC2::Error::None;
}
-HWC2::Error HWCDisplayVirtual::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type) {
- HWCDisplay::SetFrameDumpConfig(count, bit_mask_layer_type);
+HWC2::Error HWCDisplayVirtual::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type,
+ int32_t format, bool post_processed) {
+ HWCDisplay::SetFrameDumpConfig(count, bit_mask_layer_type, format, post_processed);
dump_output_layer_ = ((bit_mask_layer_type & (1 << OUTPUT_LAYER_DUMP)) != 0);
DLOGI("output_layer_dump_enable %d", dump_output_layer_);
diff --git a/sdm/libs/hwc2/hwc_display_virtual.h b/sdm/libs/hwc2/hwc_display_virtual.h
index cf630fb2..76ceae0f 100644
--- a/sdm/libs/hwc2/hwc_display_virtual.h
+++ b/sdm/libs/hwc2/hwc_display_virtual.h
@@ -46,7 +46,8 @@ class HWCDisplayVirtual : public HWCDisplay {
virtual int Deinit();
virtual HWC2::Error Validate(uint32_t *out_num_types, uint32_t *out_num_requests);
virtual HWC2::Error Present(int32_t *out_retire_fence);
- virtual HWC2::Error SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type);
+ virtual HWC2::Error SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type,
+ int32_t format, bool post_processed);
HWC2::Error SetOutputBuffer(buffer_handle_t buf, int32_t release_fence);
private:
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 43796efd..185eb2d8 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -1416,6 +1416,19 @@ android::status_t HWCSession::SetFrameDumpConfig(const android::Parcel *input_pa
uint32_t frame_dump_count = UINT32(input_parcel->readInt32());
std::bitset<32> bit_mask_display_type = UINT32(input_parcel->readInt32());
uint32_t bit_mask_layer_type = UINT32(input_parcel->readInt32());
+ int32_t output_format = HAL_PIXEL_FORMAT_RGB_888;
+ bool post_processed = true;
+
+ // Read optional user preferences: output_format and post_processed.
+ if (input_parcel->dataPosition() != input_parcel->dataSize()) {
+ // HAL Pixel Format for output buffer
+ output_format = input_parcel->readInt32();
+ }
+ if (input_parcel->dataPosition() != input_parcel->dataSize()) {
+ // Option to dump Layer Mixer output (0) or DSPP output (1)
+ post_processed = (input_parcel->readInt32() != 0);
+ }
+
android::status_t status = 0;
for (uint32_t disp_id = HWC_DISPLAY_PRIMARY; disp_id < HWC_NUM_DISPLAY_TYPES; disp_id++) {
@@ -1423,7 +1436,8 @@ android::status_t HWCSession::SetFrameDumpConfig(const android::Parcel *input_pa
SEQUENCE_WAIT_SCOPE_LOCK(locker_[disp_id]);
if (hwc_display_[disp_id]) {
HWC2::Error error;
- error = hwc_display_[disp_id]->SetFrameDumpConfig(frame_dump_count, bit_mask_layer_type);
+ error = hwc_display_[disp_id]->SetFrameDumpConfig(frame_dump_count, bit_mask_layer_type,
+ output_format, post_processed);
if (HWC2::Error::None != error) {
if (HWC2::Error::NoResources == error)
status = -ENOMEM;