Loading cmds/dumpstate/dumpstate.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -1243,7 +1243,7 @@ static void DumpPacketStats() { static void DumpIpAddrAndRules() { /* The following have a tendency to get wedged when wifi drivers/fw goes belly-up. */ RunCommand("NETWORK INTERFACES", {"ip", "link"}); RunCommand("NETWORK INTERFACES", {"ip", "-s", "link"}); RunCommand("IPv4 ADDRESSES", {"ip", "-4", "addr", "show"}); RunCommand("IPv6 ADDRESSES", {"ip", "-6", "addr", "show"}); RunCommand("IP RULES", {"ip", "rule", "show"}); Loading cmds/evemu-record/main.rs +29 −9 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ use std::io; use std::io::{BufRead, Write}; use std::path::PathBuf; use clap::Parser; use clap::{Parser, ValueEnum}; use nix::sys::time::TimeVal; mod evdev; Loading @@ -39,6 +39,19 @@ struct Args { device: Option<PathBuf>, /// The file to save the recording to. Defaults to standard output. output_file: Option<PathBuf>, /// The base time that timestamps should be relative to (Android-specific extension) #[arg(long, value_enum, default_value_t = TimestampBase::FirstEvent)] timestamp_base: TimestampBase, } #[derive(Clone, Debug, ValueEnum)] enum TimestampBase { /// The first event received from the device. FirstEvent, /// The time when the system booted. Boot, } fn get_choice(max: u32) -> u32 { Loading Loading @@ -149,7 +162,11 @@ fn print_device_description( Ok(()) } fn print_events(device: &evdev::Device, output: &mut impl Write) -> Result<(), Box<dyn Error>> { fn print_events( device: &evdev::Device, output: &mut impl Write, timestamp_base: TimestampBase, ) -> Result<(), Box<dyn Error>> { fn print_event(output: &mut impl Write, event: &evdev::InputEvent) -> Result<(), io::Error> { // TODO(b/302297266): Translate events into human-readable names and add those as comments. writeln!( Loading @@ -164,12 +181,15 @@ fn print_events(device: &evdev::Device, output: &mut impl Write) -> Result<(), B Ok(()) } let event = device.read_event()?; // Due to a bug in the C implementation of evemu-play [0] that has since become part of the API, // the timestamp of the first event in a recording shouldn't be exactly 0.0 seconds, so offset // it by 1µs. let start_time = match timestamp_base { // Due to a bug in the C implementation of evemu-play [0] that has since become part of the // API, the timestamp of the first event in a recording shouldn't be exactly 0.0 seconds, // so offset it by 1µs. // // [0]: https://gitlab.freedesktop.org/libevdev/evemu/-/commit/eba96a4d2be7260b5843e65c4b99c8b06a1f4c9d let start_time = event.time - TimeVal::new(0, 1); TimestampBase::FirstEvent => event.time - TimeVal::new(0, 1), TimestampBase::Boot => TimeVal::new(0, 0), }; print_event(output, &event.offset_time_by(start_time))?; loop { let event = device.read_event()?; Loading @@ -188,6 +208,6 @@ fn main() -> Result<(), Box<dyn Error>> { None => Box::new(io::stdout().lock()), }; print_device_description(&device, &mut output)?; print_events(&device, &mut output)?; print_events(&device, &mut output, args.timestamp_base)?; Ok(()) } services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ using AidlDisplayConnectionType = using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform; using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace; using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent; using AidlFRect = aidl::android::hardware::graphics::common::FRect; using AidlRect = aidl::android::hardware::graphics::common::Rect; using AidlTransform = aidl::android::hardware::graphics::common::Transform; Loading Loading @@ -174,9 +175,9 @@ public: AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {} ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override { const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED : V2_4::IComposerCallback::Connection::DISCONNECTED; mCallback.onComposerHalHotplug(translate<Display>(in_display), connection); const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED : AidlDisplayHotplugEvent::DISCONNECTED; mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event); return ::ndk::ScopedAStatus::ok(); } Loading Loading @@ -216,6 +217,12 @@ public: return ::ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display, AidlDisplayHotplugEvent event) override { mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event); return ::ndk::ScopedAStatus::ok(); } private: HWC2::ComposerCallback& mCallback; }; Loading services/surfaceflinger/DisplayHardware/HWC2.h +5 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include "Hal.h" #include <aidl/android/hardware/graphics/common/DisplayDecorationSupport.h> #include <aidl/android/hardware/graphics/common/DisplayHotplugEvent.h> #include <aidl/android/hardware/graphics/composer3/Capability.h> #include <aidl/android/hardware/graphics/composer3/ClientTargetPropertyWithBrightness.h> #include <aidl/android/hardware/graphics/composer3/Color.h> Loading @@ -64,15 +65,16 @@ class Layer; namespace hal = android::hardware::graphics::composer::hal; using aidl::android::hardware::graphics::common::DisplayHotplugEvent; using aidl::android::hardware::graphics::composer3::RefreshRateChangedDebugData; // Implement this interface to receive hardware composer events. // // These callback functions will generally be called on a hwbinder thread, but // when first registering the callback the onComposerHalHotplug() function will // immediately be called on the thread calling registerCallback(). // when first registering the callback the onComposerHalHotplugEvent() function // will immediately be called on the thread calling registerCallback(). struct ComposerCallback { virtual void onComposerHalHotplug(hal::HWDisplayId, hal::Connection) = 0; virtual void onComposerHalHotplugEvent(hal::HWDisplayId, DisplayHotplugEvent) = 0; virtual void onComposerHalRefresh(hal::HWDisplayId) = 0; virtual void onComposerHalVsync(hal::HWDisplayId, nsecs_t timestamp, std::optional<hal::VsyncPeriodNanos>) = 0; Loading services/surfaceflinger/DisplayHardware/Hal.h +2 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <android/hardware/graphics/composer/2.4/IComposer.h> #include <android/hardware/graphics/composer/2.4/IComposerClient.h> #include <aidl/android/hardware/graphics/common/DisplayHotplugEvent.h> #include <aidl/android/hardware/graphics/common/Hdr.h> #include <aidl/android/hardware/graphics/composer3/Composition.h> #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h> Loading Loading @@ -58,6 +59,7 @@ using Connection = IComposerCallback::Connection; using ContentType = IComposerClient::ContentType; using Capability = IComposer::Capability; using ClientTargetProperty = IComposerClient::ClientTargetProperty; using DisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent; using DisplayRequest = IComposerClient::DisplayRequest; using DisplayType = IComposerClient::DisplayType; using HWConfigId = V2_1::Config; Loading Loading
cmds/dumpstate/dumpstate.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -1243,7 +1243,7 @@ static void DumpPacketStats() { static void DumpIpAddrAndRules() { /* The following have a tendency to get wedged when wifi drivers/fw goes belly-up. */ RunCommand("NETWORK INTERFACES", {"ip", "link"}); RunCommand("NETWORK INTERFACES", {"ip", "-s", "link"}); RunCommand("IPv4 ADDRESSES", {"ip", "-4", "addr", "show"}); RunCommand("IPv6 ADDRESSES", {"ip", "-6", "addr", "show"}); RunCommand("IP RULES", {"ip", "rule", "show"}); Loading
cmds/evemu-record/main.rs +29 −9 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ use std::io; use std::io::{BufRead, Write}; use std::path::PathBuf; use clap::Parser; use clap::{Parser, ValueEnum}; use nix::sys::time::TimeVal; mod evdev; Loading @@ -39,6 +39,19 @@ struct Args { device: Option<PathBuf>, /// The file to save the recording to. Defaults to standard output. output_file: Option<PathBuf>, /// The base time that timestamps should be relative to (Android-specific extension) #[arg(long, value_enum, default_value_t = TimestampBase::FirstEvent)] timestamp_base: TimestampBase, } #[derive(Clone, Debug, ValueEnum)] enum TimestampBase { /// The first event received from the device. FirstEvent, /// The time when the system booted. Boot, } fn get_choice(max: u32) -> u32 { Loading Loading @@ -149,7 +162,11 @@ fn print_device_description( Ok(()) } fn print_events(device: &evdev::Device, output: &mut impl Write) -> Result<(), Box<dyn Error>> { fn print_events( device: &evdev::Device, output: &mut impl Write, timestamp_base: TimestampBase, ) -> Result<(), Box<dyn Error>> { fn print_event(output: &mut impl Write, event: &evdev::InputEvent) -> Result<(), io::Error> { // TODO(b/302297266): Translate events into human-readable names and add those as comments. writeln!( Loading @@ -164,12 +181,15 @@ fn print_events(device: &evdev::Device, output: &mut impl Write) -> Result<(), B Ok(()) } let event = device.read_event()?; // Due to a bug in the C implementation of evemu-play [0] that has since become part of the API, // the timestamp of the first event in a recording shouldn't be exactly 0.0 seconds, so offset // it by 1µs. let start_time = match timestamp_base { // Due to a bug in the C implementation of evemu-play [0] that has since become part of the // API, the timestamp of the first event in a recording shouldn't be exactly 0.0 seconds, // so offset it by 1µs. // // [0]: https://gitlab.freedesktop.org/libevdev/evemu/-/commit/eba96a4d2be7260b5843e65c4b99c8b06a1f4c9d let start_time = event.time - TimeVal::new(0, 1); TimestampBase::FirstEvent => event.time - TimeVal::new(0, 1), TimestampBase::Boot => TimeVal::new(0, 0), }; print_event(output, &event.offset_time_by(start_time))?; loop { let event = device.read_event()?; Loading @@ -188,6 +208,6 @@ fn main() -> Result<(), Box<dyn Error>> { None => Box::new(io::stdout().lock()), }; print_device_description(&device, &mut output)?; print_events(&device, &mut output)?; print_events(&device, &mut output, args.timestamp_base)?; Ok(()) }
services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ using AidlDisplayConnectionType = using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform; using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace; using AidlDisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent; using AidlFRect = aidl::android::hardware::graphics::common::FRect; using AidlRect = aidl::android::hardware::graphics::common::Rect; using AidlTransform = aidl::android::hardware::graphics::common::Transform; Loading Loading @@ -174,9 +175,9 @@ public: AidlIComposerCallbackWrapper(HWC2::ComposerCallback& callback) : mCallback(callback) {} ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override { const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED : V2_4::IComposerCallback::Connection::DISCONNECTED; mCallback.onComposerHalHotplug(translate<Display>(in_display), connection); const auto event = in_connected ? AidlDisplayHotplugEvent::CONNECTED : AidlDisplayHotplugEvent::DISCONNECTED; mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event); return ::ndk::ScopedAStatus::ok(); } Loading Loading @@ -216,6 +217,12 @@ public: return ::ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus onHotplugEvent(int64_t in_display, AidlDisplayHotplugEvent event) override { mCallback.onComposerHalHotplugEvent(translate<Display>(in_display), event); return ::ndk::ScopedAStatus::ok(); } private: HWC2::ComposerCallback& mCallback; }; Loading
services/surfaceflinger/DisplayHardware/HWC2.h +5 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include "Hal.h" #include <aidl/android/hardware/graphics/common/DisplayDecorationSupport.h> #include <aidl/android/hardware/graphics/common/DisplayHotplugEvent.h> #include <aidl/android/hardware/graphics/composer3/Capability.h> #include <aidl/android/hardware/graphics/composer3/ClientTargetPropertyWithBrightness.h> #include <aidl/android/hardware/graphics/composer3/Color.h> Loading @@ -64,15 +65,16 @@ class Layer; namespace hal = android::hardware::graphics::composer::hal; using aidl::android::hardware::graphics::common::DisplayHotplugEvent; using aidl::android::hardware::graphics::composer3::RefreshRateChangedDebugData; // Implement this interface to receive hardware composer events. // // These callback functions will generally be called on a hwbinder thread, but // when first registering the callback the onComposerHalHotplug() function will // immediately be called on the thread calling registerCallback(). // when first registering the callback the onComposerHalHotplugEvent() function // will immediately be called on the thread calling registerCallback(). struct ComposerCallback { virtual void onComposerHalHotplug(hal::HWDisplayId, hal::Connection) = 0; virtual void onComposerHalHotplugEvent(hal::HWDisplayId, DisplayHotplugEvent) = 0; virtual void onComposerHalRefresh(hal::HWDisplayId) = 0; virtual void onComposerHalVsync(hal::HWDisplayId, nsecs_t timestamp, std::optional<hal::VsyncPeriodNanos>) = 0; Loading
services/surfaceflinger/DisplayHardware/Hal.h +2 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <android/hardware/graphics/composer/2.4/IComposer.h> #include <android/hardware/graphics/composer/2.4/IComposerClient.h> #include <aidl/android/hardware/graphics/common/DisplayHotplugEvent.h> #include <aidl/android/hardware/graphics/common/Hdr.h> #include <aidl/android/hardware/graphics/composer3/Composition.h> #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h> Loading Loading @@ -58,6 +59,7 @@ using Connection = IComposerCallback::Connection; using ContentType = IComposerClient::ContentType; using Capability = IComposer::Capability; using ClientTargetProperty = IComposerClient::ClientTargetProperty; using DisplayHotplugEvent = aidl::android::hardware::graphics::common::DisplayHotplugEvent; using DisplayRequest = IComposerClient::DisplayRequest; using DisplayType = IComposerClient::DisplayType; using HWConfigId = V2_1::Config; Loading