Merge "SurfaceTexture: fix queues-to-composer"
diff --git a/include/surfaceflinger/ISurfaceComposer.h b/include/surfaceflinger/ISurfaceComposer.h
index dba98a3..6b31ca4 100644
--- a/include/surfaceflinger/ISurfaceComposer.h
+++ b/include/surfaceflinger/ISurfaceComposer.h
@@ -132,9 +132,10 @@
     virtual status_t turnElectronBeamOff(int32_t mode) = 0;
     virtual status_t turnElectronBeamOn(int32_t mode) = 0;
 
-    /* verify that an ISurface was created by SurfaceFlinger.
+    /* verify that an ISurfaceTexture was created by SurfaceFlinger.
      */
-    virtual bool authenticateSurface(const sp<ISurface>& surface) const = 0;
+    virtual bool authenticateSurfaceTexture(
+            const sp<ISurfaceTexture>& surface) const = 0;
 };
 
 // ----------------------------------------------------------------------------
diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp
index c1156d5..030a83e 100644
--- a/libs/gui/ISurfaceComposer.cpp
+++ b/libs/gui/ISurfaceComposer.cpp
@@ -31,6 +31,8 @@
 
 #include <ui/DisplayInfo.h>
 
+#include <gui/ISurfaceTexture.h>
+
 #include <utils/Log.h>
 
 // ---------------------------------------------------------------------------
@@ -166,35 +168,36 @@
         return reply.readInt32();
     }
 
-    virtual bool authenticateSurface(const sp<ISurface>& surface) const
+    virtual bool authenticateSurfaceTexture(
+            const sp<ISurfaceTexture>& surfaceTexture) const
     {
         Parcel data, reply;
         int err = NO_ERROR;
         err = data.writeInterfaceToken(
                 ISurfaceComposer::getInterfaceDescriptor());
         if (err != NO_ERROR) {
-            LOGE("ISurfaceComposer::authenticateSurface: error writing "
+            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
                     "interface descriptor: %s (%d)", strerror(-err), -err);
             return false;
         }
-        err = data.writeStrongBinder(surface->asBinder());
+        err = data.writeStrongBinder(surfaceTexture->asBinder());
         if (err != NO_ERROR) {
-            LOGE("ISurfaceComposer::authenticateSurface: error writing strong "
-                    "binder to parcel: %s (%d)", strerror(-err), -err);
+            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
+                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
             return false;
         }
         err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
                 &reply);
         if (err != NO_ERROR) {
-            LOGE("ISurfaceComposer::authenticateSurface: error performing "
-                    "transaction: %s (%d)", strerror(-err), -err);
+            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
+                    "performing transaction: %s (%d)", strerror(-err), -err);
             return false;
         }
         int32_t result = 0;
         err = reply.readInt32(&result);
         if (err != NO_ERROR) {
-            LOGE("ISurfaceComposer::authenticateSurface: error retrieving "
-                    "result: %s (%d)", strerror(-err), -err);
+            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
+                    "retrieving result: %s (%d)", strerror(-err), -err);
             return false;
         }
         return result != 0;
@@ -291,8 +294,9 @@
         } break;
         case AUTHENTICATE_SURFACE: {
             CHECK_INTERFACE(ISurfaceComposer, data, reply);
-            sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder());
-            int32_t result = authenticateSurface(surface) ? 1 : 0;
+            sp<ISurfaceTexture> surfaceTexture =
+                    interface_cast<ISurfaceTexture>(data.readStrongBinder());
+            int32_t result = authenticateSurfaceTexture(surfaceTexture) ? 1 : 0;
             reply->writeInt32(result);
         } break;
         default:
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp
index 2c70251..54d04aa 100644
--- a/libs/gui/Surface.cpp
+++ b/libs/gui/Surface.cpp
@@ -342,9 +342,6 @@
 
 int Surface::query(int what, int* value) const {
     switch (what) {
-    case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
-        *value = 1;
-        return NO_ERROR;
     case NATIVE_WINDOW_CONCRETE_TYPE:
         *value = NATIVE_WINDOW_SURFACE;
         return NO_ERROR;
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index e91be84..5a35b4d 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -18,6 +18,8 @@
 //#define LOG_NDEBUG 0
 
 #include <gui/SurfaceTextureClient.h>
+#include <surfaceflinger/ISurfaceComposer.h>
+#include <surfaceflinger/SurfaceComposerClient.h>
 
 #include <utils/Log.h>
 
@@ -234,7 +236,15 @@
                 }
                 break;
             case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
-                *value = 0;
+                {
+                    sp<ISurfaceComposer> composer(
+                            ComposerService::getComposerService());
+                    if (composer->authenticateSurfaceTexture(mSurfaceTexture)) {
+                        *value = 1;
+                    } else {
+                        *value = 0;
+                    }
+                }
                 return NO_ERROR;
             case NATIVE_WINDOW_CONCRETE_TYPE:
                 *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT;
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 0425fc3..64eaecc 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -133,6 +133,11 @@
     return sur;
 }
 
