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