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