From 32414eea3e5aa55fb251255ecf84b0e54858624f Mon Sep 17 00:00:00 2001 From: John Reck Date: Wed, 31 May 2017 14:02:50 -0700 Subject: Fix dequeus outside of frame drawing Bug: 62213889 Test: Repro steps in bug Change-Id: I8fc407b280ba82c669fc2bb03750cab139adb965 --- libs/hwui/renderthread/CanvasContext.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'libs/hwui/renderthread') diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 02a9ffa3039c..cbc5163244c1 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -436,8 +436,15 @@ void CanvasContext::draw() { swap.vsyncTime = mRenderThread.timeLord().latestVsync(); if (mNativeSurface.get()) { int durationUs; - mNativeSurface->query(NATIVE_WINDOW_LAST_DEQUEUE_DURATION, &durationUs); - swap.dequeueDuration = us2ns(durationUs); + nsecs_t dequeueStart = mNativeSurface->getLastDequeueStartTime(); + if (dequeueStart < mCurrentFrameInfo->get(FrameInfoIndex::Vsync)) { + // Ignoring dequeue duration as it happened prior to vsync + // and thus is not part of the frame. + swap.dequeueDuration = 0; + } else { + mNativeSurface->query(NATIVE_WINDOW_LAST_DEQUEUE_DURATION, &durationUs); + swap.dequeueDuration = us2ns(durationUs); + } mNativeSurface->query(NATIVE_WINDOW_LAST_QUEUE_DURATION, &durationUs); swap.queueDuration = us2ns(durationUs); } else { -- cgit v1.2.3-59-g8ed1b