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