SurfaceTextureClient_test.cpp revision 8b69defa2fe2cf6a34b00e322a557d8a4dddea41
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
175c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis#include <EGL/egl.h>
18134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <gtest/gtest.h>
195c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis#include <gui/SurfaceTextureClient.h>
207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian#include <utils/threads.h>
21134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
22134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android {
23134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
24134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTextureClientTest : public ::testing::Test {
25134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected:
267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    SurfaceTextureClientTest():
277a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglDisplay(EGL_NO_DISPLAY),
287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglSurface(EGL_NO_SURFACE),
297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mEglContext(EGL_NO_CONTEXT) {
307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
32134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void SetUp() {
33134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST = new SurfaceTexture(123);
34134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC = new SurfaceTextureClient(mST);
358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW = mSTC;
367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // We need a valid GL context so we can test updateTexImage()
387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // This initializes EGL and create a dummy GL context with a
397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // pbuffer render target.
407a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
417a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint majorVersion, minorVersion;
457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLConfig myConfig;
497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint numConfigs = 0;
507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian                &myConfig, 1, &numConfigs));
527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint pbufferAttribs[] = {
557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_WIDTH, 16,
567a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_HEIGHT, 16,
577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE };
587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST.clear();
72134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC.clear();
738b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        mANW.clear();
748b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroyContext(mEglDisplay, mEglContext);
777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroySurface(mEglDisplay, mEglSurface);
787a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglTerminate(mEglDisplay);
797a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    virtual EGLint const* getConfigAttribs() {
827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        static EGLint sDefaultConfigAttribs[] = {
837a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE
857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        };
867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        return sDefaultConfigAttribs;
88134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
89134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
90134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceTexture> mST;
91134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceTextureClient> mSTC;
928b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    sp<ANativeWindow> mANW;
938b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis
947a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLDisplay mEglDisplay;
957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLSurface mEglSurface;
967a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLContext mEglContext;
97134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
98134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
99bae774eb20bebd409441b93386b51bccda75f546Jamie GennisTEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
100bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    sp<ISurfaceTexture> ist(mSTC->getISurfaceTexture());
101bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    ASSERT_TRUE(ist != NULL);
102bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
103bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
104134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
105134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
1068b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
107134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
108134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
109134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(0, result);
110134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
111134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
112391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
113391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
1148b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
115391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
116391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT, result);
117391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
118391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
1195c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie GennisTEST_F(SurfaceTextureClientTest, ANativeWindowLockFails) {
1205c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ANativeWindow_Buffer buf;
1218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(BAD_VALUE, ANativeWindow_lock(mANW.get(), &buf, NULL));
1225c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis}
1235c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1241b528fb9d818044973abf656c9d2d3c1192bcfdcJamie GennisTEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
1255c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1265c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1275c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_NE(EGL_NO_DISPLAY, dpy);
1285c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1295c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint majorVersion;
1305c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint minorVersion;
1315c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
1325c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1335c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1345c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLConfig myConfig = {0};
1355c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint numConfigs = 0;
1365c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLint configAttribs[] = {
1375c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1385c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1395c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_RED_SIZE, 8,
1405c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_GREEN_SIZE, 8,
1415c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_BLUE_SIZE, 8,
1425c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_ALPHA_SIZE, 8,
1435c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_DEPTH_SIZE, 16,
1445c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_STENCIL_SIZE, 8,
1455c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis        EGL_NONE };
1465c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
1475c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            &numConfigs));
1485c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(EGL_SUCCESS, eglGetError());
1495c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1508b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
1515c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis            NULL);
152eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_NE(EGL_NO_SURFACE, eglSurface);
153eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    EXPECT_EQ(EGL_SUCCESS, eglGetError());
1545c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1555c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    eglTerminate(dpy);
1565c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis}
1575c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
158a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
1598b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1,  0,  0));
1608b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0, -1,  0));
1618b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  0, -1));
1628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(), -1, -1,  0));
1638b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  0,  8,  0));
1648b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_GT(OK, native_window_set_buffers_geometry(mANW.get(),  8,  0,  0));
165a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
166a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
167a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
168697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
1698b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
170a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
171a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
172a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
1738b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
174a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
175a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
176a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
177697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
1788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, PIXEL_FORMAT_RGB_565));
1798b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
180a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
181a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
182a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
1838b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
184a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
185a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
186a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
187697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
1888b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
1898b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
190a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
191a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
192a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
1938b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
194a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
195a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
196a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
197697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
1988b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
1998b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
200a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
201a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
202a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2038b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
204a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
205a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
206a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
207697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
2098b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
210a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
211a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
212a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2138b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
2148b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, 0));
2158b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
216a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
217a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
218a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2198b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
220a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
221a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
222a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
223697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
2248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 0, 0, PIXEL_FORMAT_RGB_565));
2258b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
226a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
227a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
228a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
2298b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
2308b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 16, 8, 0));
2318b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
232a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
233a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
234a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
2358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
236a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
237a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
238a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
239a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<SurfaceTexture> st(mST);
240697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
241a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
2428b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
243a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
244a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
245a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
2468b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf));
247a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
248a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
249a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
250697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2518b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
2528b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2538b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
254a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
2558b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
2568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
2578b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
2588b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2598b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
260a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
261a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
262a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
263a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
264a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
2658b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
2668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
267a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
268a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
269a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
270697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2718b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
2728b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
2738b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2748b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
275a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
276a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
277a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
278a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
279a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
2808b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
2818b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
2828b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 12, 24, 0));
2838b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
2848b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
285a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
286a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[0]->width);
287a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[1]->width);
288a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[0]->height);
289a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[1]->height);
2908b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
2918b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1]));
292a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
293a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
2947a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
2957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
2968b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(false));
2978b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
2987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
2998b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3008b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3018b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3028b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3048b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3058b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3098b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3108b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3138b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3148b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
3187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3198b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3208b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
3247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
3278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3288b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3298b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
3308b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3318b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3328b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3338b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3348b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
3397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3408b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3418b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
3428b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3438b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3448b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
3457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
3488b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3498b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3508b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3518b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3528b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3538b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3548b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
3558b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3568b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
3607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3618b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3648b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3658b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3678b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
3687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3698b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3718b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3728b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3738b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
3747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3758b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
3767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3778b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
3788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3798b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
3807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3828cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// XXX: We currently have no hardware that properly handles dequeuing the
3838cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// buffer that is currently bound to the texture.
3848cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
3857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* firstBuf;
3878b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
3888b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
3898b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &firstBuf));
3908b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf));
3918b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
3928b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
3938b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
3948b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
3958b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
3968b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
3978b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
3988b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
3997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
4007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
4017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
4027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(firstBuf, buf[2]);
4037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4047a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4057a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
4067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4078b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
4088b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
409c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4108b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    // We should be able to dequeue all the buffers before we've queued mANWy.
4118b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
4128b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
4138b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
4147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4158b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2]));
4168b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
4177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4188b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mST->updateTexImage());
4198b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
4207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4218b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
4227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
423c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // Once we've queued a buffer, however we should not be able to dequeue more
424c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
4258b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    EXPECT_EQ(-EBUSY, mANW->dequeueBuffer(mANW.get(), &buf[1]));
426c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0]));
4288b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2]));
4297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4318dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// XXX: This is not expected to pass until the synchronization hacks are removed
4328dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// from the SurfaceTexture class.
4338dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
4347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    class MyThread : public Thread {
4358b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        sp<SurfaceTexture> mST;
4367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLContext ctx;
4377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLSurface sur;
4387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLDisplay dpy;
4397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        bool mBufferRetired;
4407a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        Mutex mLock;
4417a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        virtual bool threadLoop() {
4427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
4437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            usleep(20000);
4447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
4458b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            mST->updateTexImage();
4467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mBufferRetired = true;
4477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            return false;
4497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    public:
4518b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis        MyThread(const sp<SurfaceTexture>& mST)
4528b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis            : mST(mST), mBufferRetired(false) {
4537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            ctx = eglGetCurrentContext();
4547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            sur = eglGetCurrentSurface(EGL_DRAW);
4557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            dpy = eglGetCurrentDisplay();
4567a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ~MyThread() {
4597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
4607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        void bufferDequeued() {
4627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
4637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EXPECT_EQ(true, mBufferRetired);
4647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    };
4667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4688b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->setSynchronousMode(true));
4698b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
4707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    // dequeue/queue/update so we have a current buffer
4718b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
4728b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
4738b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->updateTexImage();
4747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4758b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    MyThread* thread = new MyThread(mST);
4767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<Thread> threadBase(thread);
4777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4788b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
4798b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
480e122079be632b849a71181d83a6d38b701f642f5Mathias Agopian    thread->run();
4818b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[1]));
4828b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1]));
4838b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    //ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[2]));
4848b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2]));
4857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->bufferDequeued();
4867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->requestExitAndWait();
4877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
48952226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
49052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
49152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
4928b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
4938b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
4948b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
4958b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
4968b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
49752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
49852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
49952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
50052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
50152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
50252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
50352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
50452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
50552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
50652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
50752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
50852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
50952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
51052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
51152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
51252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
51352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
51452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
51552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
51652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
51752226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
51852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
51952226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
52052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
52152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
5228b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
5238b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
5248b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
5258b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5268b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
5278b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
52852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
52952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
53052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
53152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
53252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
53352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
53452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
53552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
53652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
53752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
53852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
53952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
54052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
54152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
54252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
54352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
54452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
54552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
54652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
54752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
54852226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
54952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
55052226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
55152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
55252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
55352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_rect_t crop;
55452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.left = 0;
55552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.top = 0;
55652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.right = 5;
55752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.bottom = 5;
55852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
5598b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
5608b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_geometry(mANW.get(), 8, 8, 0));
5618b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf[0]));
5628b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
5638b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0]));
5648b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, mST->updateTexImage());
5658b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
5668b69defa2fe2cf6a34b00e322a557d8a4dddea41Jamie Gennis    mST->getTransformMatrix(mtx);
56752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
56852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // This accounts for the 1 texel shrink for each edge that's included in the
56952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // transform matrix to avoid texturing outside the crop region.
57052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(.5f, mtx[0]);
57152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
57252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
57352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
57452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
57652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-.5f, mtx[5]);
57752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
57852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
57952226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
58152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
58252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
58352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
58452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
58652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(.5f, mtx[13]);
58752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
58852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
589134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
59052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
591a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// This test verifies that the buffer format can be queried immediately after
592a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis// it is set.
593a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_QueryFormatAfterSettingWorks) {
594a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    sp<ANativeWindow> anw(mSTC);
595a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    int fmts[] = {
596a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        // RGBA_8888 should not come first, as it's the default
597a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBX_8888,
598a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_8888,
599a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_888,
600a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGB_565,
601a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_BGRA_8888,
602a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_5551,
603a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_RGBA_4444,
604a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis        HAL_PIXEL_FORMAT_YV12,
605a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    };
606a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
607a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
608a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    for (int i = 0; i < numFmts; i++) {
609a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      int fmt = -1;
610a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, fmts[i]));
611a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
612a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis      EXPECT_EQ(fmts[i], fmt);
613a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis    }
614a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis}
615a6f35dd36e974c67976c6b4411c31b61f30a3853Jamie Gennis
61652226048095c2eb27ede0c3389626df270a0abffJamie Gennis} // namespace android
617