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

Commit 060e3e63 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Cleanup and send janktype as a bitmask to perfetto"

parents 7dabbc7c 552e2a72
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@
namespace android {

// Jank information tracked by SurfaceFlinger(SF) for perfetto tracing and telemetry.
// TODO(b/175843808): Change JankType from enum to enum class
enum JankType {
    // No Jank
    None = 0x0,
+54 −22
Original line number Diff line number Diff line
@@ -95,35 +95,46 @@ std::string toString(PredictionState predictionState) {
}

std::string jankTypeBitmaskToString(int32_t jankType) {
    // TODO(b/175843808): Make this a switch case if jankType becomes an enum class
    std::vector<std::string> janks;
    if (jankType == JankType::None) {
        return "None";
    }

    std::vector<std::string> janks;
    if (jankType & JankType::DisplayHAL) {
        janks.emplace_back("Display HAL");
        jankType &= ~JankType::DisplayHAL;
    }
    if (jankType & JankType::SurfaceFlingerCpuDeadlineMissed) {
        janks.emplace_back("SurfaceFlinger CPU Deadline Missed");
        jankType &= ~JankType::SurfaceFlingerCpuDeadlineMissed;
    }
    if (jankType & JankType::SurfaceFlingerGpuDeadlineMissed) {
        janks.emplace_back("SurfaceFlinger GPU Deadline Missed");
        jankType &= ~JankType::SurfaceFlingerGpuDeadlineMissed;
    }
    if (jankType & JankType::AppDeadlineMissed) {
        janks.emplace_back("App Deadline Missed");
        jankType &= ~JankType::AppDeadlineMissed;
    }
    if (jankType & JankType::PredictionError) {
        janks.emplace_back("Prediction Error");
        jankType &= ~JankType::PredictionError;
    }
    if (jankType & JankType::SurfaceFlingerScheduling) {
        janks.emplace_back("SurfaceFlinger Scheduling");
        jankType &= ~JankType::SurfaceFlingerScheduling;
    }
    if (jankType & JankType::BufferStuffing) {
        janks.emplace_back("Buffer Stuffing");
        jankType &= ~JankType::BufferStuffing;
    }
    if (jankType & JankType::Unknown) {
        janks.emplace_back("Unknown jank");
        jankType &= ~JankType::Unknown;
    }

    // jankType should be 0 if all types of jank were checked for.
    LOG_ALWAYS_FATAL_IF(jankType != 0, "Unrecognized jank type value 0x%x", jankType);
    return std::accumulate(janks.begin(), janks.end(), std::string(),
                           [](const std::string& l, const std::string& r) {
                               return l.empty() ? r : l + ", " + r;
@@ -192,27 +203,48 @@ FrameTimelineEvent::PresentType toProto(FramePresentMetadata presentMetadata) {
    }
}

FrameTimelineEvent::JankType jankTypeBitmaskToProto(int32_t jankType) {
    // TODO(b/175843808): Either make the proto a bitmask or jankType an enum class
    switch (jankType) {
        case JankType::None:
int32_t jankTypeBitmaskToProto(int32_t jankType) {
    if (jankType == JankType::None) {
        return FrameTimelineEvent::JANK_NONE;
        case JankType::DisplayHAL:
            return FrameTimelineEvent::JANK_DISPLAY_HAL;
        case JankType::SurfaceFlingerCpuDeadlineMissed:
        case JankType::SurfaceFlingerGpuDeadlineMissed:
            return FrameTimelineEvent::JANK_SF_DEADLINE_MISSED;
        case JankType::AppDeadlineMissed:
        case JankType::PredictionError:
            return FrameTimelineEvent::JANK_APP_DEADLINE_MISSED;
        case JankType::SurfaceFlingerScheduling:
            return FrameTimelineEvent::JANK_SF_SCHEDULING;
        case JankType::BufferStuffing:
            return FrameTimelineEvent::JANK_BUFFER_STUFFING;
        default:
            // TODO(b/175843808): Remove default if JankType becomes an enum class
            return FrameTimelineEvent::JANK_UNKNOWN;
    }

    int32_t protoJank = 0;
    if (jankType & JankType::DisplayHAL) {
        protoJank |= FrameTimelineEvent::JANK_DISPLAY_HAL;
        jankType &= ~JankType::DisplayHAL;
    }
    if (jankType & JankType::SurfaceFlingerCpuDeadlineMissed) {
        protoJank |= FrameTimelineEvent::JANK_SF_CPU_DEADLINE_MISSED;
        jankType &= ~JankType::SurfaceFlingerCpuDeadlineMissed;
    }
    if (jankType & JankType::SurfaceFlingerGpuDeadlineMissed) {
        protoJank |= FrameTimelineEvent::JANK_SF_GPU_DEADLINE_MISSED;
        jankType &= ~JankType::SurfaceFlingerGpuDeadlineMissed;
    }
    if (jankType & JankType::AppDeadlineMissed) {
        protoJank |= FrameTimelineEvent::JANK_APP_DEADLINE_MISSED;
        jankType &= ~JankType::AppDeadlineMissed;
    }
    if (jankType & JankType::PredictionError) {
        protoJank |= FrameTimelineEvent::JANK_PREDICTION_ERROR;
        jankType &= ~JankType::PredictionError;
    }
    if (jankType & JankType::SurfaceFlingerScheduling) {
        protoJank |= FrameTimelineEvent::JANK_SF_SCHEDULING;
        jankType &= ~JankType::SurfaceFlingerScheduling;
    }
    if (jankType & JankType::BufferStuffing) {
        protoJank |= FrameTimelineEvent::JANK_BUFFER_STUFFING;
        jankType &= ~JankType::BufferStuffing;
    }
    if (jankType & JankType::Unknown) {
        protoJank |= FrameTimelineEvent::JANK_UNKNOWN;
        jankType &= ~JankType::Unknown;
    }

    // jankType should be 0 if all types of jank were checked for.
    LOG_ALWAYS_FATAL_IF(jankType != 0, "Unrecognized jank type value 0x%x", jankType);
    return protoJank;
}

// Returns the smallest timestamp from the set of predictions and actuals.