diff options
author | Dan Stoza <stoza@google.com> | 2015-03-11 11:55:01 -0700 |
---|---|---|
committer | Dan Stoza <stoza@google.com> | 2015-04-02 13:35:45 -0700 |
commit | 231832eb27107fb561467f5f4a9be2c577c61ea8 (patch) | |
tree | ab56a97f7ed1dbe951e09c082dee605d836362ba /libs/gui | |
parent | 23b204e1ee9069b9321b5547e8d17a5014efbacd (diff) | |
download | frameworks_native-231832eb27107fb561467f5f4a9be2c577c61ea8.zip frameworks_native-231832eb27107fb561467f5f4a9be2c577c61ea8.tar.gz frameworks_native-231832eb27107fb561467f5f4a9be2c577c61ea8.tar.bz2 |
DO NOT MERGE libgui: Plumb attach/detach through Surface
Exposes the attachBuffer and detachNextBuffer calls from
IGraphicBufferProducer to the public Surface interface. Also moves
the version of connect that takes a producer callback from protected
to public.
Bug: 19628705
Change-Id: I9ebc3013c4d9c84c4e8ef150c00e03f8af80319e
(cherry picked from commit c14ecb9de243af8864610fd3c74342e3ca2cb4bc)
Diffstat (limited to 'libs/gui')
-rw-r--r-- | libs/gui/Surface.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
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"); |