From 45edae3108aaf251bbc8dce150c8ba53702b2e7f Mon Sep 17 00:00:00 2001 From: MarcZX10 <67475268+MarcZX10@users.noreply.github.com> Date: Thu, 29 Oct 2026 04:14:45 +0000 Subject: [PATCH] feat(agc): read the pad snapshot only while the panel is wanted PadStatusDisplay::Poll asks the provider for a snapshot only when the panel can be shown: in the events mode always, otherwise only while a request keeps it visible. With ANYPS5_PAD_STATUS unset or 0 and no request the provider is not called, so the host builds no snapshot and reads no controller state for it. An unchanged snapshot is not observed again, and a display that stopped being polled observes the next snapshot afresh when a request makes it wanted again. The entry point for the host's pad code is AgcDriverPadStatusPoll_nid_postfix. --- .../Execution/include/PadStatusOverlay.hpp | 4 ++++ .../Execution/src/PadStatusOverlay.cpp | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp index 103ac6e84c..cff0ee7e74 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp @@ -41,6 +41,8 @@ public: bool Observe(Clock::time_point now, const PadStatusSnapshot& snapshot); void Request(Clock::time_point now); bool Visible(Clock::time_point now) const; + bool Wants(Clock::time_point now) const; + bool Poll(Clock::time_point now, const PadStatusProvider& provider); std::vector Lines() const; private: @@ -48,11 +50,13 @@ private: std::optional previous; std::array seen{}; std::optional shownUntil; + std::optional polled; }; } extern "C" void AgcDriverPadStatusObserve_nid_postfix(const AgcDriver::PadStatusSnapshot* snapshot); +extern "C" void AgcDriverPadStatusPoll_nid_postfix(const AgcDriver::PadStatusProvider* provider); extern "C" void AgcDriverPadStatusShow_nid_postfix(); #endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp index ada3b61f49..03169c5475 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace AgcDriver { namespace { @@ -132,6 +133,21 @@ bool PadStatusDisplay::Visible(Clock::time_point now) const { return shownUntil.has_value() && now < *shownUntil; } +bool PadStatusDisplay::Wants(Clock::time_point now) const { + return mode == PadStatusMode::Events || Visible(now); +} + +bool PadStatusDisplay::Poll(Clock::time_point now, const PadStatusProvider& provider) { + if (!Wants(now)) { + polled.reset(); + return false; + } + auto snapshot = provider.read(); + if (!polled.has_value() || *polled != snapshot) Observe(now, snapshot); + polled = std::move(snapshot); + return true; +} + std::vector PadStatusDisplay::Lines() const { std::vector lines; for (std::size_t slot = 0; slot < PadStatusSlots; ++slot) { @@ -166,6 +182,11 @@ extern "C" void AgcDriverPadStatusObserve_nid_postfix(const AgcDriver::PadStatus AgcDriver::display().Observe(AgcDriver::PadStatusDisplay::Clock::now(), *snapshot); } +extern "C" void AgcDriverPadStatusPoll_nid_postfix(const AgcDriver::PadStatusProvider* provider) { + std::lock_guard lock(AgcDriver::displayMutex); + AgcDriver::display().Poll(AgcDriver::PadStatusDisplay::Clock::now(), *provider); +} + extern "C" void AgcDriverPadStatusShow_nid_postfix() { std::lock_guard lock(AgcDriver::displayMutex); AgcDriver::display().Request(AgcDriver::PadStatusDisplay::Clock::now());