diff options
Diffstat (limited to 'sdm')
-rw-r--r-- | sdm/libs/hwc2/hwc_display.cpp | 3 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display.h | 3 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display_primary.cpp | 23 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display_primary.h | 3 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display_virtual.cpp | 5 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display_virtual.h | 3 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_session.cpp | 16 |
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; |