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) { 29583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 32cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 33cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 34cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to latch the texture on the secondary context. 37cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->updateTexImage()); 41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextSucceeds) { 44583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Check that the GL texture was deleted. 55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(GL_FALSE, glIsTexture(TEX_ID)); 56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza DetachFromContextSucceedsAfterProducerDisconnect) { 60583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU); 69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Check that the GL texture was deleted. 72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(GL_FALSE, glIsTexture(TEX_ID)); 73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWhenAbandoned) { 76583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context. 84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->abandon(); 85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_INIT, mST->detachFromContext()); 86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 87cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 88cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWhenDetached) { 89583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 90cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 91cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 92cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 93cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 94cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 95cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 96cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 97cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 98cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 99cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context again. 100cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->detachFromContext()); 101cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 102cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 103cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWithNoDisplay) { 104583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 105cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 106cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 107cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 108cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 109cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 110cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 111cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Make there be no current display. 112cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, 113cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_NO_CONTEXT)); 114cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 115cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 116cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context. 117cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->detachFromContext()); 118cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 119cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 120cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, DetachFromContextFailsWithNoContext) { 121583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 122cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 123cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 124cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 125cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 126cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 127cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 128cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Make current context be incorrect. 129cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 130cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 131cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 132cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 133cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to detach from the primary context. 134cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->detachFromContext()); 135cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 136cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 137cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, UpdateTexImageFailsWhenDetached) { 138583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 139cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 140cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 141cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 142cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 143cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 144cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to latch the texture contents on the primary context. 145cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 146cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->updateTexImage()); 147cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 148cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 149cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextSucceeds) { 150583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 151cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 152cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 153cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 154cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 155cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 156cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 157cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 158cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 159cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 160cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 161cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 162cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 163cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 164cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 165cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 166cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 167cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 168cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(SECOND_TEX_ID, texBinding); 169cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 170cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the secondary context. 171cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 172cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 173cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 174cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondTextureRenderer->drawTexture(); 175cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 176cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 177cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 178cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 179cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 180cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextSucceedsAfterProducerDisconnect) { 181583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 182cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 183cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 184cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 185cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 186cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 187cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 188cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 189cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU); 190cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 191cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 192cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 193cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 194cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 195cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 196cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 197cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 198cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 199cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 200cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(SECOND_TEX_ID, texBinding); 201cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 202cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the secondary context. 203cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 204cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 205cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 206cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondTextureRenderer->drawTexture(); 207cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 208cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 209cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 210cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 211cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 212cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextSucceedsBeforeUpdateTexImage) { 213583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 214cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 215cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 216cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 217cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU); 218cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 219cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 220cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 221cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 222cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 223cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 224cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 225cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 226cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 227cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 228cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(SECOND_TEX_ID, texBinding); 229cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 230cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 231cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 232cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 233cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 234cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the secondary context. 235cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 236cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 237cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 238cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondTextureRenderer->drawTexture(); 239cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 240cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 241cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 242cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 243cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextFailsWhenAbandoned) { 244583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 245cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 246cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 247cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 248cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 249cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 250cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 251cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 252cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 253cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 254cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the secondary context. 255cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->abandon(); 256cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 257cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the primary context. 258cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_INIT, mST->attachToContext(SECOND_TEX_ID)); 259cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 260cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 261cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextFailsWhenAttached) { 262583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 263cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 264cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 265cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 266cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 267cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 268cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 269cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the primary context. 270cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->attachToContext(SECOND_TEX_ID)); 271cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 272cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 273cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 274cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextFailsWhenAttachedBeforeUpdateTexImage) { 275583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 276cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 277cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 278cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach to the primary context. 279cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->attachToContext(SECOND_TEX_ID)); 280cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 281cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 282cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextFailsWithNoDisplay) { 283583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 284cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 285cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 286cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 287cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 288cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 289cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 290cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 291cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 292cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 293cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Make there be no current display. 294cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, 295cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_NO_CONTEXT)); 296cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 297cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 298cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attempt to attach with no context current. 299cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(INVALID_OPERATION, mST->attachToContext(SECOND_TEX_ID)); 300cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 301cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 302cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, AttachToContextSucceedsTwice) { 303583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 304cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 305cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 306cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the primary context. 307cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 308cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 309cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 310cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 311cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 312cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 313cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 314cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 315cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 316cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 317cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 318cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the secondary context. 319cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 320cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 321cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the tertiary context. 322cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 323cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdEglContext)); 324cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(THIRD_TEX_ID)); 325cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 326cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 327cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 328cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 329cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(THIRD_TEX_ID, texBinding); 330cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 331cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the tertiary context. 332cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 333cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 334cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 335cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdTextureRenderer->drawTexture(); 336cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 337cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 338cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 339cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 340cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 341cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza AttachToContextSucceedsTwiceBeforeUpdateTexImage) { 342583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 343cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 344cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 345cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context. 346cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 347cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 348cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the secondary context. 349cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 350cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 351cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 352cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 353cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the secondary context. 354cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 355cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 356cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Attach to the tertiary context. 357cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 358cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdEglContext)); 359cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(THIRD_TEX_ID)); 360cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 361cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Verify that the texture object was created and bound. 362cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint texBinding = -1; 363cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texBinding); 364cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(THIRD_TEX_ID, texBinding); 365cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 366cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Latch the texture contents on the tertiary context. 367cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 368cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 369cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 370cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Try to use the texture from the tertiary context. 371cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 372cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 373cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 1, 1); 374cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mThirdTextureRenderer->drawTexture(); 375cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 376cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 377cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 378cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 379cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureMultiContextGLTest, 380cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza UpdateTexImageSucceedsForBufferConsumedBeforeDetach) { 381583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 382cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 383cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // produce two frames and consume them both on the primary context 384cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 385cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 386cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 387cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 388cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 389cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 390cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 391cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 392cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // produce one more frame 393cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 394cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 395cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Detach from the primary context and attach to the secondary context 396cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->detachFromContext()); 397cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 398cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSecondEglContext)); 399cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 400cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 401cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Consume final frame on secondary context 402cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 403cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->updateTexImage()); 404cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 405cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 4062d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric PennerTEST_F(SurfaceTextureMultiContextGLTest, 4072d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner AttachAfterDisplayTerminatedSucceeds) { 408583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU)); 4092d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4102d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // produce two frames and consume them both on the primary context 4112d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 4122d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mFW->waitForFrame(); 4132d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->updateTexImage()); 4142d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4152d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 4162d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mFW->waitForFrame(); 4172d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->updateTexImage()); 4182d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4192d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // produce one more frame 4202d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 4212d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4222d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // Detach from the primary context. 4232d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->releaseTexImage()); 4242d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->detachFromContext()); 4252d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4262d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // Terminate and then initialize the display. All contexts, surfaces 4272d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // and images are invalid at this point. 4282d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 4292d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay); 4302d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLint majorVersion = 0; 4312d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLint minorVersion = 0; 4322d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EXPECT_TRUE(eglTerminate(display)); 4332d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion)); 4342d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(EGL_SUCCESS, eglGetError()); 4352d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4362d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // The surface is invalid so create it again. 4372d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGLint pbufferAttribs[] = { 4382d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_WIDTH, 64, 4392d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_HEIGHT, 64, 4402d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_NONE }; 4412d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mEglSurface = eglCreatePbufferSurface(mEglDisplay, mGlConfig, 4422d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner pbufferAttribs); 4432d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4442d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // The second context is invalid so create it again. 4452d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mSecondEglContext = eglCreateContext(mEglDisplay, mGlConfig, 4462d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner EGL_NO_CONTEXT, getContextAttribs()); 4472d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(EGL_SUCCESS, eglGetError()); 4482d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_NE(EGL_NO_CONTEXT, mSecondEglContext); 4492d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4502d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 4512d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mSecondEglContext)); 4522d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(EGL_SUCCESS, eglGetError()); 4532d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4542d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner // Now attach to and consume final frame on secondary context. 4552d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->attachToContext(SECOND_TEX_ID)); 4562d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner mFW->waitForFrame(); 4572d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner ASSERT_EQ(OK, mST->updateTexImage()); 4582d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner} 4592d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 4602d14a0ed4f5861bfa67e9db138ffdc70d2d5e6e4Eric Penner 461cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 462