Merge "Recreate EGLImage for previously used slots" into jb-dev

This commit is contained in:
Jesse Hall 2012-05-17 12:07:39 -07:00 committed by Android (Google) Code Review
commit 515f19da24
2 changed files with 33 additions and 3 deletions

View File

@ -228,14 +228,16 @@ status_t SurfaceTexture::updateTexImage() {
mEGLSlots[buf].mGraphicBuffer = item.mGraphicBuffer; 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; EGLImageKHR image = mEGLSlots[buf].mEglImage;
if (image == EGL_NO_IMAGE_KHR) { 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); ST_LOGE("updateTexImage: buffer at slot %d is null", buf);
return BAD_VALUE; return BAD_VALUE;
} }
image = createImage(dpy, item.mGraphicBuffer); image = createImage(dpy, mEGLSlots[buf].mGraphicBuffer);
mEGLSlots[buf].mEglImage = image; mEGLSlots[buf].mEglImage = image;
if (image == EGL_NO_IMAGE_KHR) { if (image == EGL_NO_IMAGE_KHR) {
// NOTE: if dpy was invalid, createImage() is guaranteed to // NOTE: if dpy was invalid, createImage() is guaranteed to

View File

@ -2577,4 +2577,32 @@ TEST_F(SurfaceTextureMultiContextGLTest,
ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 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 } // namespace android