summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jamie Gennis <jgennis@google.com> 2011-03-14 15:34:04 -0700
committer Jamie Gennis <jgennis@google.com> 2011-03-15 10:37:37 -0700
commit5c0c93a8c49b4053744efb8953b915fa7f0923a5 (patch)
tree445ba1c3d421649c368af25e7212406a28fd1bbc
parentf9a20d77fa921d6f3556e60217a67e5756f4ece4 (diff)
SurfaceTexture: disallow unsupported uses.
This change makes the ANativeWindow_lock NDK function error out if it is passed an ANativeWindow with a concrete type that is not Surface. It also makes eglCreateWindowSurface fail if it is passed a SurfaceTextureClient as its 'window' argument. Bug: 4087277 Change-Id: Ie68c50c52d88f72d8a387f6c094908044c83a88c
-rw-r--r--libs/gui/tests/SurfaceTextureClient_test.cpp45
-rw-r--r--opengl/libs/EGL/egl.cpp10
2 files changed, 54 insertions, 1 deletions
diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp
index 25109f6cbf..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 {
@@ -57,4 +58,46 @@ TEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
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/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)) {