diff --git a/include/gui/ISurfaceTexture.h b/include/gui/ISurfaceTexture.h index 2398e0e4f..99aa1ad7d 100644 --- a/include/gui/ISurfaceTexture.h +++ b/include/gui/ISurfaceTexture.h @@ -31,11 +31,16 @@ namespace android { // ---------------------------------------------------------------------------- +class SurfaceTextureClient; + class ISurfaceTexture : public IInterface { public: DECLARE_META_INTERFACE(SurfaceTexture); +protected: + friend class SurfaceTextureClient; + enum { BUFFER_NEEDS_REALLOCATION = 1 }; // requestBuffer requests a new buffer for the given index. The server (i.e. @@ -85,6 +90,10 @@ public: // Holding this binder reference prevents SurfaceFlinger from freeing the // buffers before the client is done with them. virtual sp getAllocator() = 0; + + // query retrieves some information for this surface + // 'what' tokens allowed are that of android_natives.h + virtual int query(int what, int* value) = 0; }; // ---------------------------------------------------------------------------- diff --git a/include/gui/SurfaceTexture.h b/include/gui/SurfaceTexture.h index 2a13e3f1b..152e9bfee 100644 --- a/include/gui/SurfaceTexture.h +++ b/include/gui/SurfaceTexture.h @@ -76,6 +76,8 @@ public: virtual status_t setCrop(const Rect& reg); virtual status_t setTransform(uint32_t transform); + virtual int query(int what, int* value); + // updateTexImage sets the image contents of the target texture to that of // the most recently queued buffer. // diff --git a/libs/gui/ISurfaceTexture.cpp b/libs/gui/ISurfaceTexture.cpp index 44c78cadb..0bd0f9721 100644 --- a/libs/gui/ISurfaceTexture.cpp +++ b/libs/gui/ISurfaceTexture.cpp @@ -39,6 +39,7 @@ enum { SET_CROP, SET_TRANSFORM, GET_ALLOCATOR, + QUERY, }; @@ -132,6 +133,17 @@ public: remote()->transact(GET_ALLOCATOR, data, &reply); return reply.readStrongBinder(); } + + virtual int query(int what, int* value) { + Parcel data, reply; + data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); + data.writeInt32(what); + remote()->transact(QUERY, data, &reply); + value[0] = reply.readInt32(); + status_t result = reply.readInt32(); + return result; + } + }; IMPLEMENT_META_INTERFACE(SurfaceTexture, "android.gui.SurfaceTexture"); @@ -209,6 +221,15 @@ status_t BnSurfaceTexture::onTransact( reply->writeStrongBinder(result); return NO_ERROR; } break; + case QUERY: { + CHECK_INTERFACE(ISurfaceTexture, data, reply); + int value; + int what = data.readInt32(); + int res = query(what, &value); + reply->writeInt32(value); + reply->writeInt32(res); + return NO_ERROR; + } break; } return BBinder::onTransact(code, data, reply, flags); } diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index 13176df0f..0db30a058 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -509,6 +509,34 @@ uint32_t SurfaceTexture::getCurrentTransform() const { return mCurrentTransform; } +int SurfaceTexture::query(int what, int* outValue) +{ + Mutex::Autolock lock(mMutex); + int value; + switch (what) { + case NATIVE_WINDOW_WIDTH: + value = mDefaultWidth; + if (!mDefaultWidth && !mDefaultHeight && mCurrentTextureBuf!=0) + value = mCurrentTextureBuf->width; + break; + case NATIVE_WINDOW_HEIGHT: + value = mDefaultHeight; + if (!mDefaultWidth && !mDefaultHeight && mCurrentTextureBuf!=0) + value = mCurrentTextureBuf->height; + break; + case NATIVE_WINDOW_FORMAT: + value = mPixelFormat; + break; + case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS: + value = mSynchronousMode ? + (MIN_UNDEQUEUED_BUFFERS-1) : MIN_UNDEQUEUED_BUFFERS; + break; + default: + return BAD_VALUE; + } + outValue[0] = value; + return NO_ERROR; +} static void mtxMul(float out[16], const float a[16], const float b[16]) { out[0] = a[0]*b[0] + a[4]*b[1] + a[8]*b[2] + a[12]*b[3]; diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index a46a1901e..f3ce44b53 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -159,29 +159,17 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) { int SurfaceTextureClient::query(int what, int* value) const { LOGV("SurfaceTextureClient::query"); - Mutex::Autolock lock(mMutex); switch (what) { - case NATIVE_WINDOW_WIDTH: - *value = mQueryWidth ? mQueryWidth : mReqWidth; - return NO_ERROR; - case NATIVE_WINDOW_HEIGHT: - *value = mQueryHeight ? mQueryHeight : mReqHeight; - return NO_ERROR; - case NATIVE_WINDOW_FORMAT: - *value = mQueryFormat ? mQueryFormat : mReqFormat; - return NO_ERROR; - case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS: - *value = MIN_UNDEQUEUED_BUFFERS; - return NO_ERROR; case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: - // SurfaceTextureClient currently never queues frames to SurfaceFlinger. + // TODO: this is not needed anymore *value = 0; return NO_ERROR; case NATIVE_WINDOW_CONCRETE_TYPE: + // TODO: this is not needed anymore *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT; return NO_ERROR; } - return BAD_VALUE; + return mSurfaceTexture->query(what, value); } int SurfaceTextureClient::perform(int operation, va_list args) diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp index 753e93391..5c37288e7 100644 --- a/libs/gui/tests/SurfaceTextureClient_test.cpp +++ b/libs/gui/tests/SurfaceTextureClient_test.cpp @@ -94,8 +94,8 @@ TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) { EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, anw.get(), NULL); - ASSERT_NE(EGL_NO_SURFACE, eglSurface); - ASSERT_EQ(EGL_SUCCESS, eglGetError()); + EXPECT_NE(EGL_NO_SURFACE, eglSurface); + EXPECT_EQ(EGL_SUCCESS, eglGetError()); eglTerminate(dpy); }