vsyncId should always be incremental

In some conditions of scheduling delays, Choreographer may
synthetically advance the indented vsync time. In that case we can't
send a vsync id since there is no one that corresponds to that time.

Test: TBD
Bug: 191840734
Change-Id: I7b2754d5dcb0a3f5fd6cda00a3a2469041116f67
This commit is contained in:
Ady Abraham
2021-06-23 15:03:48 -07:00
parent 343684b523
commit 505e730e7d

View File

@@ -15,22 +15,28 @@
*/
#include "TimeLord.h"
#include <limits>
#include "FrameInfo.h"
namespace android {
namespace uirenderer {
namespace renderthread {
TimeLord::TimeLord() : mFrameIntervalNanos(milliseconds_to_nanoseconds(16)),
mFrameTimeNanos(0),
mFrameIntendedTimeNanos(0),
mFrameVsyncId(-1),
mFrameDeadline(std::numeric_limits<int64_t>::max()){}
TimeLord::TimeLord()
: mFrameIntervalNanos(milliseconds_to_nanoseconds(16))
, mFrameTimeNanos(0)
, mFrameIntendedTimeNanos(0)
, mFrameVsyncId(UiFrameInfoBuilder::INVALID_VSYNC_ID)
, mFrameDeadline(std::numeric_limits<int64_t>::max()) {}
bool TimeLord::vsyncReceived(nsecs_t vsync, nsecs_t intendedVsync, int64_t vsyncId,
int64_t frameDeadline, nsecs_t frameInterval) {
if (intendedVsync > mFrameIntendedTimeNanos) {
mFrameIntendedTimeNanos = intendedVsync;
mFrameVsyncId = vsyncId;
// The intendedVsync might have been advanced to account for scheduling
// jitter. Since we don't have a way to advance the vsync id we just
// reset it.
mFrameVsyncId = (vsyncId > mFrameVsyncId) ? vsyncId : UiFrameInfoBuilder::INVALID_VSYNC_ID;
mFrameDeadline = frameDeadline;
if (frameInterval > 0) {
mFrameIntervalNanos = frameInterval;