1cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza/* 2cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Copyright 2013 The Android Open Source Project 3cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 4cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * you may not use this file except in compliance with the License. 6cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * You may obtain a copy of the License at 7cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 8cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 10cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Unless required by applicable law or agreed to in writing, software 11cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * See the License for the specific language governing permissions and 14cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * limitations under the License. 15cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza */ 16cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 17cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#define LOG_TAG "SurfaceTextureMultiContextGL_test" 18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza//#define LOG_NDEBUG 0 19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "SurfaceTextureMultiContextGL.h" 21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "FillBuffer.h" 23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <GLES/glext.h> 25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android { 27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, UpdateFromMultipleContextsFails) { 29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 32cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 33cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 34cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to latch the texture on the secondary context. 36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 37cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->updateTexImage()); 40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextSucceeds) { 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Check that the GL texture was deleted. 53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(GL_FALSE, glIsTexture(TEX_ID)); 54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza DetachFromContextSucceedsAfterProducerDisconnect) { 58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 60cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU); 66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Check that the GL texture was deleted. 69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(GL_FALSE, glIsTexture(TEX_ID)); 70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWhenAbandoned) { 73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context. 80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->abandon(); 81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_INIT, mST->detachFromContext()); 82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWhenDetached) { 85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 87cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 88cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 89cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 90cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 91cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 92cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 93cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 94cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context again. 95cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->detachFromContext()); 96cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 97cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 98cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWithNoDisplay) { 99cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 100cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 101cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 102cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 103cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 104cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 105cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Make there be no current display. 106cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, 107cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_NO_CONTEXT)); 108cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 109cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 110cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context. 111cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->detachFromContext()); 112cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 113cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 114cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWithNoContext) { 115cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 116cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 117cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 118cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 119cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 120cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 121cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Make current context be incorrect. 122cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 123cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 124cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 125cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 126cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context. 127cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->detachFromContext()); 128cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 129cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 130cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, UpdateTexImageFailsWhenDetached) { 131cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 132cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 133cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 134cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 135cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 136cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to latch the texture contents on the primary context. 137cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 138cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->updateTexImage()); 139cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 140cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 141cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextSucceeds) { 142cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 143cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 144cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 145cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 146cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 147cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 148cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 149cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 150cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 151cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 152cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 153cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 154cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 155cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 156cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 157cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 158cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 159cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(SECOND_TEX_ID, texBinding); 160cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 161cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the secondary context. 162cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 163cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 164cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 165cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondTextureRenderer->drawTexture(); 166cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 167cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 168cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 169cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 170cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 171cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextSucceedsAfterProducerDisconnect) { 172cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 173cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 174cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 175cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 176cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 177cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 178cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 179cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU); 180cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 181cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 182cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 183cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 184cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 185cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 186cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 187cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 188cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 189cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 190cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(SECOND_TEX_ID, texBinding); 191cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 192cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the secondary context. 193cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 194cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 195cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 196cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondTextureRenderer->drawTexture(); 197cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 198cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 199cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 200cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 201cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 202cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextSucceedsBeforeUpdateTexImage) { 203cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 204cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 205cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 206cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU); 207cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 208cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 209cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 210cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 211cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 212cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 213cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 214cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 215cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 216cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 217cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(SECOND_TEX_ID, texBinding); 218cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 219cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 220cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 221cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 222cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 223cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the secondary context. 224cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 225cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 226cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 227cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondTextureRenderer->drawTexture(); 228cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 229cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 230cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 231cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 232cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextFailsWhenAbandoned) { 233cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 234cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 235cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 236cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 237cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 238cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 239cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 240cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 241cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 242cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the secondary context. 243cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->abandon(); 244cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 245cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the primary context. 246cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_INIT, mST->attachToContext(SECOND_TEX_ID)); 247cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 248cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 249cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextFailsWhenAttached) { 250cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 251cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 252cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 253cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 254cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 255cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 256cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the primary context. 257cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->attachToContext(SECOND_TEX_ID)); 258cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 259cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 260cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 261cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextFailsWhenAttachedBeforeUpdateTexImage) { 262cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 263cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 264cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the primary context. 265cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->attachToContext(SECOND_TEX_ID)); 266cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 267cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 268cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextFailsWithNoDisplay) { 269cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 270cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 271cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 272cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 273cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 274cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 275cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 276cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 277cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 278cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Make there be no current display. 279cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, 280cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_NO_CONTEXT)); 281cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 282cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 283cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach with no context current. 284cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->attachToContext(SECOND_TEX_ID)); 285cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 286cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 287cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextSucceedsTwice) { 288cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 289cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 290cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 291cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 292cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 293cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 294cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 295cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 296cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 297cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 298cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 299cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 300cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 301cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 302cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the secondary context. 303cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 304cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 305cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the tertiary context. 306cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 307cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdEglContext)); 308cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(THIRD_TEX_ID)); 309cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 310cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 311cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 312cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 313cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(THIRD_TEX_ID, texBinding); 314cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 315cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the tertiary context. 316cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 317cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 318cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 319cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdTextureRenderer->drawTexture(); 320cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 321cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 322cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 323cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 324cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 325cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextSucceedsTwiceBeforeUpdateTexImage) { 326cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 327cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 328cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 329cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 330cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 331cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 332cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 333cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 334cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 335cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 336cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the secondary context. 337cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 338cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 339cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the tertiary context. 340cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 341cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdEglContext)); 342cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(THIRD_TEX_ID)); 343cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 344cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 345cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 346cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 347cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(THIRD_TEX_ID, texBinding); 348cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 349cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the tertiary context. 350cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 351cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 352cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 353cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the tertiary context. 354cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 355cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 356cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 357cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdTextureRenderer->drawTexture(); 358cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 359cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 360cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 361cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 362cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 363cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza UpdateTexImageSucceedsForBufferConsumedBeforeDetach) { 364cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->setDefaultMaxBufferCount(2)); 365cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 366cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // produce two frames and consume them both on the primary context 367cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 368cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 369cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 370cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 371cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 372cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 373cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 374cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 375cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // produce one more frame 376cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 377cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 378cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context and attach to the secondary context 379cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 380cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 381cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 382cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 383cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 384cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Consume final frame on secondary context 385cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 386cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 387cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 388cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 3892d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric PennerTEST_F(SurfaceTextureMultiContextGLTest, 3902d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner AttachAfterDisplayTerminatedSucceeds) { 3912d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(NO_ERROR, mST->setDefaultMaxBufferCount(2)); 3922d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 3932d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // produce two frames and consume them both on the primary context 3942d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 3952d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mFW->waitForFrame(); 3962d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->updateTexImage()); 3972d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 3982d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 3992d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mFW->waitForFrame(); 4002d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->updateTexImage()); 4012d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4022d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // produce one more frame 4032d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 4042d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4052d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // Detach from the primary context. 4062d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->releaseTexImage()); 4072d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->detachFromContext()); 4082d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4092d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // Terminate and then initialize the display. All contexts, surfaces 4102d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // and images are invalid at this point. 4112d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 4122d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay); 4132d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLint majorVersion = 0; 4142d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLint minorVersion = 0; 4152d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EXPECT_TRUE(eglTerminate(display)); 4162d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion)); 4172d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(EGL_SUCCESS, eglGetError()); 4182d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4192d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // The surface is invalid so create it again. 4202d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLint pbufferAttribs[] = { 4212d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_WIDTH, 64, 4222d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_HEIGHT, 64, 4232d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_NONE }; 4242d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mEglSurface = eglCreatePbufferSurface(mEglDisplay, mGlConfig, 4252d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner pbufferAttribs); 4262d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4272d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // The second context is invalid so create it again. 4282d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mSecondEglContext = eglCreateContext(mEglDisplay, mGlConfig, 4292d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_NO_CONTEXT, getContextAttribs()); 4302d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(EGL_SUCCESS, eglGetError()); 4312d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NE(EGL_NO_CONTEXT, mSecondEglContext); 4322d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4332d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 4342d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mSecondEglContext)); 4352d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(EGL_SUCCESS, eglGetError()); 4362d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4372d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // Now attach to and consume final frame on secondary context. 4382d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 4392d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mFW->waitForFrame(); 4402d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->updateTexImage()); 4412d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner} 4422d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4432d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 444cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 445