SurfaceTextureClient_test.cpp revision 52226048095c2eb27ede0c3389626df270a0abff
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);
357a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // We need a valid GL context so we can test updateTexImage()
377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // This initializes EGL and create a dummy GL context with a
387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        // pbuffer render target.
397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
407a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
417a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint majorVersion, minorVersion;
447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLConfig myConfig;
487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint numConfigs = 0;
497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian                &myConfig, 1, &numConfigs));
517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLint pbufferAttribs[] = {
547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_WIDTH, 16,
557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_HEIGHT, 16,
567a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE };
577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ASSERT_EQ(EGL_SUCCESS, eglGetError());
67134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mST.clear();
71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSTC.clear();
727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroyContext(mEglDisplay, mEglContext);
747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglDestroySurface(mEglDisplay, mEglSurface);
757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        eglTerminate(mEglDisplay);
767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    }
777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
787a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    virtual EGLint const* getConfigAttribs() {
797a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        static EGLint sDefaultConfigAttribs[] = {
807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EGL_NONE
827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        };
837a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        return sDefaultConfigAttribs;
85134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
86134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
87134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceTexture> mST;
88134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceTextureClient> mSTC;
897a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLDisplay mEglDisplay;
907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLSurface mEglSurface;
917a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EGLContext mEglContext;
92134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
93134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
94bae774eb20bebd409441b93386b51bccda75f546Jamie GennisTEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
95bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    sp<ISurfaceTexture> ist(mSTC->getISurfaceTexture());
96bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    ASSERT_TRUE(ist != NULL);
97bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
98bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
99134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
100134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<ANativeWindow> anw(mSTC);
101134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
102134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
103134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
104134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
105134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(0, result);
106134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
107134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
108391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
109391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    sp<ANativeWindow> anw(mSTC);
110391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
111391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
112391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
113391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT, result);
114391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
115391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
1165c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie GennisTEST_F(SurfaceTextureClientTest, ANativeWindowLockFails) {
1175c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    sp<ANativeWindow> anw(mSTC);
1185c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ANativeWindow_Buffer buf;
1195c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    ASSERT_EQ(BAD_VALUE, ANativeWindow_lock(anw.get(), &buf, NULL));
1205c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis}
1215c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
1221b528fb9d818044973abf656c9d2d3c1192bcfdcJamie GennisTEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
1235c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    sp<ANativeWindow> anw(mSTC);
1245c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis
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
1505c0c93a8c49b4053744efb8953b915fa7f0923a5Jamie Gennis    EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, anw.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) {
159a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
160a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
161a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_GT(OK, native_window_set_buffers_geometry(anw.get(), -1,  0,  0));
162a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_GT(OK, native_window_set_buffers_geometry(anw.get(),  0, -1,  0));
163a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_GT(OK, native_window_set_buffers_geometry(anw.get(),  0,  0, -1));
164a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_GT(OK, native_window_set_buffers_geometry(anw.get(), -1, -1,  0));
165a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_GT(OK, native_window_set_buffers_geometry(anw.get(),  0,  8,  0));
166a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_GT(OK, native_window_set_buffers_geometry(anw.get(),  8,  0,  0));
167a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
168a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
169a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
170a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
171697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
172a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
173a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
174a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
175a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
176a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
177a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
178a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
179a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
180a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
181697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
182a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 16, 8, PIXEL_FORMAT_RGB_565));
183a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
184a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
185a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
186a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
187a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
188a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
189a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
190a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
191a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
192697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
193a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, PIXEL_FORMAT_RGB_565));
194a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
195a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
196a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
197a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
198a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
199a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
200a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
201a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
202a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
203697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
204a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 16, 8, 0));
205a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
206a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
207a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
208a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
209a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
210a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
211a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
212a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
213a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
214697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
215a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 16, 8, 0));
216a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
217a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
218a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
219a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
220a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
221a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, 0));
222a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
223a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
224a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
225a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
226a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
227a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
228a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
229a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
230a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
231697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
232a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 0, 0, PIXEL_FORMAT_RGB_565));
233a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
234a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->width);
235a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(1, buf->height);
236a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
237a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
238a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 16, 8, 0));
239a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
240a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
241a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
242a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
243a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
244a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
245a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
246a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
247a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
248a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<SurfaceTexture> st(mST);
249697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf;
250a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
251a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf));
252a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf->width);
253a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf->height);
254a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
255a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf));
256a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
257a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
258a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
259a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
260a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<SurfaceTexture> st(mST);
261697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2628072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
263a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
264a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
265a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
266a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[0]));
267a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[1]));
268a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
269a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
270a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
271a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
272a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
273a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
274a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
275a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
276a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[0]));
277a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[1]));
278a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
279a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
280a5c75c01620179ce00812354778a29a80d76e71fMathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
281a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<ANativeWindow> anw(mSTC);
282a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    sp<SurfaceTexture> st(mST);
283697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf[2];
2848072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
285a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
286a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
287a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
288a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
289a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[0]->width);
290a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(16, buf[1]->width);
291a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[0]->height);
292a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(8, buf[1]->height);
293a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[0]));
294a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[1]));
295a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 12, 24, 0));
296a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
297a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
298a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_NE(buf[0], buf[1]);
299a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[0]->width);
300a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(12, buf[1]->width);
301a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[0]->height);
302a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    EXPECT_EQ(24, buf[1]->height);
303a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[0]));
304a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[1]));
305a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian}
306a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian
3077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
3087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<ANativeWindow> anw(mSTC);
3097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<SurfaceTexture> st(mST);
3107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(false));
3128072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
3137a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
3157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
3167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3197a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(true));
3208072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 3));
3217a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
3237a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
3247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
3257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
3267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3277a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3327a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
3337a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<ANativeWindow> anw(mSTC);
3347a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<SurfaceTexture> st(mST);
3357a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(true));
3377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
3387a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
3397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
3407a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
3417a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
3447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
3457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
3467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[2]));
3477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3487a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[0]);
3497a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3507a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[1]);
3517a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[2]);
3537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
3567a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<ANativeWindow> anw(mSTC);
3577a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<SurfaceTexture> st(mST);
3587a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(true));
3607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
3617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
3627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
3637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
3647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
3677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
3687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[0]);
3707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
3717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[1]);
3737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[2]));
3747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[2]);
3767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
3777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3787a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
3797a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<ANativeWindow> anw(mSTC);
3807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<SurfaceTexture> st(mST);
3817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
3827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(true));
3837a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 3));
3847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
3867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
3877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[0]);
3897a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
3917a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
3927a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
3937a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
3947a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[1]);
3957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
3967a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
3977a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
3987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[2]));
3997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
4007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[2]);
4017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4038cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// XXX: We currently have no hardware that properly handles dequeuing the
4048cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis// buffer that is currently bound to the texture.
4058cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
4067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<ANativeWindow> anw(mSTC);
4077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<SurfaceTexture> st(mST);
4087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* firstBuf;
4107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(true));
4117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 3));
4127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &firstBuf));
4137a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), firstBuf));
4147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
4157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), firstBuf);
4167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
4177a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
4187a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
4197a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
4207a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
4217a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[2]));
4227a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[0], buf[1]);
4237a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[1], buf[2]);
4247a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_NE(buf[2], buf[0]);
4257a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(firstBuf, buf[2]);
4267a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4277a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4287a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias AgopianTEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
4297a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<ANativeWindow> anw(mSTC);
4307a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<SurfaceTexture> st(mST);
4317a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4327a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(true));
4337a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 3));
434c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
435c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // We should be able to dequeue all the buffers before we've queued any.
4367a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
4377a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
438c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
4397a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
440c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[2]));
4417a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
4427a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4437a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, st->updateTexImage());
4447a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(st->getCurrentBuffer().get(), buf[1]);
4457a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4467a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
4477a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
448c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // Once we've queued a buffer, however we should not be able to dequeue more
449c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
450c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis    EXPECT_EQ(-EBUSY, anw->dequeueBuffer(anw.get(), &buf[1]));
451c2c8dfd71b84598f01074416e57cc3469d5b8ed2Jamie Gennis
4527a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[0]));
4537a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[2]));
4547a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
4557a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4568dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// XXX: This is not expected to pass until the synchronization hacks are removed
4578dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie Gennis// from the SurfaceTexture class.
4588dda6b7bf8f6e30cee286a6c048f1cc2adfa3a94Jamie GennisTEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
4597a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<ANativeWindow> anw(mSTC);
4607a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<SurfaceTexture> st(mST);
4617a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4627a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    class MyThread : public Thread {
4637a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        sp<SurfaceTexture> st;
4647a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLContext ctx;
4657a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLSurface sur;
4667a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        EGLDisplay dpy;
4677a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        bool mBufferRetired;
4687a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        Mutex mLock;
4697a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        virtual bool threadLoop() {
4707a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
4717a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            usleep(20000);
4727a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
4737a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            st->updateTexImage();
4747a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            mBufferRetired = true;
4757a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4767a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            return false;
4777a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4787a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    public:
4797a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        MyThread(const sp<SurfaceTexture>& st)
4807a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            : st(st), mBufferRetired(false) {
4817a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            ctx = eglGetCurrentContext();
4827a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            sur = eglGetCurrentSurface(EGL_DRAW);
4837a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            dpy = eglGetCurrentDisplay();
4847a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4857a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4867a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        ~MyThread() {
4877a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            eglMakeCurrent(dpy, sur, sur, ctx);
4887a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4897a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        void bufferDequeued() {
4907a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            Mutex::Autolock _l(mLock);
4917a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian            EXPECT_EQ(true, mBufferRetired);
4927a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian        }
4937a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    };
4947a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
4957a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    android_native_buffer_t* buf[3];
4967a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, st->setSynchronousMode(true));
4978072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 3));
4987a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    // dequeue/queue/update so we have a current buffer
4997a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
5007a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
5017a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    st->updateTexImage();
5027a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5037a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    MyThread* thread = new MyThread(st);
5047a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    sp<Thread> threadBase(thread);
5057a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
5067a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
5077a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
5087a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
5097a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
5107a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->run();
5117a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
5127a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[2]));
5137a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->bufferDequeued();
5147a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian    thread->requestExitAndWait();
5157a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian}
5167a5b22c4e33928f81c2e8a3d85050c35bd44b1e0Mathias Agopian
51752226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
51852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    sp<ANativeWindow> anw(mSTC);
51952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    sp<SurfaceTexture> st(mST);
52052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
52152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
52252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
52352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
52452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
52552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, st->updateTexImage());
52652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    st->getTransformMatrix(mtx);
52752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
52852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
52952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
53052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
53152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
53252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
53352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
53452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
53552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
53652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
53752226048095c2eb27ede0c3389626df270a0abffJamie Gennis
53852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
53952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
54052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
54152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
54252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
54352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
54452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
54552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
54652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
54752226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
54852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
54952226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
55052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    sp<ANativeWindow> anw(mSTC);
55152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    sp<SurfaceTexture> st(mST);
55252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
55352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
55452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
55552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
55652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
55752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, st->updateTexImage());
55852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 6)); // frees buffers
55952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    st->getTransformMatrix(mtx);
56052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
56152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[0]);
56252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
56352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
56452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
56552226048095c2eb27ede0c3389626df270a0abffJamie Gennis
56652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
56752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-1.f, mtx[5]);
56852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
56952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
57052226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
57252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
57352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
57452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
57552226048095c2eb27ede0c3389626df270a0abffJamie Gennis
57652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
57752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[13]);
57852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
57952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
58052226048095c2eb27ede0c3389626df270a0abffJamie Gennis}
58152226048095c2eb27ede0c3389626df270a0abffJamie Gennis
58252226048095c2eb27ede0c3389626df270a0abffJamie GennisTEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
58352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    sp<ANativeWindow> anw(mSTC);
58452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    sp<SurfaceTexture> st(mST);
58552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_buffer_t* buf[3];
58652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    float mtx[16] = {};
58752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    android_native_rect_t crop;
58852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.left = 0;
58952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.top = 0;
59052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.right = 5;
59152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    crop.bottom = 5;
59252226048095c2eb27ede0c3389626df270a0abffJamie Gennis
59352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 4));
59452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, native_window_set_buffers_geometry(anw.get(), 8, 8, 0));
59552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
59652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, native_window_set_crop(anw.get(), &crop));
59752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[0]));
59852226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, st->updateTexImage());
59952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 6)); // frees buffers
60052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    st->getTransformMatrix(mtx);
60152226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // This accounts for the 1 texel shrink for each edge that's included in the
60352226048095c2eb27ede0c3389626df270a0abffJamie Gennis    // transform matrix to avoid texturing outside the crop region.
60452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(.5f, mtx[0]);
60552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[1]);
60652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[2]);
60752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[3]);
60852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
60952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[4]);
61052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(-.5f, mtx[5]);
61152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[6]);
61252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[7]);
61352226048095c2eb27ede0c3389626df270a0abffJamie Gennis
61452226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[8]);
61552226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[9]);
61652226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[10]);
61752226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[11]);
61852226048095c2eb27ede0c3389626df270a0abffJamie Gennis
61952226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[12]);
62052226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(.5f, mtx[13]);
62152226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(0.f, mtx[14]);
62252226048095c2eb27ede0c3389626df270a0abffJamie Gennis    EXPECT_EQ(1.f, mtx[15]);
623134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
62452226048095c2eb27ede0c3389626df270a0abffJamie Gennis
62552226048095c2eb27ede0c3389626df270a0abffJamie Gennis} // namespace android
626