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>
26a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
27d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis#include <system/graphics.h>
28fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis#include <utils/Log.h>
29fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis#include <utils/Thread.h>
30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
3100b15b8f223976d016e16536e4720771ef634695Jiyong Parkextern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
3204b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine#define CROP_EXT_STR "EGL_ANDROID_image_crop"
3304b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine
34134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android {
35134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
36134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTextureClientTest : public ::testing::Test {
37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected:
387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    SurfaceTextureClientTest():
397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglDisplay(EGL_NO_DISPLAY),
407a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglSurface(EGL_NO_SURFACE),
4153390e1e8c33ebee5bb8100e846f5263ba05ff73Pablo Ceballos            mEglContext(EGL_NO_CONTEXT),
4253390e1e8c33ebee5bb8100e846f5263ba05ff73Pablo Ceballos            mEglConfig(NULL) {
437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
45134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void SetUp() {
46fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        const ::testing::TestInfo* const testInfo =
47fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
48fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
49fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis                testInfo->name());
50fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
515603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        sp<IGraphicBufferProducer> producer;
525603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        sp<IGraphicBufferConsumer> consumer;
535603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
54e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza        mST = new GLConsumer(consumer, 123, GLConsumer::TEXTURE_EXTERNAL, true,
55e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza                false);
565603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        mSTC = new Surface(producer);
578b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW = mSTC;
587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // We need a valid GL context so we can test updateTexImage()
607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // This initializes EGL and create a dummy GL context with a
617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // pbuffer render target.
627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint majorVersion, minorVersion;
677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLConfig myConfig;
717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint numConfigs = 0;
727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian                &myConfig, 1, &numConfigs));
747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
76993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian        mEglConfig = myConfig;
777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint pbufferAttribs[] = {
787a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_WIDTH, 16,
797a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_HEIGHT, 16,
807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE };
817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
837a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
897a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
91134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
92134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
93134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
94134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST.clear();
95134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC.clear();
968b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW.clear();
978b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroyContext(mEglDisplay, mEglContext);
1007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroySurface(mEglDisplay, mEglSurface);
1017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglTerminate(mEglDisplay);
102fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
103fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        const ::testing::TestInfo* const testInfo =
104fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
105fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
106fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis                testInfo->name());
1077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
1087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
1097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    virtual EGLint const* getConfigAttribs() {
1107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        static EGLint sDefaultConfigAttribs[] = {
111993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
1127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE
1137a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        };
1147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
1157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        return sDefaultConfigAttribs;
116134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
117134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
1182adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    sp<GLConsumer> mST;
119e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<Surface> mSTC;
1208b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    sp<ANativeWindow> mANW;
1218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
1227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLDisplay mEglDisplay;
1237a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLSurface mEglSurface;
1247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLContext mEglContext;
125993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLConfig  mEglConfig;
126134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
127134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
128bae774eb20bebd409441b93386b51bccda75f546Jamie GennisTEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
129cf0b8c85fb0106751256dba7821f86b5ad03126cMathias Agopian    sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
130bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    ASSERT_TRUE(ist != NULL);
131bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
132bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
133134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
1358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
136134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
137134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
138134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(0, result);
139134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
140134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
141391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
142391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
1438b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
144391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
145e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
146391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
147391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
1481b528fb9d818044973abf656c9d2d3c1192bcfdcJamie GennisTEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
1495c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1505c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1515c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_NE(EGL_NO_DISPLAY, dpy);
1525c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1535c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint majorVersion;
1545c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint minorVersion;
1555c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
1565c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1575c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1585c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLConfig myConfig = {0};
1595c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint numConfigs = 0;
1605c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint configAttribs[] = {
1615c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1625c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1635c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RED_SIZE, 8,
1645c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_GREEN_SIZE, 8,
1655c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_BLUE_SIZE, 8,
1665c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_ALPHA_SIZE, 8,
1675c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_DEPTH_SIZE, 16,
1685c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_STENCIL_SIZE, 8,
1695c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_NONE };
1705c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
1715c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            &numConfigs));
1725c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1735c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1748b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
1755c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            NULL);
176eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
177eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
1785c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
179fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    if (eglSurface != EGL_NO_SURFACE) {
180fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis        eglDestroySurface(dpy, eglSurface);
181fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis    }
182fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis
1835c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    eglTerminate(dpy);
1845c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis}
1855c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
186993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias AgopianTEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
187993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
188993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), NULL);
189993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
190993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
191993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
192993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
193ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_TRUE(success);
194993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
195993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    glClear(GL_COLOR_BUFFER_BIT);
196993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglSwapBuffers(mEglDisplay, eglSurface);
197ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_TRUE(success);
198993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
199993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    mST->abandon();
200993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
201993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    glClear(GL_COLOR_BUFFER_BIT);
202993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglSwapBuffers(mEglDisplay, eglSurface);
203ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    EXPECT_FALSE(success);
204993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
205993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
206993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
207ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    ASSERT_TRUE(success);
208993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
209993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    if (eglSurface != EGL_NO_SURFACE) {
210993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian        eglDestroySurface(mEglDisplay, eglSurface);
211993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian    }
212993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian}
213993e14fe1085e78b5f5d8b759dd3c757b4327eb4Mathias Agopian
214a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
215f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(),  0,  8));
216f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(),  8,  0));
217a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
218a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
219a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
220583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
221697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
222d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
223a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
224a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
225a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
226d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
227a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
228a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
229a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
230583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
231697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
232f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
233f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
234d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
235a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
236a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
237a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
238d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
239a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
240a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
241a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
242583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
243697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
244f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
245f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
246d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
247a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
248a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
249a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
250d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
251a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
252a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
253a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
254583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
255697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
256f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
257f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
258d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
259a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
260a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
261a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
262d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
263a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
264a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
265a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
266583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
267697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
268f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
269f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
270d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
271a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
272a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
273a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
274d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
275f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
276f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
277d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
278a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
279a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
280a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
281d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
282a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
283a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
284a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
285583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
286697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
287f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
288f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
289d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
290a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
291a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
292a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
293d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
2944697528eac85d34b2b375ece1d4b40aebe3fa5ddJamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
295d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
296a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
297a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
298a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
299d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
300a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
301a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
302a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
303583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
3042adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    sp<GLConsumer> st(mST);
305697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
306a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
307d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
308a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
309a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
310a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
311d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
312a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
313a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
314a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
315697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
316583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
3178b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
318d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
319d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
320a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
321d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
322d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
3238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
324d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
325d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
326a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
327a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
328a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
329a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
330a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
331d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
332d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
333a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
334a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
335a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
336697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
337583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
3388b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3398b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
340d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
341d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
342a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
343a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
344a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
345a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
346a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
347d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
348d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
349f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 12, 24));
350f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
351d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
352d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
353a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
354a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[0]->width);
355a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[1]->width);
356a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[0]->height);
357a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[1]->height);
358d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
359d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
360a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
361a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
3627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
3637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
364583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
365595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 0));
3668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
368d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
369d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
3708b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3718b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
373595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 1));
3748b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
376d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
377d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
378d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
379d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
3807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3818b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3828b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3838b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
3877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
388583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
3898b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
390d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
391d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
392d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
3937a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3947a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
396d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
397d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -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[0]);
4018b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4028b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4038b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4048b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
4057a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
4087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
409583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
4108b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
411d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
412d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
413d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
4157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
4167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
417d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
4188b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4198b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
420d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
4218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
423d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
4248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4258b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
4267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4277a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
4297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
430583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
4318b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
432d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
433d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
4348b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
4367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
437d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
4387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
439d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
4408b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4418b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
443d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
445d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
4468b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4478b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
4487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4508cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// XXX: We currently have no hardware that properly handles dequeuing the
4518cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// buffer that is currently bound to the texture.
4528cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
4537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* firstBuf;
455583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
4568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
457d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &firstBuf));
458d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf, -1));
4598b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4608b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
461d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
462d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
463d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
464d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
465d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
466d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
4677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
4687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
4697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
4707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(firstBuf, buf[2]);
4717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
4747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
475583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
4768b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
477c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    // We should be able to dequeue all the buffers before we've queued mANWy.
479d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
480d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
481d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
483d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
484d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
4857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4868b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
489d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
4907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
491c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // Once we've queued a buffer, however we should not be able to dequeue more
492c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
493f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    EXPECT_EQ(INVALID_OPERATION,
494f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza            native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
495c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
496d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
497d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
4987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
500d72f233ffa125856a44976a50a66ceb669f49ab2Jamie GennisTEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
501583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
502d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_rect_t rect = {-2, -13, 40, 18};
503d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    native_window_set_crop(mANW.get(), &rect);
504d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
505d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
506d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
507d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    android_native_buffer_t* buf;
508d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
509d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
510d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
511d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
512d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    Rect crop = mST->getCurrentCrop();
513d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.left);
514d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(0, crop.top);
515d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.right);
516d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis    EXPECT_EQ(4, crop.bottom);
517d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis}
518d72f233ffa125856a44976a50a66ceb669f49ab2Jamie Gennis
5198dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// XXX: This is not expected to pass until the synchronization hacks are removed
5208dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// from the SurfaceTexture class.
5218dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
5227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    class MyThread : public Thread {
5232adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        sp<GLConsumer> mST;
5247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLContext ctx;
5257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLSurface sur;
5267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLDisplay dpy;
5277a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        bool mBufferRetired;
5287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        Mutex mLock;
5297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        virtual bool threadLoop() {
5307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            usleep(20000);
5327a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5338b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            mST->updateTexImage();
5347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mBufferRetired = true;
5357a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            return false;
5377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    public:
539d9cdadb38229e84f83c56ff2fe195a6a6ef535c3Chih-Hung Hsieh        explicit MyThread(const sp<GLConsumer>& mST)
5408b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            : mST(mST), mBufferRetired(false) {
5417a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            ctx = eglGetCurrentContext();
5427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            sur = eglGetCurrentSurface(EGL_DRAW);
5437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            dpy = eglGetCurrentDisplay();
5447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
5457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ~MyThread() {
5477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
5487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        void bufferDequeued() {
5507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
5517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EXPECT_EQ(true, mBufferRetired);
5527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
5537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    };
5547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
556583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
5578b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
5587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    // dequeue/queue/update so we have a current buffer
559d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
560d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5618b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->updateTexImage();
5627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5638b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    MyThread* thread = new MyThread(mST);
5647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<Thread> threadBase(thread);
5657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
566d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
567d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
56883b1e685d252e589fa4a2e7e54c1f416aca63043Brian Carlstrom    thread->run("MyThread");
569d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
570d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
571d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
572d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
5737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->bufferDequeued();
5747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->requestExitAndWait();
5757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
5767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
57752226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
57852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
57952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
580583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
5818b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
582d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
583d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
5848b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5858b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
58652226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
58852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
58952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
59052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
59152226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
59352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
59452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
59552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
59652226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
59852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
59952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
60052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
60152226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
60352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
60452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
60552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
60652226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
60752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60852226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
60952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
61052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
611583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
6128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
613d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
614d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
6158b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
6168b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
6178b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
61852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
61952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
62052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
62152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
62252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
62352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
62452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
62552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
62652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
62752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
62852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
62952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
63052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
63152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
63252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
63352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
63452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
63552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
63652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
63752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
63852226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
63952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
64052226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
64104b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    // Query to see if the image crop extension exists
64204b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
64304b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    const char* exts = eglQueryStringImplementationANDROID(dpy, EGL_EXTENSIONS);
64404b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    size_t cropExtLen = strlen(CROP_EXT_STR);
64504b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    size_t extsLen = strlen(exts);
64604b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    bool equal = !strcmp(CROP_EXT_STR, exts);
64704b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    bool atStart = !strncmp(CROP_EXT_STR " ", exts, cropExtLen+1);
64804b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    bool atEnd = (cropExtLen+1) < extsLen &&
64904b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine            !strcmp(" " CROP_EXT_STR, exts + extsLen - (cropExtLen+1));
65004b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    bool inMiddle = strstr(exts, " " CROP_EXT_STR " ");
65104b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    bool hasEglAndroidImageCrop = equal || atStart || atEnd || inMiddle;
65204b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine
65352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
65452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
65552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_rect_t crop;
65652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.left = 0;
65752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.top = 0;
65852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.right = 5;
65952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.bottom = 5;
66052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
661583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
6628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
663f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 8));
664f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
665d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
6668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
667d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
6688b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
6698b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
6708b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
67152226048095c2eb27ede0c3389626df270a0abffJamie Gennis
67204b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    // If the egl image crop extension is not present, this accounts for the
67304b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    // .5 texel shrink for each edge that's included in the transform matrix
67404b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    // to avoid texturing outside the crop region. Otherwise the crop is not
67504b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    // included in the transform matrix.
67604b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    EXPECT_EQ(hasEglAndroidImageCrop ? 1 : 0.5, mtx[0]);
67752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
67852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
67952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
68052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
68152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
68204b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    EXPECT_EQ(hasEglAndroidImageCrop ? -1 : -0.5, mtx[5]);
68352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
68452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
68552226048095c2eb27ede0c3389626df270a0abffJamie Gennis
68652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
68752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
68852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
68952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
69052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
69104b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    EXPECT_EQ(hasEglAndroidImageCrop ? 0 : 0.0625f, mtx[12]);
69204b00cea67b406c4a971b24b9f91e95c754813edMichael Lentine    EXPECT_EQ(hasEglAndroidImageCrop ? 1 : 0.5625f, mtx[13]);
69352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
69452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
695134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
69652226048095c2eb27ede0c3389626df270a0abffJamie Gennis
697a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// This test verifies that the buffer format can be queried immediately after
698a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// it is set.
69907ed1a94bcad9b78b20f74f890d4271099da3a97Jamie GennisTEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
700a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    sp<ANativeWindow> anw(mSTC);
701a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    int fmts[] = {
702a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        // RGBA_8888 should not come first, as it's the default
703a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBX_8888,
704a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_8888,
705a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_888,
706a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_565,
707a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_BGRA_8888,
708a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_YV12,
709a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    };
710a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
711a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
712a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    for (int i = 0; i < numFmts; i++) {
713a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      int fmt = -1;
714f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza      ASSERT_EQ(OK, native_window_set_buffers_dimensions(anw.get(), 0, 0));
715f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza      ASSERT_EQ(OK, native_window_set_buffers_format(anw.get(), fmts[i]));
716a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
717a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      EXPECT_EQ(fmts[i], fmt);
718a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    }
719a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis}
720a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
721c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisclass MultiSurfaceTextureClientTest : public ::testing::Test {
722c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
723c8251a06df70de70d45ac477af816dcee7580205Jamie Gennispublic:
724c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    MultiSurfaceTextureClientTest() :
725c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglDisplay(EGL_NO_DISPLAY),
726c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglContext(EGL_NO_CONTEXT) {
727c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
728c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = EGL_NO_CONTEXT;
729c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
730c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
731c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
732c8251a06df70de70d45ac477af816dcee7580205Jamie Gennisprotected:
733c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
734c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    enum { NUM_SURFACE_TEXTURES = 32 };
735c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
736c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void SetUp() {
737c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
738c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
739c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
740c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
741c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint majorVersion, minorVersion;
742c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
743c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
744c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
745c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLConfig myConfig;
746c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint numConfigs = 0;
747c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EGLint configAttribs[] = {
748c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
749c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            EGL_NONE
750c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        };
751c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
752c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                &numConfigs));
753c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
754c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
755c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
756c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                0);
757c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_EQ(EGL_SUCCESS, eglGetError());
758c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
759c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
760c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
7615603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza            sp<IGraphicBufferProducer> producer;
7625603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza            sp<IGraphicBufferConsumer> consumer;
7635603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza            BufferQueue::createBufferQueue(&producer, &consumer);
764e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza            sp<GLConsumer> st(new GLConsumer(consumer, i,
765e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza                    GLConsumer::TEXTURE_EXTERNAL, true, false));
7665603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza            sp<Surface> stc(new Surface(producer));
767c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
768c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    static_cast<ANativeWindow*>(stc.get()), NULL);
769c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_EQ(EGL_SUCCESS, eglGetError());
770c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
771c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
772c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
773c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
774c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    virtual void TearDown() {
775c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
776c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                EGL_NO_CONTEXT);
777c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
778c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
779c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            if (mEglSurfaces[i] != EGL_NO_SURFACE) {
780c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
781c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            }
782c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
783c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
784c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglContext != EGL_NO_CONTEXT) {
785c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglDestroyContext(mEglDisplay, mEglContext);
786c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
787c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
788c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        if (mEglDisplay != EGL_NO_DISPLAY) {
789c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglTerminate(mEglDisplay);
790c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
791c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
792c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
793c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLDisplay mEglDisplay;
794c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
795c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    EGLContext mEglContext;
796c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis};
797c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
798c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// XXX: This test is disabled because it causes a hang on some devices.  See bug
799c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis// 5015672.
800c8251a06df70de70d45ac477af816dcee7580205Jamie GennisTEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
801c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    for (int iter = 0; iter < 8; iter++) {
802c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
803c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
804c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis                    mEglContext);
805c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            glClear(GL_COLOR_BUFFER_BIT);
806c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis            eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
807c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis        }
808c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis    }
809c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis}
810c8251a06df70de70d45ac477af816dcee7580205Jamie Gennis
81152226048095c2eb27ede0c3389626df270a0abffJamie Gennis} // namespace android
812