summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gui/BufferQueueCore.h9
-rw-r--r--include/gui/SurfaceControl.h3
-rw-r--r--libs/gui/BufferQueueProducer.cpp4
-rw-r--r--libs/gui/SurfaceControl.cpp8
4 files changed, 22 insertions, 2 deletions
diff --git a/include/gui/BufferQueueCore.h b/include/gui/BufferQueueCore.h
index d10ba2f2c6..acc8c4b070 100644
--- a/include/gui/BufferQueueCore.h
+++ b/include/gui/BufferQueueCore.h
@@ -67,8 +67,13 @@ public:
// consumer can run asynchronously.
enum { MAX_MAX_ACQUIRED_BUFFERS = BufferQueueDefs::NUM_BUFFER_SLOTS - 2 };
- // The default API number used to indicate that no producer is connected
- enum { NO_CONNECTED_API = 0 };
+ enum {
+ // The API number used to indicate the currently connected producer
+ CURRENTLY_CONNECTED_API = -1,
+
+ // The API number used to indicate that no producer is connected
+ NO_CONNECTED_API = 0,
+ };
typedef Vector<BufferItem> Fifo;
diff --git a/include/gui/SurfaceControl.h b/include/gui/SurfaceControl.h
index 993a92f930..76ce68db91 100644
--- a/include/gui/SurfaceControl.h
+++ b/include/gui/SurfaceControl.h
@@ -57,6 +57,9 @@ public:
// release surface data from java
void clear();
+ // disconnect any api that's connected
+ void disconnect();
+
status_t setLayerStack(uint32_t layerStack);
status_t setLayer(uint32_t layer);
status_t setPosition(float x, float y);
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp
index 17d4a2c818..818fac6613 100644
--- a/libs/gui/BufferQueueProducer.cpp
+++ b/libs/gui/BufferQueueProducer.cpp
@@ -1115,6 +1115,10 @@ status_t BufferQueueProducer::disconnect(int api) {
return NO_ERROR;
}
+ if (api == BufferQueueCore::CURRENTLY_CONNECTED_API) {
+ api = mCore->mConnectedApi;
+ }
+
switch (api) {
case NATIVE_WINDOW_API_EGL:
case NATIVE_WINDOW_API_CPU:
diff --git a/libs/gui/SurfaceControl.cpp b/libs/gui/SurfaceControl.cpp
index a945358cc0..e1a951c93f 100644
--- a/libs/gui/SurfaceControl.cpp
+++ b/libs/gui/SurfaceControl.cpp
@@ -33,6 +33,7 @@
#include <ui/GraphicBuffer.h>
#include <ui/Rect.h>
+#include <gui/BufferQueueCore.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
@@ -81,6 +82,13 @@ void SurfaceControl::clear()
destroy();
}
+void SurfaceControl::disconnect() {
+ if (mGraphicBufferProducer != NULL) {
+ mGraphicBufferProducer->disconnect(
+ BufferQueueCore::CURRENTLY_CONNECTED_API);
+ }
+}
+
bool SurfaceControl::isSameSurface(
const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs)
{