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>