From 5bfc24515bb5c8ea7975f72d538df37753733a2f Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Mon, 8 Aug 2011 19:14:03 -0700 Subject: [PATCH] return correct value from query after connecting a surface the first time a surface was connected, the values returned by query NATIVE_WINDOW_DEFAULT_{WIDTH|HEIGHT} and NATIVE_WINDOW_TRANSFORM_HINT were wrong until a call to queueBuffer was performed. Bug: 5137366, 5121607 Change-Id: I7ac6b5b0daa876638f6bed7c20f286a6e6d984f6 --- include/gui/ISurfaceTexture.h | 7 ++++++- include/gui/SurfaceTexture.h | 3 ++- libs/gui/ISurfaceTexture.cpp | 13 +++++++++++-- libs/gui/SurfaceTexture.cpp | 6 +++++- libs/gui/SurfaceTextureClient.cpp | 3 ++- services/surfaceflinger/SurfaceTextureLayer.cpp | 14 ++++++++++++-- services/surfaceflinger/SurfaceTextureLayer.h | 3 ++- 7 files changed, 40 insertions(+), 9 deletions(-) diff --git a/include/gui/ISurfaceTexture.h b/include/gui/ISurfaceTexture.h index 1eda64669..50626a096 100644 --- a/include/gui/ISurfaceTexture.h +++ b/include/gui/ISurfaceTexture.h @@ -111,7 +111,12 @@ protected: // // This method will fail if the connect was previously called on the // SurfaceTexture and no corresponding disconnect call was made. - virtual status_t connect(int api) = 0; + // + // outWidth, outHeight and outTransform are filled with the default width + // and height of the window and current transform applied to buffers, + // respectively. + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0; // disconnect attempts to disconnect a client API from the SurfaceTexture. // Calling this method will cause any subsequent calls to other diff --git a/include/gui/SurfaceTexture.h b/include/gui/SurfaceTexture.h index 2a8e72556..3f9e68d81 100644 --- a/include/gui/SurfaceTexture.h +++ b/include/gui/SurfaceTexture.h @@ -106,7 +106,8 @@ public: // // This method will fail if the connect was previously called on the // SurfaceTexture and no corresponding disconnect call was made. - virtual status_t connect(int api); + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform); // disconnect attempts to disconnect a client API from the SurfaceTexture. // Calling this method will cause any subsequent calls to other diff --git a/libs/gui/ISurfaceTexture.cpp b/libs/gui/ISurfaceTexture.cpp index 55246dc90..babd2c07b 100644 --- a/libs/gui/ISurfaceTexture.cpp +++ b/libs/gui/ISurfaceTexture.cpp @@ -162,11 +162,15 @@ public: return result; } - virtual status_t connect(int api) { + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { Parcel data, reply; data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); data.writeInt32(api); remote()->transact(CONNECT, data, &reply); + *outWidth = reply.readInt32(); + *outHeight = reply.readInt32(); + *outTransform = reply.readInt32(); status_t result = reply.readInt32(); return result; } @@ -283,7 +287,12 @@ status_t BnSurfaceTexture::onTransact( case CONNECT: { CHECK_INTERFACE(ISurfaceTexture, data, reply); int api = data.readInt32(); - status_t res = connect(api); + uint32_t outWidth, outHeight, outTransform; + status_t res = connect(api, + &outWidth, &outHeight, &outTransform); + reply->writeInt32(outWidth); + reply->writeInt32(outHeight); + reply->writeInt32(outTransform); reply->writeInt32(res); return NO_ERROR; } break; diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index be71c946b..02b851c95 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -548,7 +548,8 @@ status_t SurfaceTexture::setTransform(uint32_t transform) { return OK; } -status_t SurfaceTexture::connect(int api) { +status_t SurfaceTexture::connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { LOGV("SurfaceTexture::connect(this=%p, %d)", this, api); Mutex::Autolock lock(mMutex); @@ -569,6 +570,9 @@ status_t SurfaceTexture::connect(int api) { err = -EINVAL; } else { mConnectedApi = api; + *outWidth = mDefaultWidth; + *outHeight = mDefaultHeight; + *outTransform = 0; } break; default: diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index d1037defc..e91be84c4 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -385,7 +385,8 @@ int SurfaceTextureClient::dispatchUnlockAndPost(va_list args) { int SurfaceTextureClient::connect(int api) { LOGV("SurfaceTextureClient::connect"); Mutex::Autolock lock(mMutex); - int err = mSurfaceTexture->connect(api); + int err = mSurfaceTexture->connect(api, + &mDefaultWidth, &mDefaultHeight, &mTransformHint); if (!err && api == NATIVE_WINDOW_API_CPU) { mConnectedToCpu = true; } diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp index 5973e7611..79cd0c314 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ b/services/surfaceflinger/SurfaceTextureLayer.cpp @@ -86,9 +86,19 @@ status_t SurfaceTextureLayer::dequeueBuffer(int *buf, return res; } -status_t SurfaceTextureLayer::connect(int api) { - status_t err = SurfaceTexture::connect(api); +status_t SurfaceTextureLayer::connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { + status_t err = SurfaceTexture::connect(api, + outWidth, outHeight, outTransform); if (err == NO_ERROR) { + sp layer(mLayer.promote()); + if (layer != NULL) { + uint32_t orientation = layer->getOrientation(); + if (orientation & Transform::ROT_INVALID) { + orientation = 0; + } + *outTransform = orientation; + } switch(api) { case NATIVE_WINDOW_API_MEDIA: case NATIVE_WINDOW_API_CAMERA: diff --git a/services/surfaceflinger/SurfaceTextureLayer.h b/services/surfaceflinger/SurfaceTextureLayer.h index 5d328b7c6..9508524af 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.h +++ b/services/surfaceflinger/SurfaceTextureLayer.h @@ -51,7 +51,8 @@ protected: virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h, uint32_t format, uint32_t usage); - virtual status_t connect(int api); + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform); }; // ---------------------------------------------------------------------------