Merge "Recompute the mNextFrameStartUnstuffed on every frame" into tm-qpr-dev

This commit is contained in:
Dake Gu
2022-06-07 19:41:45 +00:00
committed by Android (Google) Code Review

View File

@@ -206,6 +206,7 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo
frame.set(FrameInfoIndex::FrameDeadline) = deadline; frame.set(FrameInfoIndex::FrameDeadline) = deadline;
} }
bool computeNextFrameStartUnstuffed = false;
// If we hit the deadline, cool! // If we hit the deadline, cool!
if (frame[FrameInfoIndex::GpuCompleted] < deadline) { if (frame[FrameInfoIndex::GpuCompleted] < deadline) {
if (isTripleBuffered) { if (isTripleBuffered) {
@@ -213,7 +214,8 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo
(*mGlobalData)->reportJankType(JankType::kHighInputLatency); (*mGlobalData)->reportJankType(JankType::kHighInputLatency);
// Buffer stuffing state gets carried over to next frame, unless there is a "pause" // Buffer stuffing state gets carried over to next frame, unless there is a "pause"
mNextFrameStartUnstuffed += frameInterval; // Instead of increase by frameInterval, recompute to catch up the drifting vsync
computeNextFrameStartUnstuffed = true;
} }
} else { } else {
mData->reportJankType(JankType::kMissedDeadline); mData->reportJankType(JankType::kMissedDeadline);
@@ -222,14 +224,7 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo
(*mGlobalData)->reportJank(); (*mGlobalData)->reportJank();
// Janked, store the adjust deadline to detect triple buffering in next frame correctly. // Janked, store the adjust deadline to detect triple buffering in next frame correctly.
nsecs_t jitterNanos = frame[FrameInfoIndex::GpuCompleted] computeNextFrameStartUnstuffed = true;
- frame[FrameInfoIndex::Vsync];
nsecs_t lastFrameOffset = jitterNanos % frameInterval;
// Note the time when the next frame would start in an unstuffed situation. If it starts
// earlier, we are in a stuffed situation.
mNextFrameStartUnstuffed = frame[FrameInfoIndex::GpuCompleted]
- lastFrameOffset + frameInterval;
recomputeThresholds(frameInterval); recomputeThresholds(frameInterval);
for (auto& comparison : COMPARISONS) { for (auto& comparison : COMPARISONS) {
@@ -254,6 +249,16 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo
} }
} }
if (computeNextFrameStartUnstuffed) {
nsecs_t jitterNanos = frame[FrameInfoIndex::GpuCompleted] - frame[FrameInfoIndex::Vsync];
nsecs_t lastFrameOffset = jitterNanos % frameInterval;
// Note the time when the next frame would start in an unstuffed situation. If it starts
// earlier, we are in a stuffed situation.
mNextFrameStartUnstuffed =
frame[FrameInfoIndex::GpuCompleted] - lastFrameOffset + frameInterval;
}
int64_t totalGPUDrawTime = frame.gpuDrawTime(); int64_t totalGPUDrawTime = frame.gpuDrawTime();
if (totalGPUDrawTime >= 0) { if (totalGPUDrawTime >= 0) {
mData->reportGPUFrame(totalGPUDrawTime); mData->reportGPUFrame(totalGPUDrawTime);