Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03cfce8f authored by Dominik Laskowski's avatar Dominik Laskowski
Browse files

SF: Clean up dumpsys for Scheduler

Split dump into three flags corresponding to Scheduler, EventThread, and
VsyncReactor. Expand utils::Dumper to automate more types.

Bug: 241285191
Test: dumpsys SurfaceFlinger --scheduler
Test: dumpsys SurfaceFlinger --events
Test: dumpsys SurfaceFlinger --vsync
Change-Id: I17b3b772cd164305e2fe0239638b1a08236c12a2
parent 5d7de5f8
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -178,7 +178,8 @@ inline std::string to_string(hardware::graphics::composer::hal::Error error) {
}
}


// For utils::Dumper ADL.
// For utils::Dumper ADL.
namespace hardware::graphics::composer::V2_2 {
namespace hardware::graphics::composer {
namespace V2_2 {


inline std::string to_string(hardware::graphics::composer::hal::PowerMode mode) {
inline std::string to_string(hardware::graphics::composer::hal::PowerMode mode) {
    switch (mode) {
    switch (mode) {
@@ -197,7 +198,9 @@ inline std::string to_string(hardware::graphics::composer::hal::PowerMode mode)
    }
    }
}
}


} // namespace hardware::graphics::composer::V2_2
} // namespace V2_2

namespace V2_1 {


inline std::string to_string(hardware::graphics::composer::hal::Vsync vsync) {
inline std::string to_string(hardware::graphics::composer::hal::Vsync vsync) {
    switch (vsync) {
    switch (vsync) {
@@ -210,4 +213,6 @@ inline std::string to_string(hardware::graphics::composer::hal::Vsync vsync) {
    }
    }
}
}


} // namespace V2_1
} // namespace hardware::graphics::composer
} // namespace android
} // namespace android
+1 −0
Original line number Original line Diff line number Diff line
@@ -668,6 +668,7 @@ void EventThread::dump(std::string& result) const {
            StringAppendF(&result, "    %s\n", toString(*connection).c_str());
            StringAppendF(&result, "    %s\n", toString(*connection).c_str());
        }
        }
    }
    }
    result += '\n';
}
}


