Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "SurfaceTextureClient_test"
     18 //#define LOG_NDEBUG 0
     19 
     20 #include <EGL/egl.h>
     21 #include <GLES2/gl2.h>
     22 
     23 #include <gtest/gtest.h>
     24 #include <gui/GLConsumer.h>
     25 #include <gui/Surface.h>
     26 #include <system/graphics.h>
     27 #include <utils/Log.h>
     28 #include <utils/Thread.h>
     29 
     30 namespace android {
     31 
     32 class SurfaceTextureClientTest : public ::testing::Test {
     33 protected:
     34     SurfaceTextureClientTest():
     35             mEglDisplay(EGL_NO_DISPLAY),
     36             mEglSurface(EGL_NO_SURFACE),
     37             mEglContext(EGL_NO_CONTEXT) {
     38     }
     39 
     40     virtual void SetUp() {
     41         const ::testing::TestInfo* const testInfo =
     42             ::testing::UnitTest::GetInstance()->current_test_info();
     43         ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
     44                 testInfo->name());
     45 
     46         sp<BufferQueue> bq = new BufferQueue();
     47         mST = new GLConsumer(bq, 123);
     48         mSTC = new Surface(bq);
     49         mANW = mSTC;
     50 
     51         // We need a valid GL context so we can test updateTexImage()
     52         // This initializes EGL and create a dummy GL context with a
     53         // pbuffer render target.
     54         mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
     55         ASSERT_EQ(EGL_SUCCESS, eglGetError());
     56         ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
     57 
     58         EGLint majorVersion, minorVersion;
     59         EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
     60         ASSERT_EQ(EGL_SUCCESS, eglGetError());
     61 
     62         EGLConfig myConfig;
     63         EGLint numConfigs = 0;
     64         EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
     65                 &myConfig, 1, &numConfigs));
     66         ASSERT_EQ(EGL_SUCCESS, eglGetError());
     67 
     68         mEglConfig = myConfig;
     69         EGLint pbufferAttribs[] = {
     70             EGL_WIDTH, 16,
     71             EGL_HEIGHT, 16,
     72             EGL_NONE };
     73         mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
     74         ASSERT_EQ(EGL_SUCCESS, eglGetError());
     75         ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
     76 
     77         mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
     78         ASSERT_EQ(EGL_SUCCESS, eglGetError());
     79         ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
     80 
     81         EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
     82         ASSERT_EQ(EGL_SUCCESS, eglGetError());
     83     }
     84 
     85     virtual void TearDown() {
     86         mST.clear();
     87         mSTC.clear();
     88         mANW.clear();
     89 
     90         eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
     91         eglDestroyContext(mEglDisplay, mEglContext);
     92         eglDestroySurface(mEglDisplay, mEglSurface);
     93         eglTerminate(mEglDisplay);
     94 
     95         const ::testing::TestInfo* const testInfo =
     96             ::testing::UnitTest::GetInstance()->current_test_info();
     97         ALOGV("End test:   %s.%s", testInfo->test_case_name(),
     98                 testInfo->name());
     99     }
    100 
    101     virtual EGLint const* getConfigAttribs() {
    102         static EGLint sDefaultConfigAttribs[] = {
    103             EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
    104             EGL_NONE
    105         };
    106 
    107         return sDefaultConfigAttribs;
    108     }
    109 
    110     sp<GLConsumer> mST;
    111     sp<Surface> mSTC;
    112     sp<ANativeWindow> mANW;
    113 
    114     EGLDisplay mEglDisplay;
    115     EGLSurface mEglSurface;
    116     EGLContext mEglContext;
    117     EGLConfig  mEglConfig;
    118 };
    119 
    120 TEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
    121     sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
    122     ASSERT_TRUE(ist != NULL);
    123 }
    124 
    125 TEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
    126     int result = -123;
    127     int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
    128             &result);
    129     EXPECT_EQ(NO_ERROR, err);
    130     EXPECT_EQ(0, result);
    131 }
    132 
    133 TEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
    134     int result = -123;
    135     int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
    136     EXPECT_EQ(NO_ERROR, err);
    137     EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
    138 }
    139 
    140 TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
    141     EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    142     ASSERT_EQ(EGL_SUCCESS, eglGetError());
    143     ASSERT_NE(EGL_NO_DISPLAY, dpy);
    144 
    145     EGLint majorVersion;
    146     EGLint minorVersion;
    147     EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
    148     ASSERT_EQ(EGL_SUCCESS, eglGetError());
    149 
    150     EGLConfig myConfig = {0};
    151     EGLint numConfigs = 0;
    152     EGLint configAttribs[] = {
    153         EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    154         EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    155         EGL_RED_SIZE, 8,
    156         EGL_GREEN_SIZE, 8,
    157         EGL_BLUE_SIZE, 8,
    158         EGL_ALPHA_SIZE, 8,
    159         EGL_DEPTH_SIZE, 16,
    160         EGL_STENCIL_SIZE, 8,
    161         EGL_NONE };
    162     EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
    163             &numConfigs));
    164     ASSERT_EQ(EGL_SUCCESS, eglGetError());
    165 
    166     EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
    167             NULL);
    168     EXPECT_NE(EGL_NO_SURFACE, eglSurface);
    169     EXPECT_EQ(EGL_SUCCESS, eglGetError());
    170 
    171     if (eglSurface != EGL_NO_SURFACE) {
    172         eglDestroySurface(dpy, eglSurface);
    173     }
    174 
    175     eglTerminate(dpy);
    176 }
    177 
    178 TEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
    179 
    180     EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), NULL);
    181     EXPECT_NE(EGL_NO_SURFACE, eglSurface);
    182     EXPECT_EQ(EGL_SUCCESS, eglGetError());
    183 
    184     EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
    185     EXPECT_TRUE(success);
    186 
    187     glClear(GL_COLOR_BUFFER_BIT);
    188     success = eglSwapBuffers(mEglDisplay, eglSurface);
    189     EXPECT_TRUE(success);
    190 
    191     mST->abandon();
    192 
    193     glClear(GL_COLOR_BUFFER_BIT);
    194     success = eglSwapBuffers(mEglDisplay, eglSurface);
    195     EXPECT_FALSE(success);
    196     EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
    197 
    198     success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
    199     ASSERT_TRUE(success);
    200 
    201     if (eglSurface != EGL_NO_SURFACE) {
    202         eglDestroySurface(mEglDisplay, eglSurface);
    203     }
    204 }
    205 
    206 TEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
    207     EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1,  0,  0));
    208     EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0, -1,  0));
    209     EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  0, -1));
    210     EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1, -1,  0));
    211     EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  8,  0));
    212     EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  8,  0,  0));
    213 }
    214 
    215 TEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
    216     ANativeWindowBuffer* buf;
    217     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    218     EXPECT_EQ(1, buf->width);
    219     EXPECT_EQ(1, buf->height);
    220     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
    221     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    222 }
    223 
    224 TEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
    225     ANativeWindowBuffer* buf;
    226     EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, PIXEL_FORMAT_RGB_565));
    227     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    228     EXPECT_EQ(16, buf->width);
    229     EXPECT_EQ(8, buf->height);
    230     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
    231     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    232 }
    233 
    234 TEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
    235     ANativeWindowBuffer* buf;
    236     EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
    237     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    238     EXPECT_EQ(1, buf->width);
    239     EXPECT_EQ(1, buf->height);
    240     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
    241     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    242 }
    243 
    244 TEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
    245     ANativeWindowBuffer* buf;
    246     EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
    247     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    248     EXPECT_EQ(16, buf->width);
    249     EXPECT_EQ(8, buf->height);
    250     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
    251     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    252 }
    253 
    254 TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
    255     ANativeWindowBuffer* buf;
    256     EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
    257     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    258     EXPECT_EQ(16, buf->width);
    259     EXPECT_EQ(8, buf->height);
    260     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
    261     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    262     EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, 0));
    263     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    264     EXPECT_EQ(1, buf->width);
    265     EXPECT_EQ(1, buf->height);
    266     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
    267     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    268 }
    269 
    270 TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
    271     ANativeWindowBuffer* buf;
    272     EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
    273     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    274     EXPECT_EQ(1, buf->width);
    275     EXPECT_EQ(1, buf->height);
    276     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
    277     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    278     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
    279     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    280     EXPECT_EQ(16, buf->width);
    281     EXPECT_EQ(8, buf->height);
    282     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
    283     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    284 }
    285 
    286 TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
    287     sp<GLConsumer> st(mST);
    288     ANativeWindowBuffer* buf;
    289     EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
    290     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    291     EXPECT_EQ(16, buf->width);
    292     EXPECT_EQ(8, buf->height);
    293     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
    294     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
    295 }
    296 
    297 TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
    298     ANativeWindowBuffer* buf[2];
    299     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    300     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    301     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    302     EXPECT_NE(buf[0], buf[1]);
    303     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
    304     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
    305     EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
    306     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    307     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    308     EXPECT_NE(buf[0], buf[1]);
    309     EXPECT_EQ(16, buf[0]->width);
    310     EXPECT_EQ(16, buf[1]->width);
    311     EXPECT_EQ(8, buf[0]->height);
    312     EXPECT_EQ(8, buf[1]->height);
    313     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
    314     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
    315 }
    316 
    317 TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
    318     ANativeWindowBuffer* buf[2];
    319     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    320     EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
    321     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    322     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    323     EXPECT_NE(buf[0], buf[1]);
    324     EXPECT_EQ(16, buf[0]->width);
    325     EXPECT_EQ(16, buf[1]->width);
    326     EXPECT_EQ(8, buf[0]->height);
    327     EXPECT_EQ(8, buf[1]->height);
    328     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
    329     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
    330     EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 12, 24, 0));
    331     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    332     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    333     EXPECT_NE(buf[0], buf[1]);
    334     EXPECT_EQ(12, buf[0]->width);
    335     EXPECT_EQ(12, buf[1]->width);
    336     EXPECT_EQ(24, buf[0]->height);
    337     EXPECT_EQ(24, buf[1]->height);
    338     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
    339     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
    340 }
    341 
    342 TEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
    343     android_native_buffer_t* buf[3];
    344     ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 0));
    345     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    346 
    347     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    348     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    349     EXPECT_EQ(OK, mST->updateTexImage());
    350     EXPECT_EQ(OK, mST->updateTexImage());
    351 
    352     ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 1));
    353     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
    354 
    355     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    356     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    357     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    358     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
    359 
    360     EXPECT_EQ(OK, mST->updateTexImage());
    361     EXPECT_EQ(OK, mST->updateTexImage());
    362     EXPECT_EQ(OK, mST->updateTexImage());
    363 }
    364 
    365 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
    366     android_native_buffer_t* buf[3];
    367     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    368     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    369     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    370     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
    371     EXPECT_NE(buf[0], buf[1]);
    372     EXPECT_NE(buf[1], buf[2]);
    373     EXPECT_NE(buf[2], buf[0]);
    374     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    375     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
    376     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
    377     EXPECT_EQ(OK, mST->updateTexImage());
    378     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
    379     EXPECT_EQ(OK, mST->updateTexImage());
    380     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
    381     EXPECT_EQ(OK, mST->updateTexImage());
    382     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
    383 }
    384 
    385 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
    386     android_native_buffer_t* buf[3];
    387     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    388     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    389     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    390     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
    391     EXPECT_NE(buf[0], buf[1]);
    392     EXPECT_NE(buf[1], buf[2]);
    393     EXPECT_NE(buf[2], buf[0]);
    394     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    395     EXPECT_EQ(OK, mST->updateTexImage());
    396     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
    397     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
    398     EXPECT_EQ(OK, mST->updateTexImage());
    399     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
    400     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
    401     EXPECT_EQ(OK, mST->updateTexImage());
    402     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
    403 }
    404 
    405 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
    406     android_native_buffer_t* buf[3];
    407     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
    408 
    409     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    410     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    411     EXPECT_EQ(OK, mST->updateTexImage());
    412     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
    413 
    414     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    415     EXPECT_NE(buf[0], buf[1]);
    416     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
    417     EXPECT_EQ(OK, mST->updateTexImage());
    418     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
    419 
    420     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
    421     EXPECT_NE(buf[1], buf[2]);
    422     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
    423     EXPECT_EQ(OK, mST->updateTexImage());
    424     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
    425 }
    426 
    427 // XXX: We currently have no hardware that properly handles dequeuing the
    428 // buffer that is currently bound to the texture.
    429 TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
    430     android_native_buffer_t* buf[3];
    431     android_native_buffer_t* firstBuf;
    432     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
    433     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &firstBuf));
    434     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf, -1));
    435     EXPECT_EQ(OK, mST->updateTexImage());
    436     EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
    437     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    438     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    439     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    440     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
    441     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
    442     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
    443     EXPECT_NE(buf[0], buf[1]);
    444     EXPECT_NE(buf[1], buf[2]);
    445     EXPECT_NE(buf[2], buf[0]);
    446     EXPECT_EQ(firstBuf, buf[2]);
    447 }
    448 
    449 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
    450     android_native_buffer_t* buf[3];
    451     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
    452 
    453     // We should be able to dequeue all the buffers before we've queued mANWy.
    454     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    455     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    456     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
    457 
    458     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
    459     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
    460 
    461     EXPECT_EQ(OK, mST->updateTexImage());
    462     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
    463 
    464     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
    465 
    466     // Once we've queued a buffer, however we should not be able to dequeue more
    467     // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
    468     EXPECT_EQ(-EBUSY, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    469 
    470     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
    471     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
    472 }
    473 
    474 TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
    475     android_native_rect_t rect = {-2, -13, 40, 18};
    476     native_window_set_crop(mANW.get(), &rect);
    477 
    478     ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
    479 
    480     android_native_buffer_t* buf;
    481     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
    482     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
    483     ASSERT_EQ(OK, mST->updateTexImage());
    484 
    485     Rect crop = mST->getCurrentCrop();
    486     EXPECT_EQ(0, crop.left);
    487     EXPECT_EQ(0, crop.top);
    488     EXPECT_EQ(4, crop.right);
    489     EXPECT_EQ(4, crop.bottom);
    490 }
    491 
    492 // XXX: This is not expected to pass until the synchronization hacks are removed
    493 // from the SurfaceTexture class.
    494 TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
    495     class MyThread : public Thread {
    496         sp<GLConsumer> mST;
    497         EGLContext ctx;
    498         EGLSurface sur;
    499         EGLDisplay dpy;
    500         bool mBufferRetired;
    501         Mutex mLock;
    502         virtual bool threadLoop() {
    503             eglMakeCurrent(dpy, sur, sur, ctx);
    504             usleep(20000);
    505             Mutex::Autolock _l(mLock);
    506             mST->updateTexImage();
    507             mBufferRetired = true;
    508             eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    509             return false;
    510         }
    511     public:
    512         MyThread(const sp<GLConsumer>& mST)
    513             : mST(mST), mBufferRetired(false) {
    514             ctx = eglGetCurrentContext();
    515             sur = eglGetCurrentSurface(EGL_DRAW);
    516             dpy = eglGetCurrentDisplay();
    517             eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    518         }
    519         ~MyThread() {
    520             eglMakeCurrent(dpy, sur, sur, ctx);
    521         }
    522         void bufferDequeued() {
    523             Mutex::Autolock _l(mLock);
    524             EXPECT_EQ(true, mBufferRetired);
    525         }
    526     };
    527 
    528     android_native_buffer_t* buf[3];
    529     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
    530     // dequeue/queue/update so we have a current buffer
    531     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    532     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    533     mST->updateTexImage();
    534 
    535     MyThread* thread = new MyThread(mST);
    536     sp<Thread> threadBase(thread);
    537 
    538     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    539     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    540     thread->run();
    541     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
    542     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
    543     //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
    544     //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
    545     thread->bufferDequeued();
    546     thread->requestExitAndWait();
    547 }
    548 
    549 TEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
    550     android_native_buffer_t* buf[3];
    551     float mtx[16] = {};
    552     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    553     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    554     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    555     ASSERT_EQ(OK, mST->updateTexImage());
    556     mST->getTransformMatrix(mtx);
    557 
    558     EXPECT_EQ(1.f, mtx[0]);
    559     EXPECT_EQ(0.f, mtx[1]);
    560     EXPECT_EQ(0.f, mtx[2]);
    561     EXPECT_EQ(0.f, mtx[3]);
    562 
    563     EXPECT_EQ(0.f, mtx[4]);
    564     EXPECT_EQ(-1.f, mtx[5]);
    565     EXPECT_EQ(0.f, mtx[6]);
    566     EXPECT_EQ(0.f, mtx[7]);
    567 
    568     EXPECT_EQ(0.f, mtx[8]);
    569     EXPECT_EQ(0.f, mtx[9]);
    570     EXPECT_EQ(1.f, mtx[10]);
    571     EXPECT_EQ(0.f, mtx[11]);
    572 
    573     EXPECT_EQ(0.f, mtx[12]);
    574     EXPECT_EQ(1.f, mtx[13]);
    575     EXPECT_EQ(0.f, mtx[14]);
    576     EXPECT_EQ(1.f, mtx[15]);
    577 }
    578 
    579 TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
    580     android_native_buffer_t* buf[3];
    581     float mtx[16] = {};
    582     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    583     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    584     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    585     ASSERT_EQ(OK, mST->updateTexImage());
    586     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
    587     mST->getTransformMatrix(mtx);
    588 
    589     EXPECT_EQ(1.f, mtx[0]);
    590     EXPECT_EQ(0.f, mtx[1]);
    591     EXPECT_EQ(0.f, mtx[2]);
    592     EXPECT_EQ(0.f, mtx[3]);
    593 
    594     EXPECT_EQ(0.f, mtx[4]);
    595     EXPECT_EQ(-1.f, mtx[5]);
    596     EXPECT_EQ(0.f, mtx[6]);
    597     EXPECT_EQ(0.f, mtx[7]);
    598 
    599     EXPECT_EQ(0.f, mtx[8]);
    600     EXPECT_EQ(0.f, mtx[9]);
    601     EXPECT_EQ(1.f, mtx[10]);
    602     EXPECT_EQ(0.f, mtx[11]);
    603 
    604     EXPECT_EQ(0.f, mtx[12]);
    605     EXPECT_EQ(1.f, mtx[13]);
    606     EXPECT_EQ(0.f, mtx[14]);
    607     EXPECT_EQ(1.f, mtx[15]);
    608 }
    609 
    610 TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
    611     android_native_buffer_t* buf[3];
    612     float mtx[16] = {};
    613     android_native_rect_t crop;
    614     crop.left = 0;
    615     crop.top = 0;
    616     crop.right = 5;
    617     crop.bottom = 5;
    618 
    619     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
    620     ASSERT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 8, 8, 0));
    621     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
    622     ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
    623     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
    624     ASSERT_EQ(OK, mST->updateTexImage());
    625     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
    626     mST->getTransformMatrix(mtx);
    627 
    628     // This accounts for the .5 texel shrink for each edge that's included in the
    629     // transform matrix to avoid texturing outside the crop region.
    630     EXPECT_EQ(0.5, mtx[0]);
    631     EXPECT_EQ(0.f, mtx[1]);
    632     EXPECT_EQ(0.f, mtx[2]);
    633     EXPECT_EQ(0.f, mtx[3]);
    634 
    635     EXPECT_EQ(0.f, mtx[4]);
    636     EXPECT_EQ(-0.5, mtx[5]);
    637     EXPECT_EQ(0.f, mtx[6]);
    638     EXPECT_EQ(0.f, mtx[7]);
    639 
    640     EXPECT_EQ(0.f, mtx[8]);
    641     EXPECT_EQ(0.f, mtx[9]);
    642     EXPECT_EQ(1.f, mtx[10]);
    643     EXPECT_EQ(0.f, mtx[11]);
    644 
    645     EXPECT_EQ(0.0625f, mtx[12]);
    646     EXPECT_EQ(0.5625f, mtx[13]);
    647     EXPECT_EQ(0.f, mtx[14]);
    648     EXPECT_EQ(1.f, mtx[15]);
    649 }
    650 
    651 // This test verifies that the buffer format can be queried immediately after
    652 // it is set.
    653 TEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
    654     sp<ANativeWindow> anw(mSTC);
    655     int fmts[] = {
    656         // RGBA_8888 should not come first, as it's the default
    657         HAL_PIXEL_FORMAT_RGBX_8888,
    658         HAL_PIXEL_FORMAT_RGBA_8888,
    659         HAL_PIXEL_FORMAT_RGB_888,
    660         HAL_PIXEL_FORMAT_RGB_565,
    661         HAL_PIXEL_FORMAT_BGRA_8888,
    662         HAL_PIXEL_FORMAT_YV12,
    663     };
    664 
    665     const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
    666     for (int i = 0; i < numFmts; i++) {
    667       int fmt = -1;
    668       ASSERT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, fmts[i]));
    669       ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
    670       EXPECT_EQ(fmts[i], fmt);
    671     }
    672 }
    673 
    674 class MultiSurfaceTextureClientTest : public ::testing::Test {
    675 
    676 public:
    677     MultiSurfaceTextureClientTest() :
    678             mEglDisplay(EGL_NO_DISPLAY),
    679             mEglContext(EGL_NO_CONTEXT) {
    680         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
    681             mEglSurfaces[i] = EGL_NO_CONTEXT;
    682         }
    683     }
    684 
    685 protected:
    686 
    687     enum { NUM_SURFACE_TEXTURES = 32 };
    688 
    689     virtual void SetUp() {
    690         mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    691         ASSERT_EQ(EGL_SUCCESS, eglGetError());
    692         ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
    693 
    694         EGLint majorVersion, minorVersion;
    695         EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
    696         ASSERT_EQ(EGL_SUCCESS, eglGetError());
    697 
    698         EGLConfig myConfig;
    699         EGLint numConfigs = 0;
    700         EGLint configAttribs[] = {
    701             EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    702             EGL_NONE
    703         };
    704         EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
    705                 &numConfigs));
    706         ASSERT_EQ(EGL_SUCCESS, eglGetError());
    707 
    708         mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
    709                 0);
    710         ASSERT_EQ(EGL_SUCCESS, eglGetError());
    711         ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
    712 
    713         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
    714             sp<BufferQueue> bq = new BufferQueue();
    715             sp<GLConsumer> st(new GLConsumer(bq, i));
    716             sp<Surface> stc(new Surface(bq));
    717             mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
    718                     static_cast<ANativeWindow*>(stc.get()), NULL);
    719             ASSERT_EQ(EGL_SUCCESS, eglGetError());
    720             ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
    721         }
    722     }
    723 
    724     virtual void TearDown() {
    725         eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
    726                 EGL_NO_CONTEXT);
    727 
    728         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
    729             if (mEglSurfaces[i] != EGL_NO_SURFACE) {
    730                 eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
    731             }
    732         }
    733 
    734         if (mEglContext != EGL_NO_CONTEXT) {
    735             eglDestroyContext(mEglDisplay, mEglContext);
    736         }
    737 
    738         if (mEglDisplay != EGL_NO_DISPLAY) {
    739             eglTerminate(mEglDisplay);
    740         }
    741     }
    742 
    743     EGLDisplay mEglDisplay;
    744     EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
    745     EGLContext mEglContext;
    746 };
    747 
    748 // XXX: This test is disabled because it causes a hang on some devices.  See bug
    749 // 5015672.
    750 TEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
    751     for (int iter = 0; iter < 8; iter++) {
    752         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
    753             eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
    754                     mEglContext);
    755             glClear(GL_COLOR_BUFFER_BIT);
    756             eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
    757         }
    758     }
    759 }
    760 
    761 } // namespace android
    762