hwc: Add support to query CWB support.
CRs-Fixed: 2607415
Change-Id: I5e0e084d5b25884652e799ac09c558c79c73edd3
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index 6bcb489..c96fe61 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -409,6 +409,7 @@
VsyncPeriodChangeTimeline *out_timeline);
HWC2::Error SetDisplayElapseTime(uint64_t time);
+ virtual bool HasReadBackBufferSupport() { return false; }
protected:
static uint32_t throttling_refresh_rate_;
diff --git a/composer/hwc_display_builtin.cpp b/composer/hwc_display_builtin.cpp
index eaee590..8d3bb4e 100644
--- a/composer/hwc_display_builtin.cpp
+++ b/composer/hwc_display_builtin.cpp
@@ -1317,4 +1317,11 @@
return 0;
}
+bool HWCDisplayBuiltIn::HasReadBackBufferSupport() {
+ DisplayConfigFixedInfo fixed_info = {};
+ display_intf_->GetConfig(&fixed_info);
+
+ return fixed_info.readback_supported;
+}
+
} // namespace sdm
diff --git a/composer/hwc_display_builtin.h b/composer/hwc_display_builtin.h
index 58583a2..0bbf034 100644
--- a/composer/hwc_display_builtin.h
+++ b/composer/hwc_display_builtin.h
@@ -144,6 +144,7 @@
int32_t samples_size[NUM_HISTOGRAM_COLOR_COMPONENTS],
uint64_t *samples[NUM_HISTOGRAM_COLOR_COMPONENTS]);
void Dump(std::ostringstream *os) override;
+ virtual bool HasReadBackBufferSupport();
private:
HWCDisplayBuiltIn(CoreInterface *core_intf, BufferAllocator *buffer_allocator,
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index b4c94c7..d4a7053 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -3154,14 +3154,16 @@
}
HWCDisplay *hwc_display = hwc_display_[display];
-
- if (hwc_display) {
- *format = HAL_PIXEL_FORMAT_RGB_888;
- *dataspace = GetDataspaceFromColorMode(hwc_display->GetCurrentColorMode());
- return HWC2_ERROR_NONE;
+ if (hwc_display == nullptr) {
+ return HWC2_ERROR_BAD_DISPLAY;
+ } else if (!hwc_display->HasReadBackBufferSupport()) {
+ return HWC2_ERROR_UNSUPPORTED;
}
- return HWC2_ERROR_BAD_DISPLAY;
+ *format = HAL_PIXEL_FORMAT_RGB_888;
+ *dataspace = GetDataspaceFromColorMode(hwc_display->GetCurrentColorMode());
+
+ return HWC2_ERROR_NONE;
}
int32_t HWCSession::SetReadbackBuffer(hwc2_display_t display, const native_handle_t *buffer,
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 6541fca..c8d1cf6 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -202,6 +202,7 @@
float average_luminance = 0.0f; //!< From Panel's average luminance
float min_luminance = 0.0f; //!< From Panel's blackness level
bool partial_update = false; //!< If display supports Partial Update.
+ bool readback_supported = false; //!< If display supports buffer readback.
};
/*! @brief This structure defines configuration for variable properties of a display device.
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 40fa217..7c78ea9 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -517,6 +517,7 @@
fixed_info->hdr_eotf = hw_panel_info_.hdr_eotf;
fixed_info->hdr_metadata_type_one = hw_panel_info_.hdr_metadata_type_one;
fixed_info->partial_update = hw_panel_info_.partial_update;
+ fixed_info->readback_supported = hw_resource_info.has_concurrent_writeback;
return kErrorNone;
}