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>
21c6bae007e6e29b585fc1207f84b378a480006173Mathias Agopian#include <GLES2/gl2.h>
22c6bae007e6e29b585fc1207f84b378a480006173Mathias Agopian
23134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <gtest/gtest.h>
24c6bae007e6e29b585fc1207f84b378a480006173Mathias Agopian#include <gui/GLConsumer.h>
25e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
26d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis#include <system/graphics.h>
27fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis#include <utils/Log.h>
28fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis#include <utils/Thread.h>
29134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android {
31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
32134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTextureClientTest : public ::testing::Test {
33134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected:
347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    SurfaceTextureClientTest():
357a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglDisplay(EGL_NO_DISPLAY),
367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglSurface(EGL_NO_SURFACE),
377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglContext(EGL_NO_CONTEXT) {
387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
40134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void SetUp() {
41fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        const ::testing::TestInfo* const testInfo =
42fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
43fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
44fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis                testInfo->name());
45fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
468f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopian        sp<BufferQueue> bq = new BufferQueue();
478f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopian        mST = new GLConsumer(bq, 123);
48db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        mSTC = new Surface(bq);
498b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW = mSTC;
507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // We need a valid GL context so we can test updateTexImage()
527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // This initializes EGL and create a dummy GL context with a
537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // pbuffer render target.
547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
567a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint majorVersion, minorVersion;
597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLConfig myConfig;
637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint numConfigs = 0;
647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian                &myConfig, 1, &numConfigs));
667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
68993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian        mEglConfig = myConfig;
697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint pbufferAttribs[] = {
707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_WIDTH, 16,
717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_HEIGHT, 16,
727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE };
737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
787a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
797a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
83134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
84134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
85134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
86134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST.clear();
87134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC.clear();
888b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW.clear();
898b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
917a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroyContext(mEglDisplay, mEglContext);
927a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroySurface(mEglDisplay, mEglSurface);
937a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglTerminate(mEglDisplay);
94fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
95fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        const ::testing::TestInfo* const testInfo =
96fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
97fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
98fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis                testInfo->name());
997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
1007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
1017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    virtual EGLint const* getConfigAttribs() {
1027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        static EGLint sDefaultConfigAttribs[] = {
103993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
1047a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE
1057a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        };
1067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
1077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        return sDefaultConfigAttribs;
108134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
109134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
1102adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    sp<GLConsumer> mST;
111e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<Surface> mSTC;
1128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    sp<ANativeWindow> mANW;
1138b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
1147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLDisplay mEglDisplay;
1157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLSurface mEglSurface;
1167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLContext mEglContext;
117993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLConfig  mEglConfig;
118134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
119134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
120bae774eb20bebd409441b93386b51bccda75f546Jamie GennisTEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
121cf0b8c85fb0106751256dba7821f86b5ad03126cMathias Agopian    sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
122bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    ASSERT_TRUE(ist != NULL);
123bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
124bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
125134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
126134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
1278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
128134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
129134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(0, result);
131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
132134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
133391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
134391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
1358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
136391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
137e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
138391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
139391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
1401b528fb9d818044973abf656c9d2d3c1192bcfdcJamie GennisTEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
1415c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1425c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1435c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_NE(EGL_NO_DISPLAY, dpy);
1445c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1455c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint majorVersion;
1465c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint minorVersion;
1475c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
1485c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1495c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1505c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLConfig myConfig = {0};
1515c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint numConfigs = 0;
1525c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint configAttribs[] = {
1535c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1545c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1555c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RED_SIZE, 8,
1565c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_GREEN_SIZE, 8,
1575c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_BLUE_SIZE, 8,
1585c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_ALPHA_SIZE, 8,
1595c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_DEPTH_SIZE, 16,
1605c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_STENCIL_SIZE, 8,
1615c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_NONE };
1625c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
1635c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            &numConfigs));
1645c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1655c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
1675c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            NULL);
168eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
169eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
1705c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
171fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    if (eglSurface != EGL_NO_SURFACE) {
172fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        eglDestroySurface(dpy, eglSurface);
173fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    }
174fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
1755c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    eglTerminate(dpy);
1765c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis}
1775c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
178993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias AgopianTEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
179993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
180993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), NULL);
181993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
182993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
183993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
184993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
185ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_TRUE(success);
186993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
187993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    glClear(GL_COLOR_BUFFER_BIT);
188993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglSwapBuffers(mEglDisplay, eglSurface);
189ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_TRUE(success);
190993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
191993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    mST->abandon();
192993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
193993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    glClear(GL_COLOR_BUFFER_BIT);
194993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglSwapBuffers(mEglDisplay, eglSurface);
195ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_FALSE(success);
196993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
197993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
198993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
199ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    ASSERT_TRUE(success);
200993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
201993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    if (eglSurface != EGL_NO_SURFACE) {
202993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian        eglDestroySurface(mEglDisplay, eglSurface);
203993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    }
204993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian}
205993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
206a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
2078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1,  0,  0));
2088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0, -1,  0));
2098b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  0, -1));
2108b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1, -1,  0));
2118b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  8,  0));
2128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  8,  0,  0));
213a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
214a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
215a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
216697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
217d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
218a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
219a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
220a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
221d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
222a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
223a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
224a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
225697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2268b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, PIXEL_FORMAT_RGB_565));
227d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
228a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
229a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
230a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
231d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
232a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
233a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
234a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
235697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2368b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
237d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
238a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
239a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
240a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
241d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
242a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
243a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
244a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
245697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2468b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
247d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
248a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
249a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
250a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
251d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
252a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
253a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
254a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
255697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
257d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
258a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
259a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
260a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
261d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
2628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, 0));
263d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
264a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
265a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
266a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
267d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
268a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
269a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
270a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
271697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2728b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
273d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
274a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
275a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
276a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
277d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
2784697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
279d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
280a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
281a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
282a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
283d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
284a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
285a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
286a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
2872adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    sp<GLConsumer> st(mST);
288697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
289a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
290d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
291a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
292a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
293a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
294d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
295a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
296a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
297a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
298697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2998b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
300d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
301d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
302a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
303d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
304d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
3058b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
306d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
307d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
308a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
309a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
310a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
311a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
312a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
313d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
314d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
315a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
316a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
317a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
318697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
3198b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3208b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
321d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
322d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
323a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
324a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
325a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
326a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
327a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
328d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
329d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
3308b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 12, 24, 0));
331d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
332d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
333a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
334a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[0]->width);
335a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[1]->width);
336a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[0]->height);
337a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[1]->height);
338d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
339d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
340a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
341a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
3427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
3437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
344595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 0));
3458b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
347d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
348d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
3498b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3508b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
352595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 1));
3538b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
355d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
356d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
357d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
358d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
3597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3608b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3618b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
3667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3678b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
368d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
369d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
370d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
3717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
374d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
375d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
376d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
3778b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3798b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3808b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3818b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3828b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3837a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
3867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
388d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
389d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
390d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
3917a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3927a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3937a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
394d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
3958b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3968b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
397d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
3988b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3998b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
400d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
4018b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4028b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
4037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4047a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4057a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
4067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
4087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
409d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
410d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
4118b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
4137a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
414d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
4157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
416d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
4178b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4188b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4197a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
420d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4217a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
422d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
4238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
4257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4278cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// XXX: We currently have no hardware that properly handles dequeuing the
4288cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// buffer that is currently bound to the texture.
4298cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
4307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* firstBuf;
4328b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
433d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &firstBuf));
434d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf, -1));
4358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4368b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
437d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
438d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
439d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
440d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
441d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
442d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
4437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
4447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
4457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
4467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(firstBuf, buf[2]);
4477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
4507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4518b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
452c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4538b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    // We should be able to dequeue all the buffers before we've queued mANWy.
454d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
455d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
456d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
458d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
459d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
4607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4618b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
464d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
466c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // Once we've queued a buffer, however we should not be able to dequeue more
467c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
468d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(-EBUSY, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
469c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
470d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
471d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
4727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
474d72f233ffa125856a44976a50a66ceb669f49ab2Jamie GennisTEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
475d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_rect_t rect = {-2, -13, 40, 18};
476d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    native_window_set_crop(mANW.get(), &rect);
477d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
478d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
479d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
480d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_buffer_t* buf;
481d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
482d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
483d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
484d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
485d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    Rect crop = mST->getCurrentCrop();
486d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.left);
487d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.top);
488d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.right);
489d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.bottom);
490d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis}
491d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
4928dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// XXX: This is not expected to pass until the synchronization hacks are removed
4938dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// from the SurfaceTexture class.
4948dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
4957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    class MyThread : public Thread {
4962adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        sp<GLConsumer> mST;
4977a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLContext ctx;
4987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLSurface sur;
4997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLDisplay dpy;
5007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        bool mBufferRetired;
5017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        Mutex mLock;
5027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        virtual bool threadLoop() {
5037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5047a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            usleep(20000);
5057a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5068b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            mST->updateTexImage();
5077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mBufferRetired = true;
5087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            return false;
5107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    public:
5122adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        MyThread(const sp<GLConsumer>& mST)
5138b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            : mST(mST), mBufferRetired(false) {
5147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            ctx = eglGetCurrentContext();
5157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            sur = eglGetCurrentSurface(EGL_DRAW);
5167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            dpy = eglGetCurrentDisplay();
5177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5197a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ~MyThread() {
5207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5217a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        void bufferDequeued() {
5237a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EXPECT_EQ(true, mBufferRetired);
5257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    };
5277a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
5298b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
5307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    // dequeue/queue/update so we have a current buffer
531d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
532d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5338b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->updateTexImage();
5347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    MyThread* thread = new MyThread(mST);
5367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<Thread> threadBase(thread);
5377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
538d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
539d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
540e122079be632b849a71181d83a6d38b701f642f5Mathias Agopian    thread->run();
541d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
542d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
543d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
544d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
5457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->bufferDequeued();
5467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->requestExitAndWait();
5477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
5487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
54952226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
55052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
55152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
5528b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
553d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
554d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5558b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
55752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
55852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
55952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
56052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
56152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
56252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
56352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
56452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
56552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
56652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
56752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
56852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
56952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
57052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
57152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
57252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
57452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
57552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
57652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
57752226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
57852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57952226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
58052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
58152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
5828b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
583d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
584d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5858b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5868b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
5878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
58852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
59052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
59152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
59252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
59352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
59552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
59652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
59752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
59852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
60052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
60152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
60252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
60352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
60552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
60652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
60752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
60852226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
60952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
61052226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
61152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
61252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
61352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_rect_t crop;
61452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.left = 0;
61552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.top = 0;
61652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.right = 5;
61752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.bottom = 5;
61852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
6198b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
6208b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 8, 8, 0));
621d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
6228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
623d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
6248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
6258b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
6268b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
62752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
6284697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    // This accounts for the .5 texel shrink for each edge that's included in the
62952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // transform matrix to avoid texturing outside the crop region.
6304697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(0.5, mtx[0]);
63152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
63252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
63352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
63452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
63552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
6364697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(-0.5, mtx[5]);
63752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
63852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
63952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
64052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
64152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
64252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
64352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
64452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
6454697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(0.0625f, mtx[12]);
6464697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(0.5625f, mtx[13]);
64752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
64852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
649134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
65052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
651a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// This test verifies that the buffer format can be queried immediately after
652a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// it is set.
65307ed1a94bcad9b78b20f74f890d4271099da3a97Jamie GennisTEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
654a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    sp<ANativeWindow> anw(mSTC);
655a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    int fmts[] = {
656a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        // RGBA_8888 should not come first, as it's the default
657a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBX_8888,
658a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_8888,
659a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_888,
660a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_565,
661a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_BGRA_8888,
662a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_YV12,
663a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    };
664a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
665a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
666a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    for (int i = 0; i < numFmts; i++) {
667a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      int fmt = -1;
668a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, fmts[i]));
669a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
670a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      EXPECT_EQ(fmts[i], fmt);
671a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    }
672a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis}
673a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
674c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisclass MultiSurfaceTextureClientTest : public ::testing::Test {
675c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
676c8251a06df70de70d45ac477af816dcee7580205Jamie Gennispublic:
677c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    MultiSurfaceTextureClientTest() :
678c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglDisplay(EGL_NO_DISPLAY),
679c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglContext(EGL_NO_CONTEXT) {
680c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
681c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = EGL_NO_CONTEXT;
682c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
683c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
684c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
685c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisprotected:
686c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
687c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    enum { NUM_SURFACE_TEXTURES = 32 };
688c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
689c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void SetUp() {
690c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
691c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
692c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
693c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
694c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint majorVersion, minorVersion;
695c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
696c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
697c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
698c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLConfig myConfig;
699c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint numConfigs = 0;
700c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint configAttribs[] = {
701c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
702c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_NONE
703c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        };
704c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
705c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                &numConfigs));
706c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
707c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
708c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
709c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                0);
710c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
711c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
712c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
713c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
7148f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopian            sp<BufferQueue> bq = new BufferQueue();
7158f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopian            sp<GLConsumer> st(new GLConsumer(bq, i));
716db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian            sp<Surface> stc(new Surface(bq));
717c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
718c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    static_cast<ANativeWindow*>(stc.get()), NULL);
719c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_EQ(EGL_SUCCESS, eglGetError());
720c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
721c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
722c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
723c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
724c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void TearDown() {
725c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
726c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                EGL_NO_CONTEXT);
727c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
728c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
729c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            if (mEglSurfaces[i] != EGL_NO_SURFACE) {
730c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
731c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            }
732c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
733c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
734c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglContext != EGL_NO_CONTEXT) {
735c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglDestroyContext(mEglDisplay, mEglContext);
736c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
737c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
738c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglDisplay != EGL_NO_DISPLAY) {
739c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglTerminate(mEglDisplay);
740c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
741c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
742c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
743c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLDisplay mEglDisplay;
744c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
745c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLContext mEglContext;
746c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis};
747c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
748c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// XXX: This test is disabled because it causes a hang on some devices.  See bug
749c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// 5015672.
750c8251a06df70de70d45ac477af816dcee7580205Jamie GennisTEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
751c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    for (int iter = 0; iter < 8; iter++) {
752c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
753c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
754c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    mEglContext);
755c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            glClear(GL_COLOR_BUFFER_BIT);
756c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
757c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
758c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
759c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis}
760c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
76152226048095c2eb27ede0c3389626df270a0abffJamie Gennis} // namespace android
762