diff options
-rw-r--r-- | include/gui/BufferQueueCore.h | 2 | ||||
-rw-r--r-- | include/gui/BufferQueueProducer.h | 3 | ||||
-rw-r--r-- | include/gui/IGraphicBufferProducer.h | 3 | ||||
-rw-r--r-- | include/gui/Surface.h | 2 | ||||
-rw-r--r-- | libs/gui/BufferQueueCore.cpp | 9 | ||||
-rw-r--r-- | libs/gui/BufferQueueProducer.cpp | 7 | ||||
-rw-r--r-- | libs/gui/IGraphicBufferProducer.cpp | 34 | ||||
-rw-r--r-- | libs/gui/Surface.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h | 1 | ||||
-rw-r--r-- | services/surfaceflinger/MonitoredProducer.cpp | 4 | ||||
-rw-r--r-- | services/surfaceflinger/MonitoredProducer.h | 1 |
12 files changed, 75 insertions, 1 deletions
diff --git a/include/gui/BufferQueueCore.h b/include/gui/BufferQueueCore.h index 4337da9b04..0371db780b 100644 --- a/include/gui/BufferQueueCore.h +++ b/include/gui/BufferQueueCore.h @@ -322,6 +322,8 @@ private: // The slot of the last queued buffer int mLastQueuedSlot; + const uint64_t mUniqueId; + }; // class BufferQueueCore } // namespace android diff --git a/include/gui/BufferQueueProducer.h b/include/gui/BufferQueueProducer.h index a75ed98b57..48c3396ce4 100644 --- a/include/gui/BufferQueueProducer.h +++ b/include/gui/BufferQueueProducer.h @@ -186,6 +186,9 @@ public: virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, float outTransformMatrix[16]) override; + // See IGraphicBufferProducer::getUniqueId + virtual status_t getUniqueId(uint64_t* outId) const override; + private: // This is required by the IBinder::DeathRecipient interface virtual void binderDied(const wp<IBinder>& who); diff --git a/include/gui/IGraphicBufferProducer.h b/include/gui/IGraphicBufferProducer.h index 37ae6df39e..336ca70746 100644 --- a/include/gui/IGraphicBufferProducer.h +++ b/include/gui/IGraphicBufferProducer.h @@ -568,6 +568,9 @@ public: // Returns NO_ERROR or the status of the Binder transaction virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, float outTransformMatrix[16]) = 0; + + // Returns a unique id for this BufferQueue + virtual status_t getUniqueId(uint64_t* outId) const = 0; }; // ---------------------------------------------------------------------------- diff --git a/include/gui/Surface.h b/include/gui/Surface.h index 646203bd9a..bcce14a42e 100644 --- a/include/gui/Surface.h +++ b/include/gui/Surface.h @@ -134,6 +134,8 @@ public: status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, float outTransformMatrix[16]); + status_t getUniqueId(uint64_t* outId) const; + protected: virtual ~Surface(); diff --git a/libs/gui/BufferQueueCore.cpp b/libs/gui/BufferQueueCore.cpp index ba34eb6695..569b8f9d06 100644 --- a/libs/gui/BufferQueueCore.cpp +++ b/libs/gui/BufferQueueCore.cpp @@ -44,6 +44,12 @@ static String8 getUniqueName() { android_atomic_inc(&counter)); } +static uint64_t getUniqueId() { + static std::atomic<uint32_t> counter{0}; + static uint64_t id = static_cast<uint64_t>(getpid()) << 32; + return id | counter++; +} + BufferQueueCore::BufferQueueCore(const sp<IGraphicBufferAlloc>& allocator) : mAllocator(allocator), mMutex(), @@ -82,7 +88,8 @@ BufferQueueCore::BufferQueueCore(const sp<IGraphicBufferAlloc>& allocator) : mAutoRefresh(false), mSharedBufferSlot(INVALID_BUFFER_SLOT), mSharedBufferCache(Rect::INVALID_RECT, 0, NATIVE_WINDOW_SCALING_MODE_FREEZE, - HAL_DATASPACE_UNKNOWN) + HAL_DATASPACE_UNKNOWN), + mUniqueId(getUniqueId()) { if (allocator == NULL) { sp<ISurfaceComposer> composer(ComposerService::getComposerService()); diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index be3b6c3389..234a86313e 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -1422,4 +1422,11 @@ void BufferQueueProducer::binderDied(const wp<android::IBinder>& /* who */) { disconnect(api); } +status_t BufferQueueProducer::getUniqueId(uint64_t* outId) const { + BQ_LOGV("getUniqueId"); + + *outId = mCore->mUniqueId; + return NO_ERROR; +} + } // namespace android diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp index 2c48d83d96..7d7d09d144 100644 --- a/libs/gui/IGraphicBufferProducer.cpp +++ b/libs/gui/IGraphicBufferProducer.cpp @@ -55,6 +55,7 @@ enum { SET_AUTO_REFRESH, SET_DEQUEUE_TIMEOUT, GET_LAST_QUEUED_BUFFER, + GET_UNIQUE_ID, }; class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> @@ -418,6 +419,25 @@ public: *outFence = fence; return result; } + + virtual status_t getUniqueId(uint64_t* outId) const { + Parcel data, reply; + data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); + status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply); + if (result != NO_ERROR) { + ALOGE("getUniqueId failed to transact: %d", result); + } + status_t actualResult = NO_ERROR; + result = reply.readInt32(&actualResult); + if (result != NO_ERROR) { + return result; + } + result = reply.readUint64(outId); + if (result != NO_ERROR) { + return result; + } + return actualResult; + } }; // Out-of-line virtual method definition to trigger vtable emission in this @@ -659,6 +679,20 @@ status_t BnGraphicBufferProducer::onTransact( } return NO_ERROR; } + case GET_UNIQUE_ID: { + CHECK_INTERFACE(IGraphicBufferProducer, data, reply); + uint64_t outId = 0; + status_t actualResult = getUniqueId(&outId); + status_t result = reply->writeInt32(actualResult); + if (result != NO_ERROR) { + return result; + } + result = reply->writeUint64(outId); + if (result != NO_ERROR) { + return result; + } + return NO_ERROR; + } } return BBinder::onTransact(code, data, reply, flags); } diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 9d130cd974..bcfe714bc9 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -1279,6 +1279,11 @@ bool Surface::waitForNextFrame(uint64_t lastFrame, nsecs_t timeout) { return mQueueBufferCondition.waitRelative(mMutex, timeout) == OK; } +status_t Surface::getUniqueId(uint64_t* outId) const { + Mutex::Autolock lock(mMutex); + return mGraphicBufferProducer->getUniqueId(outId); +} + namespace view { status_t Surface::writeToParcel(Parcel* parcel) const { diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index bc8dfbb5b6..c0baa49f85 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -612,6 +612,11 @@ status_t VirtualDisplaySurface::getLastQueuedBuffer( return INVALID_OPERATION; } +status_t VirtualDisplaySurface::getUniqueId(uint64_t* /*outId*/) const { + ALOGE("getUniqueId not supported on VirtualDisplaySurface"); + return INVALID_OPERATION; +} + void VirtualDisplaySurface::updateQueueBufferOutput( const QueueBufferOutput& qbo) { uint32_t w, h, transformHint, numPendingBuffers; diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h index 29563b6a06..5b82355dcd 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h @@ -128,6 +128,7 @@ private: virtual status_t setDequeueTimeout(nsecs_t timeout) override; virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, float outTransformMatrix[16]) override; + virtual status_t getUniqueId(uint64_t* outId) const override; // // Utility methods diff --git a/services/surfaceflinger/MonitoredProducer.cpp b/services/surfaceflinger/MonitoredProducer.cpp index faab62cb4e..fd33d5cd3e 100644 --- a/services/surfaceflinger/MonitoredProducer.cpp +++ b/services/surfaceflinger/MonitoredProducer.cpp @@ -149,6 +149,10 @@ status_t MonitoredProducer::getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, outTransformMatrix); } +status_t MonitoredProducer::getUniqueId(uint64_t* outId) const { + return mProducer->getUniqueId(outId); +} + IBinder* MonitoredProducer::onAsBinder() { return IInterface::asBinder(mProducer).get(); } diff --git a/services/surfaceflinger/MonitoredProducer.h b/services/surfaceflinger/MonitoredProducer.h index ce756dc822..71b6b5915d 100644 --- a/services/surfaceflinger/MonitoredProducer.h +++ b/services/surfaceflinger/MonitoredProducer.h @@ -64,6 +64,7 @@ public: virtual IBinder* onAsBinder(); virtual status_t setSharedBufferMode(bool sharedBufferMode) override; virtual status_t setAutoRefresh(bool autoRefresh) override; + virtual status_t getUniqueId(uint64_t* outId) const override; private: sp<IGraphicBufferProducer> mProducer; |