+wp<IBinder> Layer::getSurfaceTextureBinder() const
+{
+    return mSurfaceTexture->asBinder();
+}
+
 status_t Layer::setBuffers( uint32_t w, uint32_t h,
                             PixelFormat format, uint32_t flags)
 {
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index d3ddab4..5f0be80 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -74,6 +74,9 @@
     virtual bool isProtected() const;
     virtual void onRemoved();
 
+    // LayerBaseClient interface
+    virtual wp<IBinder> getSurfaceTextureBinder() const;
+
     // only for debugging
     inline const sp<FreezeLock>&  getFreezeLock() const { return mFreezeLock; }
 
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index e04c533..7bf73d9 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -544,6 +544,10 @@
     return mClientSurfaceBinder;
 }
 
+wp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const {
+    return 0;
+}
+
 void LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
 {
     LayerBase::dump(result, buffer, SIZE);
diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index faf71dd..a3d3644 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -288,6 +288,7 @@
 
             sp<ISurface> getSurface();
             wp<IBinder> getSurfaceBinder() const;
+            virtual wp<IBinder> getSurfaceTextureBinder() const;
 
     virtual sp<LayerBaseClient> getLayerBaseClient() const {
         return const_cast<LayerBaseClient*>(this); }
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a68ab30..50afb3d 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -353,9 +353,10 @@
     mEventQueue.invalidate();
 }
 
-bool SurfaceFlinger::authenticateSurface(const sp<ISurface>& surface) const {
+bool SurfaceFlinger::authenticateSurfaceTexture(
+        const sp<ISurfaceTexture>& surfaceTexture) const {
     Mutex::Autolock _l(mStateLock);
-    sp<IBinder> surfBinder(surface->asBinder());
+    sp<IBinder> surfaceTextureBinder(surfaceTexture->asBinder());
 
     // Check the visible layer list for the ISurface
     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
@@ -363,14 +364,17 @@
     for (size_t i=0 ; i<count ; i++) {
         const sp<LayerBase>& layer(currentLayers[i]);
         sp<LayerBaseClient> lbc(layer->getLayerBaseClient());
-        if (lbc != NULL && lbc->getSurfaceBinder() == surfBinder) {
-            return true;
+        if (lbc != NULL) {
+            wp<IBinder> lbcBinder = lbc->getSurfaceTextureBinder();
+            if (lbcBinder == surfaceTextureBinder) {
+                return true;
+            }
         }
     }
 
     // Check the layers in the purgatory.  This check is here so that if a
-    // Surface gets destroyed before all the clients are done using it, the
-    // error will not be reported as "surface XYZ is not authenticated", but
+    // SurfaceTexture gets destroyed before all the clients are done using it,
+    // the error will not be reported as "surface XYZ is not authenticated", but
     // will instead fail later on when the client tries to use the surface,
     // which should be reported as "surface XYZ returned an -ENODEV".  The
     // purgatorized layers are no less authentic than the visible ones, so this
@@ -379,8 +383,11 @@
     for (size_t i=0 ; i<purgatorySize ; i++) {
         const sp<LayerBase>& layer(mLayerPurgatory.itemAt(i));
         sp<LayerBaseClient> lbc(layer->getLayerBaseClient());
-        if (lbc != NULL && lbc->getSurfaceBinder() == surfBinder) {
-            return true;
+        if (lbc != NULL) {
+            wp<IBinder> lbcBinder = lbc->getSurfaceTextureBinder();
+            if (lbcBinder == surfaceTextureBinder) {
+                return true;
+            }
         }
     }
 
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 89df0de..1738238 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -171,7 +171,7 @@
     virtual status_t                    freezeDisplay(DisplayID dpy, uint32_t flags);
     virtual status_t                    unfreezeDisplay(DisplayID dpy, uint32_t flags);
     virtual int                         setOrientation(DisplayID dpy, int orientation, uint32_t flags);
-    virtual bool                        authenticateSurface(const sp<ISurface>& surface) const;
+    virtual bool                        authenticateSurfaceTexture(const sp<ISurfaceTexture>& surface) const;
 
     virtual status_t captureScreen(DisplayID dpy,
             sp<IMemoryHeap>* heap,