summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--include/gui/Surface.h6
-rw-r--r--libs/gui/Surface.cpp49
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");