Upgrade drm_hwcomposer to 7009cc1909804ef707376441b5b3f986b492d66a
This project was upgraded with external_updater.
Usage: tools/external_updater/updater.sh update external/drm_hwcomposer
For more info, check https://cs.android.com/android/platform/superproject/main/+/main:tools/external_updater/README.md
Test: TreeHugger
Change-Id: Iccce48405a92ce7e469f1c60b04fb576e2702838
diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp
index 13287ef..15a4c6e 100644
--- a/hwc2_device/HwcDisplay.cpp
+++ b/hwc2_device/HwcDisplay.cpp
@@ -216,7 +216,7 @@
case 2: // SDR
[[fallthrough]];
default:
- hdr_metadata_.reset();
+ hdr_metadata_ = std::make_shared<hdr_output_metadata>();
min_bpc_ = 6;
colorspace_ = Colorspace::kDefault;
}
@@ -355,9 +355,22 @@
return changed_layers;
}
+auto HwcDisplay::GetDisplayBoundsMm() -> std::pair<int32_t, int32_t> {
+
+ const auto bounds = GetEdid()->GetBoundsMm();
+ if (bounds.first > 0 || bounds.second > 0) {
+ return bounds;
+ }
+
+ ALOGE("Failed to get display bounds for d=%d\n", int(handle_));
+ // mm_width and mm_height are unreliable. so only provide mm_width to avoid
+ // wrong dpi computations or other use of the values.
+ return {configs_.mm_width, -1};
+}
+
auto HwcDisplay::AcceptValidatedComposition() -> void {
- for (std::pair<const hwc2_layer_t, HwcLayer> &l : layers_) {
- l.second.AcceptTypeChange();
+ for (auto &[_, layer] : layers_) {
+ layer.AcceptTypeChange();
}
}
@@ -506,20 +519,18 @@
return SetActiveConfig(configs_.preferred_config_id);
}
-HWC2::Error HwcDisplay::CreateLayer(hwc2_layer_t *layer) {
- layers_.emplace(static_cast<hwc2_layer_t>(layer_idx_), HwcLayer(this));
- *layer = static_cast<hwc2_layer_t>(layer_idx_);
- ++layer_idx_;
- return HWC2::Error::None;
+auto HwcDisplay::CreateLayer(ILayerId new_layer_id) -> bool {
+ if (layers_.count(new_layer_id) > 0)
+ return false;
+
+ layers_.emplace(new_layer_id, HwcLayer(this));
+
+ return true;
}
-HWC2::Error HwcDisplay::DestroyLayer(hwc2_layer_t layer) {
- if (!get_layer(layer)) {
- return HWC2::Error::BadLayer;
- }
-
- layers_.erase(layer);
- return HWC2::Error::None;
+auto HwcDisplay::DestroyLayer(ILayerId layer_id) -> bool {
+ auto count = layers_.erase(layer_id);
+ return count != 0;
}
HWC2::Error HwcDisplay::GetActiveConfig(hwc2_config_t *config) const {
@@ -588,15 +599,25 @@
*value = hwc_config.mode.GetVSyncPeriodNs();
break;
case HWC2::Attribute::DpiY:
- // 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.
+ *value = GetEdid()->GetDpiY();
+ if (*value < 0) {
+ // default to raw mode DpiX for both x and y when no good value
+ // can be provided from edid.
+ *value = mm_width ? int(hwc_config.mode.GetRawMode().hdisplay *
+ kUmPerInch / mm_width)
+ : -1;
+ }
+ break;
case HWC2::Attribute::DpiX:
// Dots per 1000 inches
- *value = mm_width ? int(hwc_config.mode.GetRawMode().hdisplay *
- kUmPerInch / mm_width)
- : -1;
+ *value = GetEdid()->GetDpiX();
+ if (*value < 0) {
+ // default to raw mode DpiX for both x and y when no good value
+ // can be provided from edid.
+ *value = mm_width ? int(hwc_config.mode.GetRawMode().hdisplay *
+ kUmPerInch / mm_width)
+ : -1;
+ }
break;
#if __ANDROID_API__ > 29
case HWC2::Attribute::ConfigGroup:
@@ -760,15 +781,15 @@
bool use_client_layer = false;
uint32_t client_z_order = UINT32_MAX;
std::map<uint32_t, HwcLayer *> z_map;
- for (std::pair<const hwc2_layer_t, HwcLayer> &l : layers_) {
- switch (l.second.GetValidatedType()) {
+ for (auto &[_, layer] : layers_) {
+ switch (layer.GetValidatedType()) {
case HWC2::Composition::Device:
- z_map.emplace(l.second.GetZOrder(), &l.second);
+ z_map.emplace(layer.GetZOrder(), &layer);
break;
case HWC2::Composition::Client:
// Place it at the z_order of the lowest client layer
use_client_layer = true;
- client_z_order = std::min(client_z_order, l.second.GetZOrder());
+ client_z_order = std::min(client_z_order, layer.GetZOrder());
break;
default:
continue;
@@ -842,7 +863,6 @@
}
if (new_vsync_period_ns) {
- vsync_worker_->SetVsyncPeriodNs(new_vsync_period_ns.value());
staged_mode_config_id_.reset();
vsync_worker_->SetVsyncTimestampTracking(false);
@@ -852,6 +872,7 @@
last_vsync_ts +
prev_vperiod_ns);
}
+ vsync_worker_->SetVsyncPeriodNs(new_vsync_period_ns.value());
}
return HWC2::Error::None;
@@ -1287,4 +1308,12 @@
backend_ = std::move(backend);
}
+bool HwcDisplay::NeedsClientLayerUpdate() const {
+ return std::any_of(layers_.begin(), layers_.end(), [](const auto &pair) {
+ const auto &layer = pair.second;
+ return layer.GetSfType() == HWC2::Composition::Client ||
+ layer.GetValidatedType() == HWC2::Composition::Client;
+ });
+}
+
} // namespace android
diff --git a/hwc2_device/HwcDisplay.h b/hwc2_device/HwcDisplay.h
index 94f3f14..b8c52fe 100644
--- a/hwc2_device/HwcDisplay.h
+++ b/hwc2_device/HwcDisplay.h
@@ -97,10 +97,12 @@
// Get the HwcDisplayConfig, or nullptor if none.
auto GetConfig(hwc2_config_t config_id) const -> const HwcDisplayConfig *;
+ auto GetDisplayBoundsMm() -> std::pair<int32_t, int32_t>;
+
// To be called after SetDisplayProperties. Returns an empty vector if the
// requested layers have been validated, otherwise the vector describes
// the requested composition type changes.
- using ChangedLayer = std::pair<hwc2_layer_t, HWC2::Composition>;
+ using ChangedLayer = std::pair<ILayerId, HWC2::Composition>;
auto ValidateStagedComposition() -> std::vector<ChangedLayer>;
// Mark previously validated properties as ready to present.
@@ -109,7 +111,7 @@
// Present previously staged properties, and return fences to indicate when
// the new content has been presented, and when the previous buffers have
// been released.
- using ReleaseFence = std::pair<hwc2_layer_t, SharedFd>;
+ using ReleaseFence = std::pair<ILayerId, SharedFd>;
auto PresentStagedComposition(SharedFd &out_present_fence,
std::vector<ReleaseFence> &out_release_fences)
-> bool;
@@ -122,9 +124,10 @@
frontend_private_data_ = std::move(data);
}
+ auto CreateLayer(ILayerId new_layer_id) -> bool;
+ auto DestroyLayer(ILayerId layer_id) -> bool;
+
// HWC2 Hooks - these should not be used outside of the hwc2 device.
- HWC2::Error CreateLayer(hwc2_layer_t *layer);
- HWC2::Error DestroyLayer(hwc2_layer_t layer);
HWC2::Error GetActiveConfig(hwc2_config_t *config) const;
HWC2::Error GetColorModes(uint32_t *num_modes, int32_t *modes);
HWC2::Error GetDisplayAttribute(hwc2_config_t config, int32_t attribute,
@@ -167,7 +170,7 @@
HWC2::Error SetColorTransform(const float *matrix, int32_t hint);
HWC2::Error SetPowerMode(int32_t mode);
HWC2::Error SetVsyncEnabled(int32_t enabled);
- HwcLayer *get_layer(hwc2_layer_t layer) {
+ HwcLayer *get_layer(ILayerId layer) {
auto it = layers_.find(layer);
if (it == layers_.end())
return nullptr;
@@ -200,7 +203,7 @@
return hwc_;
}
- std::map<hwc2_layer_t, HwcLayer> &layers() {
+ auto layers() -> std::map<ILayerId, HwcLayer> & {
return layers_;
}
@@ -245,6 +248,8 @@
auto getDisplayPhysicalOrientation() -> std::optional<PanelOrientation>;
+ bool NeedsClientLayerUpdate() const;
+
private:
AtomicCommitArgs CreateModesetCommit(
const HwcDisplayConfig *config,
@@ -268,9 +273,7 @@
const hwc2_display_t handle_;
HWC2::DisplayType type_;
- uint32_t layer_idx_{};
-
- std::map<hwc2_layer_t, HwcLayer> layers_;
+ std::map<ILayerId, HwcLayer> layers_;
HwcLayer client_layer_;
std::unique_ptr<HwcLayer> writeback_layer_;
uint16_t virtual_disp_width_{};
diff --git a/hwc2_device/HwcLayer.cpp b/hwc2_device/HwcLayer.cpp
index d0ff216..400ac9b 100644
--- a/hwc2_device/HwcLayer.cpp
+++ b/hwc2_device/HwcLayer.cpp
@@ -101,6 +101,10 @@
return;
}
+ if (slots_.count(*active_slot_id_) == 0) {
+ return;
+ }
+
layer_data_.bi = slots_[*active_slot_id_].bi;
layer_data_.fb = slots_[*active_slot_id_].fb;
diff --git a/hwc2_device/hwc2_device.cpp b/hwc2_device/hwc2_device.cpp
index 72d0aa9..c1c5157 100644
--- a/hwc2_device/hwc2_device.cpp
+++ b/hwc2_device/hwc2_device.cpp
@@ -53,6 +53,8 @@
public:
std::vector<HwcDisplay::ReleaseFence> release_fences;
std::vector<HwcDisplay::ChangedLayer> changed_layers;
+
+ int64_t next_layer_id = 1;
};
static auto GetHwc2DeviceDisplay(HwcDisplay &display)
@@ -267,6 +269,37 @@
}
/* Display functions */
+static int32_t CreateLayer(hwc2_device_t *device, hwc2_display_t display,
+ hwc2_layer_t *out_layer) {
+ ALOGV("CreateLayer");
+ LOCK_COMPOSER(device);
+ GET_DISPLAY(display);
+
+ auto hwc2display = GetHwc2DeviceDisplay(*idisplay);
+
+ if (!idisplay->CreateLayer(hwc2display->next_layer_id)) {
+ return static_cast<int32_t>(HWC2::Error::BadDisplay);
+ }
+
+ *out_layer = (hwc2_layer_t)hwc2display->next_layer_id;
+ hwc2display->next_layer_id++;
+
+ return 0;
+}
+
+static int32_t DestroyLayer(hwc2_device_t *device, hwc2_display_t display,
+ hwc2_layer_t layer) {
+ ALOGV("DestroyLayer");
+ LOCK_COMPOSER(device);
+ GET_DISPLAY(display);
+
+ if (!idisplay->DestroyLayer((ILayerId)layer)) {
+ return static_cast<int32_t>(HWC2::Error::BadLayer);
+ }
+
+ return 0;
+}
+
static int32_t GetDisplayRequests(hwc2_device_t * /*device*/,
hwc2_display_t /*display*/,
int32_t * /* out_display_requests */,
@@ -763,13 +796,9 @@
case HWC2::FunctionDescriptor::AcceptDisplayChanges:
return (hwc2_function_pointer_t)AcceptDisplayChanges;
case HWC2::FunctionDescriptor::CreateLayer:
- return ToHook<HWC2_PFN_CREATE_LAYER>(
- DisplayHook<decltype(&HwcDisplay::CreateLayer),
- &HwcDisplay::CreateLayer, hwc2_layer_t *>);
+ return (hwc2_function_pointer_t)CreateLayer;
case HWC2::FunctionDescriptor::DestroyLayer:
- return ToHook<HWC2_PFN_DESTROY_LAYER>(
- DisplayHook<decltype(&HwcDisplay::DestroyLayer),
- &HwcDisplay::DestroyLayer, hwc2_layer_t>);
+ return (hwc2_function_pointer_t)DestroyLayer;
case HWC2::FunctionDescriptor::GetActiveConfig:
return ToHook<HWC2_PFN_GET_ACTIVE_CONFIG>(
DisplayHook<decltype(&HwcDisplay::GetActiveConfig),