Snap for 12378824 from 2204724e2d060a64032e9bea6d66a667873c8dd4 to 24Q4-release

Change-Id: I8f97a0d689264eb09ad7d2441a0975da77ad043c
diff --git a/.ci/Dockerfile b/.ci/Dockerfile
index a038cd7..c42c8b6 100644
--- a/.ci/Dockerfile
+++ b/.ci/Dockerfile
@@ -41,12 +41,11 @@
 USER ${RUN_USER}
 
 # Install aospless package (produced by GloDroid/aospext)
-RUN wget -P ${USER_HOME} https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/uploads/af611363cabab0e9557c53b844197228/aospless_drm_hwcomposer_arm64.tar.xz && \
+RUN wget -P ${USER_HOME} https://gitlab.freedesktop.org/-/project/5/uploads/d66764aa71f9f1235b92d44a652cd3c3/aospless_drm_hwcomposer_arm64.tar.xz && \
     cd ${USER_HOME} && \
     sha256sum aospless_drm_hwcomposer_arm64.tar.xz && \
-    (echo 07b70f3172acf55dafb5882fab0c6c618854e3a9ff7496fa8b1e5fd2ee68cf0a aospless_drm_hwcomposer_arm64.tar.xz | sha256sum --check) && \
-    tar xf aospless_drm_hwcomposer_arm64.tar.xz && \
-    rm -r ${USER_HOME}/aospless/src && ln -s ../drm_hwcomposer/ ${USER_HOME}/aospless/src
+    (echo 00ff288f184111dd35143c462e82fd5f8f31a1417d5eb9a11e8798695abcc141 aospless_drm_hwcomposer_arm64.tar.xz | sha256sum --check) && \
+    tar xf aospless_drm_hwcomposer_arm64.tar.xz && ln -s ../drm_hwcomposer/ ${USER_HOME}/aospless/src
 
 # Create project path
 RUN mkdir -pv ${USER_HOME}/drm_hwcomposer
diff --git a/.ci/Makefile b/.ci/Makefile
index 01584c9..325e0b5 100644
--- a/.ci/Makefile
+++ b/.ci/Makefile
@@ -43,6 +43,7 @@
     -google-readability-todo                            \
     -hicpp-vararg                                       \
     -hicpp-signed-bitwise                               \
+    -misc-const-correctness                             \
     -readability-identifier-length                      \
 
 TIDY_CHECKS_NORMAL :=                                   \
diff --git a/Android.bp b/Android.bp
index 8b09171..7d014dc 100644
--- a/Android.bp
+++ b/Android.bp
@@ -127,7 +127,6 @@
         "hwc3/ComposerResources.cpp",
         "hwc3/DrmHwcThree.cpp",
         "hwc3/Utils.cpp",
-        "hwc3/DrmHwcThree.cpp",
     ],
 }
 
@@ -182,10 +181,10 @@
     name: "android.hardware.composer.hwc3-service.drm",
 
     srcs: [
-      ":drm_hwcomposer_hwc3",
-      ":drm_hwcomposer_service",
-      ":drm_hwcomposer_common",
-      "bufferinfo/legacy/BufferInfoLibdrm.cpp",
+        ":drm_hwcomposer_hwc3",
+        ":drm_hwcomposer_service",
+        ":drm_hwcomposer_common",
+        "bufferinfo/legacy/BufferInfoLibdrm.cpp",
     ],
 
     defaults: [
@@ -193,7 +192,7 @@
     ],
 
     shared_libs: [
-        "android.hardware.graphics.composer3-V1-ndk",
+        "android.hardware.graphics.composer3-V3-ndk",
         "libbase",
         "libbinder",
         "libbinder_ndk",
diff --git a/drm/DrmHwc.cpp b/drm/DrmHwc.cpp
index 6457d79..df3eb56 100644
--- a/drm/DrmHwc.cpp
+++ b/drm/DrmHwc.cpp
@@ -193,4 +193,10 @@
   return writeback_count;
 }
 
+void DrmHwc::DeinitDisplays() {
+  for (auto &pair : Displays()) {
+    pair.second->SetPipeline(nullptr);
+  }
+}
+
 }  // namespace android
