diff options
Diffstat (limited to 'services/surfaceflinger')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 10 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/LayerBase.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/LayerBase.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 23 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 2 |
6 files changed, 33 insertions, 12 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 0425fc3..19c7ddd 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) { @@ -191,13 +196,12 @@ void Layer::setGeometry(hwc_layer_t* hwcl) * 1) buffer orientation/flip/mirror * 2) state transformation (window manager) * 3) layer orientation (screen orientation) - * mOrientation is already the composition of (2) and (3) + * mTransform is already the composition of (2) and (3) * (NOTE: the matrices are multiplied in reverse order) */ const Transform bufferOrientation(mCurrentTransform); - const Transform layerOrientation(mOrientation); - const Transform tr(layerOrientation * bufferOrientation); + const Transform tr(mTransform * bufferOrientation); // this gives us only the "orientation" component of the transform const uint32_t finalTransform = tr.getOrientation(); 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..4cc245a 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -257,6 +257,7 @@ void LayerBase::validateVisibility(const Transform& planeTransform) // cache a few things... mOrientation = tr.getOrientation(); + mTransform = tr; mTransformedBounds = tr.makeBounds(w, h); mLeft = tr.tx(); mTop = tr.ty(); @@ -544,6 +545,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..2cd3a94 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -247,6 +247,7 @@ private: protected: // cached during validateVisibility() int32_t mOrientation; + Transform mTransform; GLfloat mVertices[4][2]; Rect mTransformedBounds; int mLeft; @@ -288,6 +289,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, |