const char* EventThread::toCString(State state) {
const char* EventThread::toCString(State state) {
+24 −19
Original line number Original line Diff line number Diff line
@@ -54,10 +54,9 @@ std::optional<Fps> FrameRateOverrideMappings::getFrameRateOverrideForUid(
std::vector<FrameRateOverride> FrameRateOverrideMappings::getAllFrameRateOverrides(
std::vector<FrameRateOverride> FrameRateOverrideMappings::getAllFrameRateOverrides(
        bool supportsFrameRateOverrideByContent) {
        bool supportsFrameRateOverrideByContent) {
    std::lock_guard lock(mFrameRateOverridesLock);
    std::lock_guard lock(mFrameRateOverridesLock);

    std::vector<FrameRateOverride> overrides;
    std::vector<FrameRateOverride> overrides;
    overrides.reserve(std::max({mFrameRateOverridesFromGameManager.size(),
    overrides.reserve(maxOverridesCount());
                                mFrameRateOverridesFromBackdoor.size(),
                                mFrameRateOverridesByContent.size()}));


    for (const auto& [uid, frameRate] : mFrameRateOverridesFromBackdoor) {
    for (const auto& [uid, frameRate] : mFrameRateOverridesFromBackdoor) {
        overrides.emplace_back(FrameRateOverride{uid, frameRate.getValue()});
        overrides.emplace_back(FrameRateOverride{uid, frameRate.getValue()});
@@ -83,28 +82,34 @@ std::vector<FrameRateOverride> FrameRateOverrideMappings::getAllFrameRateOverrid
    return overrides;
    return overrides;
}
}


void FrameRateOverrideMappings::dump(std::string& result) const {
void FrameRateOverrideMappings::dump(utils::Dumper& dumper) const {
    using base::StringAppendF;
    using namespace std::string_view_literals;


    std::lock_guard lock(mFrameRateOverridesLock);
    std::lock_guard lock(mFrameRateOverridesLock);


    StringAppendF(&result, "Frame Rate Overrides (backdoor): {");
    const bool hasOverrides = maxOverridesCount() > 0;
    for (const auto& [uid, frameRate] : mFrameRateOverridesFromBackdoor) {
    dumper.dump("FrameRateOverrides"sv, hasOverrides ? ""sv : "none"sv);
        StringAppendF(&result, "[uid: %d frameRate: %s], ", uid, to_string(frameRate).c_str());
    }
    StringAppendF(&result, "}\n");


    StringAppendF(&result, "Frame Rate Overrides (GameManager): {");
    if (!hasOverrides) return;
    for (const auto& [uid, frameRate] : mFrameRateOverridesFromGameManager) {

        StringAppendF(&result, "[uid: %d frameRate: %s], ", uid, to_string(frameRate).c_str());
    dump(dumper, "setFrameRate"sv, mFrameRateOverridesByContent);
    dump(dumper, "GameManager"sv, mFrameRateOverridesFromGameManager);
    dump(dumper, "Backdoor"sv, mFrameRateOverridesFromBackdoor);
}
}
    StringAppendF(&result, "}\n");


    StringAppendF(&result, "Frame Rate Overrides (setFrameRate): {");
void FrameRateOverrideMappings::dump(utils::Dumper& dumper, std::string_view name,
    for (const auto& [uid, frameRate] : mFrameRateOverridesByContent) {
                                     const UidToFrameRateOverride& overrides) const {
        StringAppendF(&result, "[uid: %d frameRate: %s], ", uid, to_string(frameRate).c_str());
    if (overrides.empty()) return;

    utils::Dumper::Indent indent(dumper);
    dumper.dump(name);
    {
        utils::Dumper::Indent indent(dumper);
        for (const auto& [uid, frameRate] : overrides) {
            using namespace std::string_view_literals;
            dumper.dump("(uid, frameRate)"sv, uid, frameRate);
        }
    }
    }
    StringAppendF(&result, "}\n");
}
}


bool FrameRateOverrideMappings::updateFrameRateOverridesByContent(
bool FrameRateOverrideMappings::updateFrameRateOverridesByContent(
+14 −1
Original line number Original line Diff line number Diff line
@@ -23,7 +23,10 @@
#include <map>
#include <map>
#include <optional>
#include <optional>


#include "Utils/Dumper.h"

namespace android::scheduler {
namespace android::scheduler {

class FrameRateOverrideMappings {
class FrameRateOverrideMappings {
    using FrameRateOverride = DisplayEventReceiver::Event::FrameRateOverride;
    using FrameRateOverride = DisplayEventReceiver::Event::FrameRateOverride;
    using UidToFrameRateOverride = std::map<uid_t, Fps>;
    using UidToFrameRateOverride = std::map<uid_t, Fps>;
@@ -34,7 +37,6 @@ public:
            EXCLUDES(mFrameRateOverridesLock);
            EXCLUDES(mFrameRateOverridesLock);
    std::vector<FrameRateOverride> getAllFrameRateOverrides(bool supportsFrameRateOverrideByContent)
    std::vector<FrameRateOverride> getAllFrameRateOverrides(bool supportsFrameRateOverrideByContent)
            EXCLUDES(mFrameRateOverridesLock);
            EXCLUDES(mFrameRateOverridesLock);
    void dump(std::string& result) const;
    bool updateFrameRateOverridesByContent(const UidToFrameRateOverride& frameRateOverrides)
    bool updateFrameRateOverridesByContent(const UidToFrameRateOverride& frameRateOverrides)
            EXCLUDES(mFrameRateOverridesLock);
            EXCLUDES(mFrameRateOverridesLock);
    void setGameModeRefreshRateForUid(FrameRateOverride frameRateOverride)
    void setGameModeRefreshRateForUid(FrameRateOverride frameRateOverride)
@@ -42,7 +44,17 @@ public:
    void setPreferredRefreshRateForUid(FrameRateOverride frameRateOverride)
    void setPreferredRefreshRateForUid(FrameRateOverride frameRateOverride)
            EXCLUDES(mFrameRateOverridesLock);
            EXCLUDES(mFrameRateOverridesLock);


    void dump(utils::Dumper&) const;

private:
private:
    size_t maxOverridesCount() const REQUIRES(mFrameRateOverridesLock) {
        return std::max({mFrameRateOverridesByContent.size(),
                         mFrameRateOverridesFromGameManager.size(),
                         mFrameRateOverridesFromBackdoor.size()});
    }

    void dump(utils::Dumper&, std::string_view name, const UidToFrameRateOverride&) const;

    // The frame rate override lists need their own mutex as they are being read
    // The frame rate override lists need their own mutex as they are being read
    // by SurfaceFlinger, Scheduler and EventThread (as a callback) to prevent deadlocks
    // by SurfaceFlinger, Scheduler and EventThread (as a callback) to prevent deadlocks
    mutable std::mutex mFrameRateOverridesLock;
    mutable std::mutex mFrameRateOverridesLock;
@@ -53,4 +65,5 @@ private:
    UidToFrameRateOverride mFrameRateOverridesFromBackdoor GUARDED_BY(mFrameRateOverridesLock);
    UidToFrameRateOverride mFrameRateOverridesFromBackdoor GUARDED_BY(mFrameRateOverridesLock);
    UidToFrameRateOverride mFrameRateOverridesFromGameManager GUARDED_BY(mFrameRateOverridesLock);
    UidToFrameRateOverride mFrameRateOverridesFromGameManager GUARDED_BY(mFrameRateOverridesLock);
};
};

} // namespace android::scheduler
} // namespace android::scheduler
+1 −1
Original line number Original line Diff line number Diff line
@@ -275,7 +275,7 @@ void LayerHistory::clear() {


std::string LayerHistory::dump() const {
std::string LayerHistory::dump() const {
    std::lock_guard lock(mLock);
    std::lock_guard lock(mLock);
    return base::StringPrintf("LayerHistory{size=%zu, active=%zu}",
    return base::StringPrintf("{size=%zu, active=%zu}",
                              mActiveLayerInfos.size() + mInactiveLayerInfos.size(),
                              mActiveLayerInfos.size() + mInactiveLayerInfos.size(),
                              mActiveLayerInfos.size());
                              mActiveLayerInfos.size());
}
}
Loading