Fix dequeus outside of frame drawing

Bug: 62213889
Test: Repro steps in bug
Change-Id: I8fc407b280ba82c669fc2bb03750cab139adb965
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 02a9ffa..cbc5163 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -436,8 +436,15 @@
         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 {