diff options
author | Dan Stoza <stoza@google.com> | 2015-04-07 22:12:33 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-07 22:12:33 +0000 |
commit | 6b4f28a7930c115f4b9e0d4fdfcd41b3bb58bf58 (patch) | |
tree | b9771439dc98404a5750e4745002b93272876985 | |
parent | 6d9e3dc5ca8e519218053f3f2f0e5068c835aba9 (diff) | |
parent | a53e955ad882793bb6fea00d4d110a3d8878ab57 (diff) | |
download | frameworks_native-6b4f28a7930c115f4b9e0d4fdfcd41b3bb58bf58.zip frameworks_native-6b4f28a7930c115f4b9e0d4fdfcd41b3bb58bf58.tar.gz frameworks_native-6b4f28a7930c115f4b9e0d4fdfcd41b3bb58bf58.tar.bz2 |
am a53e955a: Merge "libgui: Plumb attach/detach through Surface" into stage-aosp-master
* commit 'a53e955ad882793bb6fea00d4d110a3d8878ab57':
libgui: Plumb attach/detach through Surface
-rw-r--r-- | include/gui/Surface.h | 6 | ||||
-rw-r--r-- | libs/gui/Surface.cpp | 49 |
2 files changed, 54 insertions, 1 deletions
diff --git a/include/gui/Surface.h b/include/gui/Surface.h index 40e2fc1..e973483 100644 --- a/include/gui/Surface.h +++ b/include/gui/Surface.h @@ -158,7 +158,6 @@ protected: virtual int lockBuffer_DEPRECATED(ANativeWindowBuffer* buffer); - virtual int connect(int api, const sp<IProducerListener>& listener); virtual int connect(int api); virtual int disconnect(int api); virtual int setBufferCount(int bufferCount); @@ -177,6 +176,11 @@ public: virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds); virtual int unlockAndPost(); + virtual int connect(int api, const sp<IProducerListener>& listener); + virtual int detachNextBuffer(ANativeWindowBuffer** outBuffer, + sp<Fence>* outFence); + virtual int attachBuffer(ANativeWindowBuffer*); + protected: enum { NUM_BUFFER_SLOTS = BufferQueue::NUM_BUFFER_SLOTS }; enum { DEFAULT_FORMAT = PIXEL_FORMAT_RGBA_8888 }; diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index aa6f97e..b80890f 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -610,6 +610,55 @@ int Surface::disconnect(int api) { return err; } +int Surface::detachNextBuffer(ANativeWindowBuffer** outBuffer, + sp<Fence>* outFence) { + ATRACE_CALL(); + ALOGV("Surface::detachNextBuffer"); + + if (outBuffer == NULL || outFence == NULL) { + return BAD_VALUE; + } + + Mutex::Autolock lock(mMutex); + + sp<GraphicBuffer> buffer(NULL); + sp<Fence> fence(NULL); + status_t result = mGraphicBufferProducer->detachNextBuffer( + &buffer, &fence); + if (result != NO_ERROR) { + return result; + } + + *outBuffer = buffer.get(); + if (fence != NULL && fence->isValid()) { + *outFence = fence; + } else { + *outFence = Fence::NO_FENCE; + } + + return NO_ERROR; +} + +int Surface::attachBuffer(ANativeWindowBuffer* buffer) +{ + ATRACE_CALL(); + ALOGV("Surface::attachBuffer"); + + Mutex::Autolock lock(mMutex); + + sp<GraphicBuffer> graphicBuffer(static_cast<GraphicBuffer*>(buffer)); + int32_t attachedSlot = -1; + status_t result = mGraphicBufferProducer->attachBuffer( + &attachedSlot, graphicBuffer); + if (result != NO_ERROR) { + ALOGE("attachBuffer: IGraphicBufferProducer call failed (%d)", result); + return result; + } + mSlots[attachedSlot].buffer = graphicBuffer; + + return NO_ERROR; +} + int Surface::setUsage(uint32_t reqUsage) { ALOGV("Surface::setUsage"); |