\ No newline at end of file
diff --git a/drm/DrmHwc.h b/drm/DrmHwc.h
index 36ff80d..44dc276 100644
--- a/drm/DrmHwc.h
+++ b/drm/DrmHwc.h
@@ -57,6 +57,8 @@
     deferred_hotplug_events_[displayid] = connected;
   }
 
+  void DeinitDisplays();
+
   // PipelineToFrontendBindingInterface
   bool BindDisplay(std::shared_ptr<DrmDisplayPipeline> pipeline) override;
   bool UnbindDisplay(std::shared_ptr<DrmDisplayPipeline> pipeline) override;
diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp
index e8bd945..36333d2 100644
--- a/hwc2_device/HwcDisplay.cpp
+++ b/hwc2_device/HwcDisplay.cpp
@@ -133,6 +133,8 @@
   }
 
   if (vsync_worker_) {
+    // TODO: There should be a mechanism to wait for this worker to complete,
+    // otherwise there is a race condition while destructing the HwcDisplay.
     vsync_worker_->StopThread();
     vsync_worker_ = {};
   }
@@ -345,8 +347,8 @@
   return HWC2::Error::None;
 }
 
-HWC2::Error HwcDisplay::GetDisplayConfigs(uint32_t *num_configs,
-                                          hwc2_config_t *configs) {
+HWC2::Error HwcDisplay::LegacyGetDisplayConfigs(uint32_t *num_configs,
+                                                hwc2_config_t *configs) {
   uint32_t idx = 0;
   for (auto &hwc_config : configs_.hwc_configs) {
     if (hwc_config.second.disabled) {
diff --git a/hwc2_device/HwcDisplay.h b/hwc2_device/HwcDisplay.h
index 9fe555d..87d2da7 100644
--- a/hwc2_device/HwcDisplay.h
+++ b/hwc2_device/HwcDisplay.h
@@ -54,6 +54,10 @@
 
   std::string Dump();
 
+  const HwcDisplayConfigs &GetDisplayConfigs() const {
+    return configs_;
+  }
+
   // HWC Hooks
   HWC2::Error AcceptDisplayChanges();
   HWC2::Error CreateLayer(hwc2_layer_t *layer);
@@ -66,7 +70,8 @@
   HWC2::Error GetColorModes(uint32_t *num_modes, int32_t *modes);
   HWC2::Error GetDisplayAttribute(hwc2_config_t config, int32_t attribute,
                                   int32_t *value);
-  HWC2::Error GetDisplayConfigs(uint32_t *num_configs, hwc2_config_t *configs);
+  HWC2::Error LegacyGetDisplayConfigs(uint32_t *num_configs,
+                                      hwc2_config_t *configs);
   HWC2::Error GetDisplayName(uint32_t *size, char *name);
   HWC2::Error GetDisplayRequests(int32_t *display_requests,
                                  uint32_t *num_elements, hwc2_layer_t *layers,
diff --git a/hwc2_device/hwc2_device.cpp b/hwc2_device/hwc2_device.cpp
index bd2ada5..28b6963 100644
--- a/hwc2_device/hwc2_device.cpp
+++ b/hwc2_device/hwc2_device.cpp
@@ -177,8 +177,8 @@
                       int32_t *>);
     case HWC2::FunctionDescriptor::GetDisplayConfigs:
       return ToHook<HWC2_PFN_GET_DISPLAY_CONFIGS>(
-          DisplayHook<decltype(&HwcDisplay::GetDisplayConfigs),
-                      &HwcDisplay::GetDisplayConfigs, uint32_t *,
+          DisplayHook<decltype(&HwcDisplay::LegacyGetDisplayConfigs),
+                      &HwcDisplay::LegacyGetDisplayConfigs, uint32_t *,
                       hwc2_config_t *>);
     case HWC2::FunctionDescriptor::GetDisplayName:
       return ToHook<HWC2_PFN_GET_DISPLAY_NAME>(
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp
index e60d9e8..f353abb 100644
--- a/hwc3/ComposerClient.cpp
+++ b/hwc3/ComposerClient.cpp
@@ -42,11 +42,13 @@
 #include "cutils/native_handle.h"
 #include "hardware/hwcomposer_defs.h"
 #include "hwc2_device/HwcDisplay.h"
+#include "hwc2_device/HwcDisplayConfigs.h"
 #include "hwc2_device/HwcLayer.h"
 #include "hwc3/DrmHwcThree.h"
 #include "hwc3/Utils.h"
 
 using ::android::HwcDisplay;
+using ::android::HwcDisplayConfigs;
 
 #include "utils/log.h"
 
@@ -79,6 +81,20 @@
 
 ComposerClient::~ComposerClient() {
   DEBUG_FUNC();
+  {
+    // First Deinit the displays to start shutting down the Display's dependent
+    // threads such as VSyncWorker.
+    const std::unique_lock lock(hwc_->GetResMan().GetMainLock());
+    hwc_->DeinitDisplays();
+  }
+  // Sleep to wait for threads to complete and exit.
+  const int time_for_threads_to_exit_us = 200000;
+  usleep(time_for_threads_to_exit_us);
+  {
+    // Hold the lock while destructing the hwc_ and the objects that it owns.
+    const std::unique_lock lock(hwc_->GetResMan().GetMainLock());
+    hwc_.reset();
+  }
   LOG(DEBUG) << "removed composer client";
 }
 
@@ -508,14 +524,14 @@
 
   uint32_t num_configs = 0;
   hwc3::Error error = Hwc2toHwc3Error(
-      display->GetDisplayConfigs(&num_configs, nullptr));
+      display->LegacyGetDisplayConfigs(&num_configs, nullptr));
   if (error != hwc3::Error::kNone) {
     return ToBinderStatus(error);
   }
 
   std::vector<hwc2_config_t> out_configs(num_configs);
   error = Hwc2toHwc3Error(
-      display->GetDisplayConfigs(&num_configs, out_configs.data()));
+      display->LegacyGetDisplayConfigs(&num_configs, out_configs.data()));
   if (error != hwc3::Error::kNone) {
     return ToBinderStatus(error);
   }
@@ -917,6 +933,71 @@
   return ToBinderStatus(hwc3::Error::kUnsupported);
 }
 
+ndk::ScopedAStatus ComposerClient::getOverlaySupport(
+    OverlayProperties* /*out_overlay_properties*/) {
+  return ToBinderStatus(hwc3::Error::kUnsupported);
+}
+
+ndk::ScopedAStatus ComposerClient::getHdrConversionCapabilities(
+    std::vector<common::HdrConversionCapability>* /*out_capabilities*/) {
+  return ToBinderStatus(hwc3::Error::kUnsupported);
+}
+
+ndk::ScopedAStatus ComposerClient::setHdrConversionStrategy(
+    const common::HdrConversionStrategy& /*conversion_strategy*/,
+    common::Hdr* /*out_hdr*/) {
+  return ToBinderStatus(hwc3::Error::kUnsupported);
+}
+
+ndk::ScopedAStatus ComposerClient::setRefreshRateChangedCallbackDebugEnabled(
+    int64_t /*display*/, bool /*enabled*/) {
+  return ToBinderStatus(hwc3::Error::kUnsupported);
+}
+
+ndk::ScopedAStatus ComposerClient::getDisplayConfigurations(
+    int64_t display_id, int32_t /*max_frame_interval_ns*/,
+    std::vector<DisplayConfiguration>* configurations) {
+  DEBUG_FUNC();
+  const std::unique_lock lock(hwc_->GetResMan().GetMainLock());
+  HwcDisplay* display = GetDisplay(display_id);
+  if (display == nullptr) {
+    return ToBinderStatus(hwc3::Error::kBadDisplay);
+  }
+
+  const HwcDisplayConfigs& configs = display->GetDisplayConfigs();
+  for (const auto& [id, config] : configs.hwc_configs) {
+    static const int kNanosecondsPerSecond = 1E9;
+    configurations->emplace_back(
+        DisplayConfiguration{.configId = static_cast<int32_t>(config.id),
+                             .width = config.mode.GetRawMode().hdisplay,
+                             .height = config.mode.GetRawMode().vdisplay,
+                             .configGroup = static_cast<int32_t>(
+                                 config.group_id),
+                             .vsyncPeriod = static_cast<int>(kNanosecondsPerSecond * double(
+                                 1 / config.mode.GetVRefresh()))});
+
+    if (configs.mm_width != 0) {
+      // ideally this should be vdisplay/mm_heigth, however mm_height
+      // comes from edid parsing and is highly unreliable. Viewing the
+      // rarity of anisotropic displays, falling back to a single value
+      // for dpi yield more correct output.
+      static const float kMmPerInch = 25.4;
+      float dpi = float(config.mode.GetRawMode().hdisplay) * kMmPerInch /
+                  float(configs.mm_width);
+      configurations->back().dpi = {.x = dpi, .y = dpi};
+    }
+
+    // TODO: Populate vrrConfig.
+  }
+  return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus ComposerClient::notifyExpectedPresent(
+    int64_t /*display*/, const ClockMonotonicTimestamp& /*expected_present_time*/,
+    int32_t /*frame_interval_ns*/) {
+  return ToBinderStatus(hwc3::Error::kUnsupported);
+}
+
 std::string ComposerClient::Dump() {
   uint32_t size = 0;
   hwc_->Dump(&size, nullptr);
diff --git a/hwc3/ComposerClient.h b/hwc3/ComposerClient.h
index 616f8aa..f6362ad 100644
--- a/hwc3/ComposerClient.h
+++ b/hwc3/ComposerClient.h
@@ -136,6 +136,21 @@
   ndk::ScopedAStatus setVsyncEnabled(int64_t display, bool enabled) override;
   ndk::ScopedAStatus setIdleTimerEnabled(int64_t display,
                                          int32_t timeout) override;
+  ndk::ScopedAStatus getOverlaySupport(
+      OverlayProperties* out_overlay_properties) override;
+  ndk::ScopedAStatus getHdrConversionCapabilities(
+      std::vector<common::HdrConversionCapability>* out_capabilities) override;
+  ndk::ScopedAStatus setHdrConversionStrategy(
+      const common::HdrConversionStrategy& conversion_strategy,
+      common::Hdr* out_hdr) override;
+  ndk::ScopedAStatus setRefreshRateChangedCallbackDebugEnabled(
+      int64_t display, bool enabled) override;
+  ndk::ScopedAStatus getDisplayConfigurations(
+      int64_t display, int32_t max_frame_interval_ns,
+      std::vector<DisplayConfiguration>* configurations) override;
+  ndk::ScopedAStatus notifyExpectedPresent(
+      int64_t display, const ClockMonotonicTimestamp& expected_present_time,
+      int32_t frame_interval_ns) override;
 
  protected:
   ::ndk::SpAIBinder createBinder() override;
diff --git a/hwc3/DrmHwcThree.cpp b/hwc3/DrmHwcThree.cpp
index 0adecf4..d758865 100644
--- a/hwc3/DrmHwcThree.cpp
+++ b/hwc3/DrmHwcThree.cpp
@@ -20,6 +20,7 @@
 
 #include "Utils.h"
 #include "aidl/android/hardware/graphics/common/Dataspace.h"
+#include "aidl/android/hardware/graphics/common/DisplayHotplugEvent.h"
 
 namespace aidl::android::hardware::graphics::composer3::impl {
 
@@ -61,7 +62,8 @@
 void DrmHwcThree::SendHotplugEventToClient(hwc2_display_t display_id,
                                            bool connected) {
   HandleDisplayHotplugEvent(static_cast<uint64_t>(display_id), connected);
-  composer_callback_->onHotplug(static_cast<int64_t>(display_id), connected);
+  common::DisplayHotplugEvent event = connected ? common::DisplayHotplugEvent::CONNECTED : common::DisplayHotplugEvent::DISCONNECTED;
+  composer_callback_->onHotplugEvent(static_cast<int64_t>(display_id), event);
 }
 
 void DrmHwcThree::CleanDisplayResources(uint64_t display_id) {
diff --git a/hwc3/hwc3-drm.xml b/hwc3/hwc3-drm.xml
index 05a7c09..911f7f8 100644
--- a/hwc3/hwc3-drm.xml
+++ b/hwc3/hwc3-drm.xml
@@ -1,7 +1,7 @@
 <manifest version="1.0" type="device">
     <hal format="aidl">
         <name>android.hardware.graphics.composer3</name>
-        <version>1</version>
+        <version>3</version>
         <interface>
             <name>IComposer</name>
             <instance>default</instance>