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