diff options
author | Jesse Hall <jessehall@google.com> | 2012-05-17 12:07:39 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-17 12:07:39 -0700 |
commit | 515f19da246a11c417c1771d4293e753f09e79b6 (patch) | |
tree | a1bb2c416e27035f7ee4bcbe8fada46a57909a37 | |
parent | 81f6da5228aeca22894b0277cd2050fccdb7cccb (diff) | |
parent | 90ed8508ed89b4fdb5c21d621b29369d31dcb958 (diff) | |
download | frameworks_native-515f19da246a11c417c1771d4293e753f09e79b6.zip frameworks_native-515f19da246a11c417c1771d4293e753f09e79b6.tar.gz frameworks_native-515f19da246a11c417c1771d4293e753f09e79b6.tar.bz2 |
Merge "Recreate EGLImage for previously used slots" into jb-dev
-rw-r--r-- | libs/gui/SurfaceTexture.cpp | 8 | ||||
-rw-r--r-- | libs/gui/tests/SurfaceTexture_test.cpp | 28 |
2 files changed, 33 insertions, 3 deletions
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index 1e58a21..feaf07a 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -228,14 +228,16 @@ status_t SurfaceTexture::updateTexImage() { mEGLSlots[buf].mGraphicBuffer = item.mGraphicBuffer; } - // Update the GL texture object. + // Update the GL texture object. We may have to do this even when + // item.mGraphicBuffer == NULL, if we destroyed the EGLImage when + // detaching from a context but the buffer has not been re-allocated. EGLImageKHR image = mEGLSlots[buf].mEglImage; if (image == EGL_NO_IMAGE_KHR) { - if (item.mGraphicBuffer == 0) { + if (mEGLSlots[buf].mGraphicBuffer == NULL) { ST_LOGE("updateTexImage: buffer at slot %d is null", buf); return BAD_VALUE; } - image = createImage(dpy, item.mGraphicBuffer); + image = createImage(dpy, mEGLSlots[buf].mGraphicBuffer); mEGLSlots[buf].mEglImage = image; if (image == EGL_NO_IMAGE_KHR) { // NOTE: if dpy was invalid, createImage() is guaranteed to diff --git a/libs/gui/tests/SurfaceTexture_test.cpp b/libs/gui/tests/SurfaceTexture_test.cpp index d708f6d..078c17b 100644 --- a/libs/gui/tests/SurfaceTexture_test.cpp +++ b/libs/gui/tests/SurfaceTexture_test.cpp @@ -2577,4 +2577,32 @@ TEST_F(SurfaceTextureMultiContextGLTest, ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); } +TEST_F(SurfaceTextureMultiContextGLTest, + UpdateTexImageSucceedsForBufferConsumedBeforeDetach) { + ASSERT_EQ(NO_ERROR, mST->setSynchronousMode(true)); + ASSERT_EQ(NO_ERROR, mST->setBufferCountServer(2)); + + // produce two frames and consume them both on the primary context + ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); + mFW->waitForFrame(); + ASSERT_EQ(OK, mST->updateTexImage()); + + ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); + mFW->waitForFrame(); + ASSERT_EQ(OK, mST->updateTexImage()); + + // produce one more frame + ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); + + // Detach from the primary context and attach to the secondary context + ASSERT_EQ(OK, mST->detachFromContext()); + ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, + mSecondEglContext)); + ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); + + // Consume final frame on secondary context + mFW->waitForFrame(); + ASSERT_EQ(OK, mST->updateTexImage()); +} + } // namespace android |