Loading libs/gui/include/gui/JankInfo.h +0 −1 Original line number Original line Diff line number Diff line Loading @@ -19,7 +19,6 @@ namespace android { namespace android { // Jank information tracked by SurfaceFlinger(SF) for perfetto tracing and telemetry. // Jank information tracked by SurfaceFlinger(SF) for perfetto tracing and telemetry. // TODO(b/175843808): Change JankType from enum to enum class enum JankType { enum JankType { // No Jank // No Jank None = 0x0, None = 0x0, Loading services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +54 −22 Original line number Original line Diff line number Diff line Loading @@ -95,35 +95,46 @@ std::string toString(PredictionState predictionState) { } } std::string jankTypeBitmaskToString(int32_t jankType) { 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) { if (jankType == JankType::None) { return "None"; return "None"; } } std::vector<std::string> janks; if (jankType & JankType::DisplayHAL) { if (jankType & JankType::DisplayHAL) { janks.emplace_back("Display HAL"); janks.emplace_back("Display HAL"); jankType &= ~JankType::DisplayHAL; } } if (jankType & JankType::SurfaceFlingerCpuDeadlineMissed) { if (jankType & JankType::SurfaceFlingerCpuDeadlineMissed) { janks.emplace_back("SurfaceFlinger CPU Deadline Missed"); janks.emplace_back("SurfaceFlinger CPU Deadline Missed"); jankType &= ~JankType::SurfaceFlingerCpuDeadlineMissed; } } if (jankType & JankType::SurfaceFlingerGpuDeadlineMissed) { if (jankType & JankType::SurfaceFlingerGpuDeadlineMissed) { janks.emplace_back("SurfaceFlinger GPU Deadline Missed"); janks.emplace_back("SurfaceFlinger GPU Deadline Missed"); jankType &= ~JankType::SurfaceFlingerGpuDeadlineMissed; } } if (jankType & JankType::AppDeadlineMissed) { if (jankType & JankType::AppDeadlineMissed) { janks.emplace_back("App Deadline Missed"); janks.emplace_back("App Deadline Missed"); jankType &= ~JankType::AppDeadlineMissed; } } if (jankType & JankType::PredictionError) { if (jankType & JankType::PredictionError) { janks.emplace_back("Prediction Error"); janks.emplace_back("Prediction Error"); jankType &= ~JankType::PredictionError; } } if (jankType & JankType::SurfaceFlingerScheduling) { if (jankType & JankType::SurfaceFlingerScheduling) { janks.emplace_back("SurfaceFlinger Scheduling"); janks.emplace_back("SurfaceFlinger Scheduling"); jankType &= ~JankType::SurfaceFlingerScheduling; } } if (jankType & JankType::BufferStuffing) { if (jankType & JankType::BufferStuffing) { janks.emplace_back("Buffer Stuffing"); janks.emplace_back("Buffer Stuffing"); jankType &= ~JankType::BufferStuffing; } } if (jankType & JankType::Unknown) { if (jankType & JankType::Unknown) { janks.emplace_back("Unknown jank"); 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(), return std::accumulate(janks.begin(), janks.end(), std::string(), [](const std::string& l, const std::string& r) { [](const std::string& l, const std::string& r) { return l.empty() ? r : l + ", " + r; return l.empty() ? r : l + ", " + r; Loading Loading @@ -192,27 +203,48 @@ FrameTimelineEvent::PresentType toProto(FramePresentMetadata presentMetadata) { } } } } FrameTimelineEvent::JankType jankTypeBitmaskToProto(int32_t jankType) { int32_t jankTypeBitmaskToProto(int32_t jankType) { // TODO(b/175843808): Either make the proto a bitmask or jankType an enum class if (jankType == JankType::None) { switch (jankType) { case JankType::None: return FrameTimelineEvent::JANK_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. // Returns the smallest timestamp from the set of predictions and actuals. Loading Loading
libs/gui/include/gui/JankInfo.h +0 −1 Original line number Original line Diff line number Diff line Loading @@ -19,7 +19,6 @@ namespace android { namespace android { // Jank information tracked by SurfaceFlinger(SF) for perfetto tracing and telemetry. // Jank information tracked by SurfaceFlinger(SF) for perfetto tracing and telemetry. // TODO(b/175843808): Change JankType from enum to enum class enum JankType { enum JankType { // No Jank // No Jank None = 0x0, None = 0x0, Loading
services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +54 −22 Original line number Original line Diff line number Diff line Loading @@ -95,35 +95,46 @@ std::string toString(PredictionState predictionState) { } } std::string jankTypeBitmaskToString(int32_t jankType) { 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) { if (jankType == JankType::None) { return "None"; return "None"; } } std::vector<std::string> janks; if (jankType & JankType::DisplayHAL) { if (jankType & JankType::DisplayHAL) { janks.emplace_back("Display HAL"); janks.emplace_back("Display HAL"); jankType &= ~JankType::DisplayHAL; } } if (jankType & JankType::SurfaceFlingerCpuDeadlineMissed) { if (jankType & JankType::SurfaceFlingerCpuDeadlineMissed) { janks.emplace_back("SurfaceFlinger CPU Deadline Missed"); janks.emplace_back("SurfaceFlinger CPU Deadline Missed"); jankType &= ~JankType::SurfaceFlingerCpuDeadlineMissed; } } if (jankType & JankType::SurfaceFlingerGpuDeadlineMissed) { if (jankType & JankType::SurfaceFlingerGpuDeadlineMissed) { janks.emplace_back("SurfaceFlinger GPU Deadline Missed"); janks.emplace_back("SurfaceFlinger GPU Deadline Missed"); jankType &= ~JankType::SurfaceFlingerGpuDeadlineMissed; } } if (jankType & JankType::AppDeadlineMissed) { if (jankType & JankType::AppDeadlineMissed) { janks.emplace_back("App Deadline Missed"); janks.emplace_back("App Deadline Missed"); jankType &= ~JankType::AppDeadlineMissed; } } if (jankType & JankType::PredictionError) { if (jankType & JankType::PredictionError) { janks.emplace_back("Prediction Error"); janks.emplace_back("Prediction Error"); jankType &= ~JankType::PredictionError; } } if (jankType & JankType::SurfaceFlingerScheduling) { if (jankType & JankType::SurfaceFlingerScheduling) { janks.emplace_back("SurfaceFlinger Scheduling"); janks.emplace_back("SurfaceFlinger Scheduling"); jankType &= ~JankType::SurfaceFlingerScheduling; } } if (jankType & JankType::BufferStuffing) { if (jankType & JankType::BufferStuffing) { janks.emplace_back("Buffer Stuffing"); janks.emplace_back("Buffer Stuffing"); jankType &= ~JankType::BufferStuffing; } } if (jankType & JankType::Unknown) { if (jankType & JankType::Unknown) { janks.emplace_back("Unknown jank"); 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(), return std::accumulate(janks.begin(), janks.end(), std::string(), [](const std::string& l, const std::string& r) { [](const std::string& l, const std::string& r) { return l.empty() ? r : l + ", " + r; return l.empty() ? r : l + ", " + r; Loading Loading @@ -192,27 +203,48 @@ FrameTimelineEvent::PresentType toProto(FramePresentMetadata presentMetadata) { } } } } FrameTimelineEvent::JankType jankTypeBitmaskToProto(int32_t jankType) { int32_t jankTypeBitmaskToProto(int32_t jankType) { // TODO(b/175843808): Either make the proto a bitmask or jankType an enum class if (jankType == JankType::None) { switch (jankType) { case JankType::None: return FrameTimelineEvent::JANK_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. // Returns the smallest timestamp from the set of predictions and actuals. Loading