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;
 }