diff options
| -rw-r--r-- | include/gui/SurfaceTextureClient.h | 2 | ||||
| -rw-r--r-- | include/ui/egl/android_natives.h | 15 | ||||
| -rw-r--r-- | libs/gui/SurfaceTextureClient.cpp | 7 | ||||
| -rw-r--r-- | libs/gui/tests/SurfaceTextureClient_test.cpp | 58 | ||||
| -rw-r--r-- | libs/surfaceflinger_client/Surface.cpp | 6 | ||||
| -rw-r--r-- | libs/surfaceflinger_client/tests/Surface_test.cpp | 8 | ||||
| -rw-r--r-- | libs/ui/FramebufferNativeWindow.cpp | 3 | ||||
| -rw-r--r-- | opengl/libs/EGL/egl.cpp | 10 |
8 files changed, 107 insertions, 2 deletions
diff --git a/include/gui/SurfaceTextureClient.h b/include/gui/SurfaceTextureClient.h index 4cdece99ec..7992105df2 100644 --- a/include/gui/SurfaceTextureClient.h +++ b/include/gui/SurfaceTextureClient.h @@ -33,6 +33,8 @@ class SurfaceTextureClient public: SurfaceTextureClient(const sp<ISurfaceTexture>& surfaceTexture); + sp<ISurfaceTexture> getISurfaceTexture() const; + private: // can't be copied diff --git a/include/ui/egl/android_natives.h b/include/ui/egl/android_natives.h index 0ac34d04d5..0fc1ddf226 100644 --- a/include/ui/egl/android_natives.h +++ b/include/ui/egl/android_natives.h @@ -110,6 +110,14 @@ enum { * conjunction with this query. */ NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, + + /* Get the concrete type of a ANativeWindow. See below for the list of + * possible return values. + * + * This query should not be used outside the Android framework and will + * likely be removed in the near future. + */ + NATIVE_WINDOW_CONCRETE_TYPE, }; /* valid operations for the (*perform)() hook */ @@ -142,6 +150,13 @@ enum { NATIVE_WINDOW_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270, }; +/* values returned by the NATIVE_WINDOW_CONCRETE_TYPE query */ +enum { + NATIVE_WINDOW_FRAMEBUFFER, // FramebufferNativeWindow + NATIVE_WINDOW_SURFACE, // Surface + NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT, // SurfaceTextureClient +}; + struct ANativeWindow { #ifdef __cplusplus diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index a40fac9e92..7f1d9cbf22 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -40,6 +40,10 @@ SurfaceTextureClient::SurfaceTextureClient( mAllocator = mSurfaceTexture->getAllocator(); } +sp<ISurfaceTexture> SurfaceTextureClient::getISurfaceTexture() const { + return mSurfaceTexture; +} + int SurfaceTextureClient::setSwapInterval(ANativeWindow* window, int interval) { SurfaceTextureClient* c = getSelf(window); return c->setSwapInterval(interval); @@ -160,6 +164,9 @@ int SurfaceTextureClient::query(int what, int* value) { // SurfaceTextureClient currently never queues frames to SurfaceFlinger. *value = 0; return NO_ERROR; + case NATIVE_WINDOW_CONCRETE_TYPE: + *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT; + return NO_ERROR; } return BAD_VALUE; } diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp index 0f140ffae2..94b05bc2d3 100644 --- a/libs/gui/tests/SurfaceTextureClient_test.cpp +++ b/libs/gui/tests/SurfaceTextureClient_test.cpp @@ -14,8 +14,9 @@ * limitations under the License. */ -#include <gui/SurfaceTextureClient.h> +#include <EGL/egl.h> #include <gtest/gtest.h> +#include <gui/SurfaceTextureClient.h> namespace android { @@ -35,6 +36,11 @@ protected: sp<SurfaceTextureClient> mSTC; }; +TEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) { + sp<ISurfaceTexture> ist(mSTC->getISurfaceTexture()); + ASSERT_TRUE(ist != NULL); +} + TEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) { sp<ANativeWindow> anw(mSTC); int result = -123; @@ -44,4 +50,54 @@ TEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) { EXPECT_EQ(0, result); } +TEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) { + sp<ANativeWindow> anw(mSTC); + int result = -123; + int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result); + EXPECT_EQ(NO_ERROR, err); + EXPECT_EQ(NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT, result); +} + +TEST_F(SurfaceTextureClientTest, ANativeWindowLockFails) { + sp<ANativeWindow> anw(mSTC); + ANativeWindow_Buffer buf; + ASSERT_EQ(BAD_VALUE, ANativeWindow_lock(anw.get(), &buf, NULL)); +} + +TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceFails) { + sp<ANativeWindow> anw(mSTC); + + EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); + ASSERT_EQ(EGL_SUCCESS, eglGetError()); + ASSERT_NE(EGL_NO_DISPLAY, dpy); + + EGLint majorVersion; + EGLint minorVersion; + EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion)); + ASSERT_EQ(EGL_SUCCESS, eglGetError()); + + EGLConfig myConfig = {0}; + EGLint numConfigs = 0; + EGLint configAttribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_DEPTH_SIZE, 16, + EGL_STENCIL_SIZE, 8, + EGL_NONE }; + EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1, + &numConfigs)); + ASSERT_EQ(EGL_SUCCESS, eglGetError()); + + EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, anw.get(), + NULL); + ASSERT_EQ(EGL_NO_SURFACE, eglSurface); + ASSERT_EQ(EGL_BAD_NATIVE_WINDOW, eglGetError()); + + eglTerminate(dpy); +} + } diff --git a/libs/surfaceflinger_client/Surface.cpp b/libs/surfaceflinger_client/Surface.cpp index afabbf4db6..21d509a6a8 100644 --- a/libs/surfaceflinger_client/Surface.cpp +++ b/libs/surfaceflinger_client/Surface.cpp @@ -712,11 +712,15 @@ int Surface::query(int what, int* value) case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS: *value = MIN_UNDEQUEUED_BUFFERS; return NO_ERROR; - case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: + case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: { sp<ISurfaceComposer> sf(ComposerService::getComposerService()); *value = sf->authenticateSurface(mSurface) ? 1 : 0; return NO_ERROR; } + case NATIVE_WINDOW_CONCRETE_TYPE: + *value = NATIVE_WINDOW_SURFACE; + return NO_ERROR; + } return BAD_VALUE; } diff --git a/libs/surfaceflinger_client/tests/Surface_test.cpp b/libs/surfaceflinger_client/tests/Surface_test.cpp index 74ebf4e98b..fd07479a05 100644 --- a/libs/surfaceflinger_client/tests/Surface_test.cpp +++ b/libs/surfaceflinger_client/tests/Surface_test.cpp @@ -130,4 +130,12 @@ TEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersFail) { ASSERT_TRUE(heap != NULL); } +TEST_F(SurfaceTest, ConcreteTypeIsSurface) { + sp<ANativeWindow> anw(mSurface); + int result = -123; + int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result); + EXPECT_EQ(NO_ERROR, err); + EXPECT_EQ(NATIVE_WINDOW_SURFACE, result); +} + } diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp index 0702d49667..dc223f9645 100644 --- a/libs/ui/FramebufferNativeWindow.cpp +++ b/libs/ui/FramebufferNativeWindow.cpp @@ -286,6 +286,9 @@ int FramebufferNativeWindow::query(ANativeWindow* window, case NATIVE_WINDOW_FORMAT: *value = fb->format; return NO_ERROR; + case NATIVE_WINDOW_CONCRETE_TYPE: + *value = NATIVE_WINDOW_FRAMEBUFFER; + return NO_ERROR; } *value = 0; return BAD_VALUE; diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index 3d5a4d16f6..f4a16509ed 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -1094,6 +1094,16 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, EGLConfig iConfig = dp->configs[intptr_t(config)].config; EGLint format; + // for now fail if the window is not a Surface. + int type = -1; + ANativeWindow* anw = reinterpret_cast<ANativeWindow*>(window); + if ((anw->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &type) != 0) || + (type == NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT)) { + LOGE("native window is a SurfaceTextureClient (currently " + "unsupported)"); + return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); + } + // set the native window's buffers format to match this config if (cnx->egl.eglGetConfigAttrib(iDpy, iConfig, EGL_NATIVE_VISUAL_ID, &format)) { |