SurfaceTextureClient_test.cpp revision d72f233ffa125856a44976a50a66ceb669f49ab2
1134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis/*
2134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Copyright (C) 2011 The Android Open Source Project
3134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *
4134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
5134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * you may not use this file except in compliance with the License.
6134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * You may obtain a copy of the License at
7134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *
8134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
9134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *
10134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Unless required by applicable law or agreed to in writing, software
11134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
12134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * See the License for the specific language governing permissions and
14134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * limitations under the License.
15134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis */
16134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
17fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis#define LOG_TAG "SurfaceTextureClient_test"
18fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis//#define LOG_NDEBUG 0
19fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
205c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis#include <EGL/egl.h>
21134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <gtest/gtest.h>
225c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis#include <gui/SurfaceTextureClient.h>
23d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis#include <system/graphics.h>
24fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis#include <utils/Log.h>
25fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis#include <utils/Thread.h>
26134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
27134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android {
28134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
29134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTextureClientTest : public ::testing::Test {
30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected:
317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    SurfaceTextureClientTest():
327a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglDisplay(EGL_NO_DISPLAY),
337a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglSurface(EGL_NO_SURFACE),
347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglContext(EGL_NO_CONTEXT) {
357a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void SetUp() {
38fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        const ::testing::TestInfo* const testInfo =
39fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
40fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
41fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis                testInfo->name());
42fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
43134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST = new SurfaceTexture(123);
44134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC = new SurfaceTextureClient(mST);
458b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW = mSTC;
467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // We need a valid GL context so we can test updateTexImage()
487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // This initializes EGL and create a dummy GL context with a
497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // pbuffer render target.
507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint majorVersion, minorVersion;
557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
567a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLConfig myConfig;
597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint numConfigs = 0;
607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian                &myConfig, 1, &numConfigs));
627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint pbufferAttribs[] = {
657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_WIDTH, 16,
667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_HEIGHT, 16,
677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE };
687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
78134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
79134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
80134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
81134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST.clear();
82134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC.clear();
838b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW.clear();
848b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroyContext(mEglDisplay, mEglContext);
877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroySurface(mEglDisplay, mEglSurface);
887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglTerminate(mEglDisplay);
89fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
90fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        const ::testing::TestInfo* const testInfo =
91fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
92fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
93fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis                testInfo->name());
947a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
967a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    virtual EGLint const* getConfigAttribs() {
977a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        static EGLint sDefaultConfigAttribs[] = {
987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE
1007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        };
1017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
1027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        return sDefaultConfigAttribs;
103134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
104134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
105134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceTexture> mST;
106134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceTextureClient> mSTC;
1078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    sp<ANativeWindow> mANW;
1088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
1097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLDisplay mEglDisplay;
1107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLSurface mEglSurface;
1117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLContext mEglContext;
112134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
113134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
114bae774eb20bebd409441b93386b51bccda75f546Jamie GennisTEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
115bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    sp<ISurfaceTexture> ist(mSTC->getISurfaceTexture());
116bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    ASSERT_TRUE(ist != NULL);
117bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
118bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
119134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
120134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
1218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
122134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
123134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
124134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(0, result);
125134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
126134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
127391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
128391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
1298b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
130391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
131391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT, result);
132391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
133391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
1341b528fb9d818044973abf656c9d2d3c1192bcfdcJamie GennisTEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
1355c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1365c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1375c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_NE(EGL_NO_DISPLAY, dpy);
1385c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1395c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint majorVersion;
1405c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint minorVersion;
1415c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
1425c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1435c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1445c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLConfig myConfig = {0};
1455c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint numConfigs = 0;
1465c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint configAttribs[] = {
1475c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1485c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1495c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RED_SIZE, 8,
1505c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_GREEN_SIZE, 8,
1515c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_BLUE_SIZE, 8,
1525c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_ALPHA_SIZE, 8,
1535c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_DEPTH_SIZE, 16,
1545c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_STENCIL_SIZE, 8,
1555c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_NONE };
1565c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
1575c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            &numConfigs));
1585c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1595c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1608b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
1615c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            NULL);
162eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
163eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
1645c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
165fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    if (eglSurface != EGL_NO_SURFACE) {
166fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        eglDestroySurface(dpy, eglSurface);
167fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    }
168fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
1695c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    eglTerminate(dpy);
1705c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis}
1715c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
172a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
1738b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1,  0,  0));
1748b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0, -1,  0));
1758b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  0, -1));
1768b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1, -1,  0));
1778b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  8,  0));
1788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  8,  0,  0));
179a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
180a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
181a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
182697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
1838b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
184a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
185a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
186a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
1878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
188a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
189a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
190a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
191697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
1928b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, PIXEL_FORMAT_RGB_565));
1938b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
194a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
195a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
196a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
1978b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
198a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
199a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
200a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
201697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2028b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
2038b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
204a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
205a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
206a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
2078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
208a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
209a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
210a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
211697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
2138b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
214a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
215a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
216a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2178b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
218a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
219a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
220a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
221697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
2238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
224a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
225a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
226a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
2288b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, 0));
2298b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
230a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
231a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
232a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2338b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
234a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
235a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
236a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
237697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2388b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
2398b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
240a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
241a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
242a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
2438b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
2448b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
2458b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
246a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
247a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
248a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
2498b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
250a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
251a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
252a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
253a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<SurfaceTexture> st(mST);
254697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
255a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
2568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
257a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
258a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
259a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2608b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
261a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
262a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
263a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
264697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2658b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
2668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2678b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
268a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
2698b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
2708b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
2718b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
2728b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2738b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
274a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
275a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
276a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
277a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
278a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
2798b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
2808b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
281a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
282a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
283a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
284697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2858b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
2868b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
2878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2888b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
289a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
290a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
291a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
292a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
293a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
2948b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
2958b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
2968b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 12, 24, 0));
2978b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2988b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
299a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
300a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[0]->width);
301a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[1]->width);
302a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[0]->height);
303a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[1]->height);
3048b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
3058b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
306a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
307a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
3087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
3097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3108b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(false));
3118b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3138b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3148b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3158b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3168b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3188b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3198b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3268b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3288b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
3327a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3338b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3348b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3368b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3378b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
3387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3407a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
3418b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3428b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3438b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
3448b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3458b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3468b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3478b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3488b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3498b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
3537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3548b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3558b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3578b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3588b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
3597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
3628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3638b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3648b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3658b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3678b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3688b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
3698b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3708b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
3747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3758b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3768b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3798b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3808b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3818b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3838b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3858b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3868b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3898b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
3907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3918b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
3928b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3938b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3947a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3968cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// XXX: We currently have no hardware that properly handles dequeuing the
3978cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// buffer that is currently bound to the texture.
3988cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
3997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* firstBuf;
4018b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
4028b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
4038b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &firstBuf));
4048b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf));
4058b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4068b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
4078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
4088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
4098b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
4108b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
4118b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
4128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
4137a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
4147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
4157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
4167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(firstBuf, buf[2]);
4177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4197a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
4207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
4228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
423c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    // We should be able to dequeue all the buffers before we've queued mANWy.
4258b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
4268b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
4278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
4287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4298b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2]));
4308b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
4317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4328b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4338b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
4367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
437c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // Once we've queued a buffer, however we should not be able to dequeue more
438c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
4398b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(-EBUSY, mANW->dequeueBuffer(mANW.get(), &buf[1]));
440c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4418b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
4428b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2]));
4437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
445d72f233ffa125856a44976a50a66ceb669f49ab2Jamie GennisTEST_F(SurfaceTextureClientTest, SetPostTransformCropUntransforms) {
446d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_rect_t rect = {1, 5, 4, 14};
447d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    native_window_set_post_transform_crop(mANW.get(), &rect);
448d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
449d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    uint32_t xforms[] = {
450d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        HAL_TRANSFORM_FLIP_H,
451d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        HAL_TRANSFORM_FLIP_V,
452d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        HAL_TRANSFORM_ROT_90,
453d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        HAL_TRANSFORM_ROT_180,
454d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        HAL_TRANSFORM_ROT_270,
455d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    };
456d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
457d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    Rect expectedRects[] = {
458d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        Rect(4, 5, 7, 14), // HAL_TRANSFORM_FLIP_H
459d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        Rect(1, 2, 4, 11), // HAL_TRANSFORM_FLIP_V
460d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        Rect(5, 4, 14, 7), // HAL_TRANSFORM_ROT_90
461d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        Rect(4, 2, 7, 11), // HAL_TRANSFORM_ROT_180
462d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        Rect(2, 1, 11, 4), // HAL_TRANSFORM_ROT_270
463d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    };
464d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
465d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    for (size_t i = 0; i < sizeof(xforms)/sizeof(xforms[0]); i++) {
466d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        SCOPED_TRACE(String8::format("xform=%#x", xforms[i]).string());
467d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
468d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        int w = 8, h = 16;
469d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        if (xforms[i] & HAL_TRANSFORM_ROT_90) {
470d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis            w = 16;
471d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis            h = 8;
472d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        }
473d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        ASSERT_EQ(OK, native_window_set_buffers_transform(mANW.get(), xforms[i]));
474d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), w, h));
475d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
476d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        android_native_buffer_t* buf;
477d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
478d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf));
479d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        ASSERT_EQ(OK, mST->updateTexImage());
480d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
481d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        Rect crop = mST->getCurrentCrop();
482d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        EXPECT_EQ(expectedRects[i].left, crop.left);
483d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        EXPECT_EQ(expectedRects[i].top, crop.top);
484d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        EXPECT_EQ(expectedRects[i].right, crop.right);
485d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis        EXPECT_EQ(expectedRects[i].bottom, crop.bottom);
486d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    }
487d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis}
488d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
489d72f233ffa125856a44976a50a66ceb669f49ab2Jamie GennisTEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
490d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_rect_t rect = {-2, -13, 40, 18};
491d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    native_window_set_crop(mANW.get(), &rect);
492d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
493d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
494d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
495d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_buffer_t* buf;
496d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
497d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf));
498d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
499d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
500d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    Rect crop = mST->getCurrentCrop();
501d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.left);
502d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.top);
503d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.right);
504d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.bottom);
505d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis}
506d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
5078dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// XXX: This is not expected to pass until the synchronization hacks are removed
5088dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// from the SurfaceTexture class.
5098dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
5107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    class MyThread : public Thread {
5118b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        sp<SurfaceTexture> mST;
5127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLContext ctx;
5137a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLSurface sur;
5147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLDisplay dpy;
5157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        bool mBufferRetired;
5167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        Mutex mLock;
5177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        virtual bool threadLoop() {
5187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5197a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            usleep(20000);
5207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            mST->updateTexImage();
5227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mBufferRetired = true;
5237a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            return false;
5257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    public:
5278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        MyThread(const sp<SurfaceTexture>& mST)
5288b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            : mST(mST), mBufferRetired(false) {
5297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            ctx = eglGetCurrentContext();
5307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            sur = eglGetCurrentSurface(EGL_DRAW);
5317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            dpy = eglGetCurrentDisplay();
5327a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5337a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ~MyThread() {
5357a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        void bufferDequeued() {
5387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EXPECT_EQ(true, mBufferRetired);
5407a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5417a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    };
5427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
5448b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
5458b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
5467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    // dequeue/queue/update so we have a current buffer
5478b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
5488b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
5498b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->updateTexImage();
5507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5518b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    MyThread* thread = new MyThread(mST);
5527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<Thread> threadBase(thread);
5537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5548b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
5558b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
556e122079be632b849a71181d83a6d38b701f642f5Mathias Agopian    thread->run();
5578b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
5588b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
5598b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    //ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
5608b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
5617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->bufferDequeued();
5627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->requestExitAndWait();
5637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
5647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
56552226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
56652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
56752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
5688b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
5698b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
5708b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
5718b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5728b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
57352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
57552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
57652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
57752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
57852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
58052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
58152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
58252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
58352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
58552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
58652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
58752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
58852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
59052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
59152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
59252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
59352226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
59452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59552226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
59652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
59752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
5988b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
5998b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
6008b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
6018b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
6028b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
6038b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
60452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
60652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
60752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
60852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
60952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
61052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
61152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
61252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
61352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
61452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
61552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
61652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
61752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
61852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
61952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
62052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
62152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
62252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
62352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
62452226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
62552226048095c2eb27ede0c3389626df270a0abffJamie Gennis
62652226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
62752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
62852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
62952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_rect_t crop;
63052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.left = 0;
63152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.top = 0;
63252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.right = 5;
63352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.bottom = 5;
63452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
6358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
6368b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 8, 8, 0));
6378b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
6388b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
6398b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
6408b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
6418b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
6428b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
64352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
64452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // This accounts for the 1 texel shrink for each edge that's included in the
64552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // transform matrix to avoid texturing outside the crop region.
64691a6826d6794c19cdedfa58c42f8820c5cf5fe2bJamie Gennis    EXPECT_EQ(.375f, mtx[0]);
64752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
64852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
64952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
65052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
65152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
65291a6826d6794c19cdedfa58c42f8820c5cf5fe2bJamie Gennis    EXPECT_EQ(-.375f, mtx[5]);
65352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
65452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
65552226048095c2eb27ede0c3389626df270a0abffJamie Gennis
65652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
65752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
65852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
65952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
66052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
66191a6826d6794c19cdedfa58c42f8820c5cf5fe2bJamie Gennis    EXPECT_EQ(.125f, mtx[12]);
66252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(.5f, mtx[13]);
66352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
66452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
665134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
66652226048095c2eb27ede0c3389626df270a0abffJamie Gennis
667a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// This test verifies that the buffer format can be queried immediately after
668a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// it is set.
66907ed1a94bcad9b78b20f74f890d4271099da3a97Jamie GennisTEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
670a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    sp<ANativeWindow> anw(mSTC);
671a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    int fmts[] = {
672a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        // RGBA_8888 should not come first, as it's the default
673a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBX_8888,
674a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_8888,
675a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_888,
676a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_565,
677a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_BGRA_8888,
678a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_5551,
679a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_4444,
680a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_YV12,
681a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    };
682a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
683a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
684a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    for (int i = 0; i < numFmts; i++) {
685a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      int fmt = -1;
686a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, fmts[i]));
687a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
688a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      EXPECT_EQ(fmts[i], fmt);
689a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    }
690a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis}
691a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
692c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisclass MultiSurfaceTextureClientTest : public ::testing::Test {
693c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
694c8251a06df70de70d45ac477af816dcee7580205Jamie Gennispublic:
695c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    MultiSurfaceTextureClientTest() :
696c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglDisplay(EGL_NO_DISPLAY),
697c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglContext(EGL_NO_CONTEXT) {
698c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
699c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = EGL_NO_CONTEXT;
700c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
701c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
702c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
703c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisprotected:
704c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
705c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    enum { NUM_SURFACE_TEXTURES = 32 };
706c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
707c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void SetUp() {
708c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
709c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
710c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
711c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
712c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint majorVersion, minorVersion;
713c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
714c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
715c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
716c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLConfig myConfig;
717c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint numConfigs = 0;
718c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint configAttribs[] = {
719c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
720c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_NONE
721c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        };
722c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
723c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                &numConfigs));
724c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
725c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
726c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
727c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                0);
728c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
729c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
730c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
731c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
732c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            sp<SurfaceTexture> st(new SurfaceTexture(i));
733c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            sp<SurfaceTextureClient> stc(new SurfaceTextureClient(st));
734c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
735c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    static_cast<ANativeWindow*>(stc.get()), NULL);
736c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_EQ(EGL_SUCCESS, eglGetError());
737c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
738c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
739c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
740c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
741c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void TearDown() {
742c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
743c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                EGL_NO_CONTEXT);
744c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
745c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
746c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            if (mEglSurfaces[i] != EGL_NO_SURFACE) {
747c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
748c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            }
749c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
750c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
751c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglContext != EGL_NO_CONTEXT) {
752c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglDestroyContext(mEglDisplay, mEglContext);
753c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
754c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
755c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglDisplay != EGL_NO_DISPLAY) {
756c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglTerminate(mEglDisplay);
757c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
758c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
759c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
760c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLDisplay mEglDisplay;
761c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
762c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLContext mEglContext;
763c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis};
764c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
765c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// XXX: This test is disabled because it causes a hang on some devices.  See bug
766c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// 5015672.
767c8251a06df70de70d45ac477af816dcee7580205Jamie GennisTEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
768c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    for (int iter = 0; iter < 8; iter++) {
769c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
770c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
771c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    mEglContext);
772c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            glClear(GL_COLOR_BUFFER_BIT);
773c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
774c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
775c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
776c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis}
777c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
77852226048095c2eb27ede0c3389626df270a0abffJamie Gennis} // namespace android
779