Support SurfaceView synchronization.
Add API for fetching the next frame number to be produced by
a given buffer producer. Add an API to SurfaceComposer to
defer execution of the current transaction until a given frame number.
Together these may be used to synchronize app drawing and surface
control updates.
Change-Id: I8e0f4993332ac0199c768c88581a453fefbaff1d
diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp
index 8ab963d..640a9f2 100644
--- a/libs/gui/IGraphicBufferProducer.cpp
+++ b/libs/gui/IGraphicBufferProducer.cpp
@@ -49,7 +49,8 @@
SET_GENERATION_NUMBER,
GET_CONSUMER_NAME,
SET_MAX_DEQUEUED_BUFFER_COUNT,
- SET_ASYNC_MODE
+ SET_ASYNC_MODE,
+ GET_NEXT_FRAME_NUMBER
};
class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
@@ -326,6 +327,18 @@
}
return reply.readString8();
}
+
+ virtual uint64_t getNextFrameNumber() const {
+ Parcel data, reply;
+ data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
+ status_t result = remote()->transact(GET_NEXT_FRAME_NUMBER, data, &reply);
+ if (result != NO_ERROR) {
+ ALOGE("getNextFrameNumber failed to transact: %d", result);
+ return 0;
+ }
+ uint64_t frameNumber = reply.readUint64();
+ return frameNumber;
+ }
};
// Out-of-line virtual method definition to trigger vtable emission in this
@@ -508,6 +521,12 @@
reply->writeString8(getConsumerName());
return NO_ERROR;
}
+ case GET_NEXT_FRAME_NUMBER: {
+ CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
+ uint64_t frameNumber = getNextFrameNumber();
+ reply->writeUint64(frameNumber);
+ return NO_ERROR;
+ }
}
return BBinder::onTransact(code, data, reply, flags);
}