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