summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorDan Stoza <stoza@google.com>2015-04-07 22:12:33 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-04-07 22:12:33 +0000
commit6b4f28a7930c115f4b9e0d4fdfcd41b3bb58bf58 (patch)
treeb9771439dc98404a5750e4745002b93272876985 /libs
parent6d9e3dc5ca8e519218053f3f2f0e5068c835aba9 (diff)
parenta53e955ad882793bb6fea00d4d110a3d8878ab57 (diff)
downloadframeworks_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
Diffstat (limited to 'libs')
-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");