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>
22e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.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
432adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        mST = new GLConsumer(123);
44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian        mSTC = new Surface(mST->getBufferQueue());
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
64993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian        mEglConfig = myConfig;
657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint pbufferAttribs[] = {
667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_WIDTH, 16,
677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_HEIGHT, 16,
687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE };
697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
787a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
79134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
80134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
81134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
82134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST.clear();
83134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC.clear();
848b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW.clear();
858b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroyContext(mEglDisplay, mEglContext);
887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroySurface(mEglDisplay, mEglSurface);
897a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglTerminate(mEglDisplay);
90fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
91fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        const ::testing::TestInfo* const testInfo =
92fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
93fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
94fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis                testInfo->name());
957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
967a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
977a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    virtual EGLint const* getConfigAttribs() {
987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        static EGLint sDefaultConfigAttribs[] = {
99993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
1007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE
1017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        };
1027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
1037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        return sDefaultConfigAttribs;
104134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
105134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
1062adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    sp<GLConsumer> mST;
107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<Surface> mSTC;
1088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    sp<ANativeWindow> mANW;
1098b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
1107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLDisplay mEglDisplay;
1117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLSurface mEglSurface;
1127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLContext mEglContext;
113993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLConfig  mEglConfig;
114134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
115134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
116bae774eb20bebd409441b93386b51bccda75f546Jamie GennisTEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
117cf0b8c85fb0106751256dba7821f86b5ad03126cMathias Agopian    sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
118bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    ASSERT_TRUE(ist != NULL);
119bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
120bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
121134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
122134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
1238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
124134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
125134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
126134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(0, result);
127134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
128134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
129391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
130391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
1318b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
132391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
133e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
134391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
135391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
1361b528fb9d818044973abf656c9d2d3c1192bcfdcJamie GennisTEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
1375c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1385c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1395c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_NE(EGL_NO_DISPLAY, dpy);
1405c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1415c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint majorVersion;
1425c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint minorVersion;
1435c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
1445c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1455c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1465c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLConfig myConfig = {0};
1475c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint numConfigs = 0;
1485c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint configAttribs[] = {
1495c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1505c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1515c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RED_SIZE, 8,
1525c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_GREEN_SIZE, 8,
1535c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_BLUE_SIZE, 8,
1545c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_ALPHA_SIZE, 8,
1555c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_DEPTH_SIZE, 16,
1565c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_STENCIL_SIZE, 8,
1575c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_NONE };
1585c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
1595c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            &numConfigs));
1605c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1615c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
1635c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            NULL);
164eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
165eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
1665c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
167fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    if (eglSurface != EGL_NO_SURFACE) {
168fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        eglDestroySurface(dpy, eglSurface);
169fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    }
170fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
1715c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    eglTerminate(dpy);
1725c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis}
1735c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
174993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias AgopianTEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
175993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
176993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), NULL);
177993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
178993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
179993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
180993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
181ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_TRUE(success);
182993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
183993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    glClear(GL_COLOR_BUFFER_BIT);
184993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglSwapBuffers(mEglDisplay, eglSurface);
185ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_TRUE(success);
186993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
187993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    mST->abandon();
188993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
189993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    glClear(GL_COLOR_BUFFER_BIT);
190993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglSwapBuffers(mEglDisplay, eglSurface);
191ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_FALSE(success);
192993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
193993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
194993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
195ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    ASSERT_TRUE(success);
196993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
197993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    if (eglSurface != EGL_NO_SURFACE) {
198993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian        eglDestroySurface(mEglDisplay, eglSurface);
199993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    }
200993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian}
201993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
202a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
2038b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1,  0,  0));
2048b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0, -1,  0));
2058b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  0, -1));
2068b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1, -1,  0));
2078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  8,  0));
2088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  8,  0,  0));
209a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
210a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
211a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
212697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
213d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
214a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
215a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
216a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
217d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
218a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
219a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
220a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
221697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, PIXEL_FORMAT_RGB_565));
223d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
224a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
225a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
226a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
227d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
228a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
229a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
230a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
231697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2328b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
233d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
234a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
235a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
236a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
237d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
238a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
239a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
240a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
241697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2428b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
243d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
244a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
245a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
246a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
247d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
248a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
249a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
250a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
251697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2528b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
253d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
254a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
255a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
256a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
257d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
2588b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, 0));
259d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
260a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
261a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
262a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
263d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
264a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
265a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
266a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
267697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2688b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
269d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
270a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
271a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
272a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
273d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
2744697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
275d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
276a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
277a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
278a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
279d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
280a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
281a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
282a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
2832adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    sp<GLConsumer> st(mST);
284697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
285a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
286d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
287a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
288a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
289a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
290d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
291a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
292a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
293a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
294697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2958b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
296d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
297d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
298a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
299d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
300d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
3018b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
302d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
303d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
304a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
305a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
306a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
307a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
308a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
309d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
310d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
311a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
312a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
313a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
314697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
3158b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3168b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
317d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
318d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
319a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
320a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
321a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
322a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
323a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
324d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
325d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
3268b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 12, 24, 0));
327d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
328d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
329a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
330a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[0]->width);
331a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[1]->width);
332a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[0]->height);
333a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[1]->height);
334d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
335d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
336a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
337a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
3387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
3397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3408b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(false));
3418b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
343d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
344d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
3458b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3468b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3488b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3498b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
351d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
352d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
353d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
354d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
3557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3578b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3588b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
3627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3638b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3648b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
365d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
366d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
367d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
3687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
371d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
372d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
373d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
3748b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3758b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3768b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3778b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3798b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
3837a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3848b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3858b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
386d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
387d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
388d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
3897a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3917a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
392d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
3938b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3948b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
395d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
3968b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3978b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
398d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
3998b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4008b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
4017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
4047a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4058b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
4068b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
4077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
408d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
409d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
4108b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4118b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
4127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
413d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
4147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
415d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
4168b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4178b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
419d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
421d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
4228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
4247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4268cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// XXX: We currently have no hardware that properly handles dequeuing the
4278cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// buffer that is currently bound to the texture.
4288cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
4297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* firstBuf;
4318b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
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, mST->setSynchronousMode(true));
4528b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
453c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4548b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    // We should be able to dequeue all the buffers before we've queued mANWy.
455d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
456d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
457d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
459d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
460d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
4617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4638b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
465d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
467c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // Once we've queued a buffer, however we should not be able to dequeue more
468c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
469d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(-EBUSY, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
470c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
471d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
472d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
4737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
475d72f233ffa125856a44976a50a66ceb669f49ab2Jamie GennisTEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
476d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_rect_t rect = {-2, -13, 40, 18};
477d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    native_window_set_crop(mANW.get(), &rect);
478d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
479d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
480d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
481d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_buffer_t* buf;
482d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
483d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
484d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
485d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
486d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    Rect crop = mST->getCurrentCrop();
487d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.left);
488d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.top);
489d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.right);
490d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.bottom);
491d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis}
492d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
4938dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// XXX: This is not expected to pass until the synchronization hacks are removed
4948dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// from the SurfaceTexture class.
4958dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
4967a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    class MyThread : public Thread {
4972adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        sp<GLConsumer> mST;
4987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLContext ctx;
4997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLSurface sur;
5007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLDisplay dpy;
5017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        bool mBufferRetired;
5027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        Mutex mLock;
5037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        virtual bool threadLoop() {
5047a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5057a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            usleep(20000);
5067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            mST->updateTexImage();
5087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mBufferRetired = true;
5097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            return false;
5117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    public:
5132adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        MyThread(const sp<GLConsumer>& mST)
5148b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            : mST(mST), mBufferRetired(false) {
5157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            ctx = eglGetCurrentContext();
5167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            sur = eglGetCurrentSurface(EGL_DRAW);
5177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            dpy = eglGetCurrentDisplay();
5187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5197a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ~MyThread() {
5217a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5237a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        void bufferDequeued() {
5247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EXPECT_EQ(true, mBufferRetired);
5267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5277a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    };
5287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
5308b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
5318b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
5327a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    // dequeue/queue/update so we have a current buffer
533d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
534d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->updateTexImage();
5367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5378b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    MyThread* thread = new MyThread(mST);
5387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<Thread> threadBase(thread);
5397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
540d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
541d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
542e122079be632b849a71181d83a6d38b701f642f5Mathias Agopian    thread->run();
543d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
544d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
545d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
546d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
5477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->bufferDequeued();
5487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->requestExitAndWait();
5497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
5507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
55152226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
55252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
55352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
5548b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
555d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
556d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5578b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5588b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
55952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
56052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
56152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
56252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
56352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
56452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
56552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
56652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
56752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
56852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
56952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
57152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
57252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
57352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
57452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
57652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
57752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
57852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
57952226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
58052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58152226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
58252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
58352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
5848b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
585d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
586d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5888b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
5898b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
59052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
59252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
59352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
59452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
59552226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
59752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
59852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
59952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
60052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
60252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
60352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
60452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
60552226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
60752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
60852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
60952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
61052226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
61152226048095c2eb27ede0c3389626df270a0abffJamie Gennis
61252226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
61352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
61452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
61552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_rect_t crop;
61652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.left = 0;
61752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.top = 0;
61852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.right = 5;
61952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.bottom = 5;
62052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
6218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
6228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 8, 8, 0));
623d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
6248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
625d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
6268b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
6278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
6288b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
62952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
6304697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    // This accounts for the .5 texel shrink for each edge that's included in the
63152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // transform matrix to avoid texturing outside the crop region.
6324697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(0.5, mtx[0]);
63352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
63452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
63552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
63652226048095c2eb27ede0c3389626df270a0abffJamie Gennis
63752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
6384697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(-0.5, mtx[5]);
63952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
64052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
64152226048095c2eb27ede0c3389626df270a0abffJamie Gennis
64252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
64352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
64452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
64552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
64652226048095c2eb27ede0c3389626df270a0abffJamie Gennis
6474697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(0.0625f, mtx[12]);
6484697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(0.5625f, mtx[13]);
64952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
65052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
651134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
65252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
653a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// This test verifies that the buffer format can be queried immediately after
654a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// it is set.
65507ed1a94bcad9b78b20f74f890d4271099da3a97Jamie GennisTEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
656a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    sp<ANativeWindow> anw(mSTC);
657a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    int fmts[] = {
658a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        // RGBA_8888 should not come first, as it's the default
659a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBX_8888,
660a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_8888,
661a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_888,
662a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_565,
663a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_BGRA_8888,
664a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_5551,
665a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_4444,
666a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_YV12,
667a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    };
668a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
669a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
670a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    for (int i = 0; i < numFmts; i++) {
671a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      int fmt = -1;
672a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, fmts[i]));
673a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
674a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      EXPECT_EQ(fmts[i], fmt);
675a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    }
676a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis}
677a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
678c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisclass MultiSurfaceTextureClientTest : public ::testing::Test {
679c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
680c8251a06df70de70d45ac477af816dcee7580205Jamie Gennispublic:
681c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    MultiSurfaceTextureClientTest() :
682c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglDisplay(EGL_NO_DISPLAY),
683c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglContext(EGL_NO_CONTEXT) {
684c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
685c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = EGL_NO_CONTEXT;
686c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
687c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
688c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
689c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisprotected:
690c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
691c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    enum { NUM_SURFACE_TEXTURES = 32 };
692c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
693c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void SetUp() {
694c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
695c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
696c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
697c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
698c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint majorVersion, minorVersion;
699c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
700c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
701c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
702c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLConfig myConfig;
703c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint numConfigs = 0;
704c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint configAttribs[] = {
705c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
706c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_NONE
707c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        };
708c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
709c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                &numConfigs));
710c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
711c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
712c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
713c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                0);
714c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
715c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
716c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
717c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
7182adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<GLConsumer> st(new GLConsumer(i));
719e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            sp<Surface> stc(new Surface(st->getBufferQueue()));
720c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
721c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    static_cast<ANativeWindow*>(stc.get()), NULL);
722c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_EQ(EGL_SUCCESS, eglGetError());
723c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
724c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
725c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
726c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
727c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void TearDown() {
728c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
729c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                EGL_NO_CONTEXT);
730c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
731c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
732c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            if (mEglSurfaces[i] != EGL_NO_SURFACE) {
733c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
734c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            }
735c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
736c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
737c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglContext != EGL_NO_CONTEXT) {
738c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglDestroyContext(mEglDisplay, mEglContext);
739c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
740c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
741c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglDisplay != EGL_NO_DISPLAY) {
742c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglTerminate(mEglDisplay);
743c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
744c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
745c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
746c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLDisplay mEglDisplay;
747c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
748c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLContext mEglContext;
749c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis};
750c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
751c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// XXX: This test is disabled because it causes a hang on some devices.  See bug
752c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// 5015672.
753c8251a06df70de70d45ac477af816dcee7580205Jamie GennisTEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
754c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    for (int iter = 0; iter < 8; iter++) {
755c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
756c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
757c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    mEglContext);
758c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            glClear(GL_COLOR_BUFFER_BIT);
759c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
760c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
761c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
762c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis}
763c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
76452226048095c2eb27ede0c3389626df270a0abffJamie Gennis} // namespace android
765