diff options
author | Jamie Gennis <jgennis@google.com> | 2011-08-17 18:19:00 -0700 |
---|---|---|
committer | Jamie Gennis <jgennis@google.com> | 2011-08-17 18:19:00 -0700 |
commit | 9b8fc65b0353db3a962ab52dc556c356d556fcc1 (patch) | |
tree | c62f12d000864f496c9ab42ff5752a376ee7c3ae /services/surfaceflinger | |
parent | 842d9de74f9eaaf8a7b89dbe8475faf014ddafb8 (diff) | |
download | frameworks_base-9b8fc65b0353db3a962ab52dc556c356d556fcc1.zip frameworks_base-9b8fc65b0353db3a962ab52dc556c356d556fcc1.tar.gz frameworks_base-9b8fc65b0353db3a962ab52dc556c356d556fcc1.tar.bz2 |
SurfaceTexture: fix queues-to-composer
This change fixes the NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER query of
Surface and SurfaceTextureClient. Surface now uses the inherited
SurfaceTextureClient implementation of this query. SurfaceTextureClient
now queries SurfaceFlinger to determine whether buffers that are queued
to its ISurfaceTexture will be sent to SurfaceFlinger (as opposed to
some other process).
Change-Id: Iff187e72f30d454229f07f896b438198978270a8
Diffstat (limited to 'services/surfaceflinger')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/LayerBase.cpp | 4 | ||||
-rw-r--r-- | services/surfaceflinger/LayerBase.h | 1 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 23 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 2 |
6 files changed, 29 insertions, 9 deletions
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 @@ sp<ISurface> Layer::createSurface() 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 @@ public: 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 @@ wp<IBinder> LayerBaseClient::getSurfaceBinder() const { 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 @@ public: 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 @@ void SurfaceFlinger::signalEvent() { 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 @@ bool SurfaceFlinger::authenticateSurface(const sp<ISurface>& surface) const { 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 @@ bool SurfaceFlinger::authenticateSurface(const sp<ISurface>& surface) const { 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 @@ public: 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, |