summaryrefslogtreecommitdiffstats
path: root/libs/gui
diff options
context:
space:
mode:
authorDan Stoza <stoza@google.com>2015-03-11 11:55:01 -0700
committerDan Stoza <stoza@google.com>2015-04-02 13:35:45 -0700
commit231832eb27107fb561467f5f4a9be2c577c61ea8 (patch)
treeab56a97f7ed1dbe951e09c082dee605d836362ba /libs/gui
parent23b204e1ee9069b9321b5547e8d17a5014efbacd (diff)
downloadframeworks_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.cpp49
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");