xref: /aosp_15_r20/external/angle/src/tests/egl_tests/EGLBufferAgeTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // EGLBufferAgeTest.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //   EGL extension EGL_EXT_buffer_age
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include <gtest/gtest.h>
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "util/EGLWindow.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "util/OSWindow.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker class EGLBufferAgeTest : public ANGLETest<>
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker   public:
EGLBufferAgeTest()21*8975f5c5SAndroid Build Coastguard Worker     EGLBufferAgeTest() : mDisplay(EGL_NO_DISPLAY) {}
22*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()23*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
24*8975f5c5SAndroid Build Coastguard Worker     {
25*8975f5c5SAndroid Build Coastguard Worker         EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE};
26*8975f5c5SAndroid Build Coastguard Worker         mDisplay           = eglGetPlatformDisplayEXT(
27*8975f5c5SAndroid Build Coastguard Worker             EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
28*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
29*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));
30*8975f5c5SAndroid Build Coastguard Worker         mMajorVersion       = GetParam().majorVersion;
31*8975f5c5SAndroid Build Coastguard Worker         mExtensionSupported = IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_buffer_age");
32*8975f5c5SAndroid Build Coastguard Worker     }
33*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()34*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
35*8975f5c5SAndroid Build Coastguard Worker     {
36*8975f5c5SAndroid Build Coastguard Worker         if (mDisplay != EGL_NO_DISPLAY)
37*8975f5c5SAndroid Build Coastguard Worker         {
38*8975f5c5SAndroid Build Coastguard Worker             eglTerminate(mDisplay);
39*8975f5c5SAndroid Build Coastguard Worker             eglReleaseThread();
40*8975f5c5SAndroid Build Coastguard Worker             mDisplay = EGL_NO_DISPLAY;
41*8975f5c5SAndroid Build Coastguard Worker         }
42*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "Error during test TearDown";
43*8975f5c5SAndroid Build Coastguard Worker     }
44*8975f5c5SAndroid Build Coastguard Worker 
chooseConfig(EGLConfig * config) const45*8975f5c5SAndroid Build Coastguard Worker     virtual bool chooseConfig(EGLConfig *config) const
46*8975f5c5SAndroid Build Coastguard Worker     {
47*8975f5c5SAndroid Build Coastguard Worker         bool result          = false;
48*8975f5c5SAndroid Build Coastguard Worker         EGLint count         = 0;
49*8975f5c5SAndroid Build Coastguard Worker         EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
50*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[]     = {EGL_RED_SIZE,
51*8975f5c5SAndroid Build Coastguard Worker                                 8,
52*8975f5c5SAndroid Build Coastguard Worker                                 EGL_GREEN_SIZE,
53*8975f5c5SAndroid Build Coastguard Worker                                 8,
54*8975f5c5SAndroid Build Coastguard Worker                                 EGL_BLUE_SIZE,
55*8975f5c5SAndroid Build Coastguard Worker                                 8,
56*8975f5c5SAndroid Build Coastguard Worker                                 EGL_ALPHA_SIZE,
57*8975f5c5SAndroid Build Coastguard Worker                                 0,
58*8975f5c5SAndroid Build Coastguard Worker                                 EGL_RENDERABLE_TYPE,
59*8975f5c5SAndroid Build Coastguard Worker                                 clientVersion,
60*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SURFACE_TYPE,
61*8975f5c5SAndroid Build Coastguard Worker                                 EGL_WINDOW_BIT,
62*8975f5c5SAndroid Build Coastguard Worker                                 EGL_NONE};
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker         result = eglChooseConfig(mDisplay, attribs, config, 1, &count);
65*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(result && (count > 0));
66*8975f5c5SAndroid Build Coastguard Worker         return result;
67*8975f5c5SAndroid Build Coastguard Worker     }
68*8975f5c5SAndroid Build Coastguard Worker 
createContext(EGLConfig config,EGLContext * context)69*8975f5c5SAndroid Build Coastguard Worker     bool createContext(EGLConfig config, EGLContext *context)
70*8975f5c5SAndroid Build Coastguard Worker     {
71*8975f5c5SAndroid Build Coastguard Worker         bool result      = false;
72*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE};
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker         *context = eglCreateContext(mDisplay, config, nullptr, attribs);
75*8975f5c5SAndroid Build Coastguard Worker         result   = (*context != EGL_NO_CONTEXT);
76*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
77*8975f5c5SAndroid Build Coastguard Worker         return result;
78*8975f5c5SAndroid Build Coastguard Worker     }
79*8975f5c5SAndroid Build Coastguard Worker 
createWindowSurface(EGLConfig config,EGLNativeWindowType win,EGLSurface * surface) const80*8975f5c5SAndroid Build Coastguard Worker     bool createWindowSurface(EGLConfig config, EGLNativeWindowType win, EGLSurface *surface) const
81*8975f5c5SAndroid Build Coastguard Worker     {
82*8975f5c5SAndroid Build Coastguard Worker         bool result      = false;
83*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[] = {EGL_NONE};
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker         *surface = eglCreateWindowSurface(mDisplay, config, win, attribs);
86*8975f5c5SAndroid Build Coastguard Worker         result   = (*surface != EGL_NO_SURFACE);
87*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
88*8975f5c5SAndroid Build Coastguard Worker         return result;
89*8975f5c5SAndroid Build Coastguard Worker     }
90*8975f5c5SAndroid Build Coastguard Worker 
queryAge(EGLSurface surface) const91*8975f5c5SAndroid Build Coastguard Worker     EGLint queryAge(EGLSurface surface) const
92*8975f5c5SAndroid Build Coastguard Worker     {
93*8975f5c5SAndroid Build Coastguard Worker         EGLint age  = 0;
94*8975f5c5SAndroid Build Coastguard Worker         bool result = eglQuerySurface(mDisplay, surface, EGL_BUFFER_AGE_EXT, &age);
95*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
96*8975f5c5SAndroid Build Coastguard Worker         return age;
97*8975f5c5SAndroid Build Coastguard Worker     }
98*8975f5c5SAndroid Build Coastguard Worker 
queryAgeAttribKHR(EGLSurface surface) const99*8975f5c5SAndroid Build Coastguard Worker     EGLint queryAgeAttribKHR(EGLSurface surface) const
100*8975f5c5SAndroid Build Coastguard Worker     {
101*8975f5c5SAndroid Build Coastguard Worker         EGLAttribKHR age = 0;
102*8975f5c5SAndroid Build Coastguard Worker         bool result      = eglQuerySurface64KHR(mDisplay, surface, EGL_BUFFER_AGE_EXT, &age);
103*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
104*8975f5c5SAndroid Build Coastguard Worker         return age;
105*8975f5c5SAndroid Build Coastguard Worker     }
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay mDisplay      = EGL_NO_DISPLAY;
108*8975f5c5SAndroid Build Coastguard Worker     EGLint mMajorVersion     = 0;
109*8975f5c5SAndroid Build Coastguard Worker     const EGLint kWidth      = 64;
110*8975f5c5SAndroid Build Coastguard Worker     const EGLint kHeight     = 64;
111*8975f5c5SAndroid Build Coastguard Worker     bool mExtensionSupported = false;
112*8975f5c5SAndroid Build Coastguard Worker };
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker class EGLBufferAgeTest_MSAA : public EGLBufferAgeTest
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker   public:
EGLBufferAgeTest_MSAA()117*8975f5c5SAndroid Build Coastguard Worker     EGLBufferAgeTest_MSAA() : EGLBufferAgeTest() {}
118*8975f5c5SAndroid Build Coastguard Worker 
chooseConfig(EGLConfig * config) const119*8975f5c5SAndroid Build Coastguard Worker     bool chooseConfig(EGLConfig *config) const override
120*8975f5c5SAndroid Build Coastguard Worker     {
121*8975f5c5SAndroid Build Coastguard Worker         bool result          = false;
122*8975f5c5SAndroid Build Coastguard Worker         EGLint count         = 0;
123*8975f5c5SAndroid Build Coastguard Worker         EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
124*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[]     = {EGL_RED_SIZE,
125*8975f5c5SAndroid Build Coastguard Worker                                 8,
126*8975f5c5SAndroid Build Coastguard Worker                                 EGL_GREEN_SIZE,
127*8975f5c5SAndroid Build Coastguard Worker                                 8,
128*8975f5c5SAndroid Build Coastguard Worker                                 EGL_BLUE_SIZE,
129*8975f5c5SAndroid Build Coastguard Worker                                 8,
130*8975f5c5SAndroid Build Coastguard Worker                                 EGL_ALPHA_SIZE,
131*8975f5c5SAndroid Build Coastguard Worker                                 8,
132*8975f5c5SAndroid Build Coastguard Worker                                 EGL_RENDERABLE_TYPE,
133*8975f5c5SAndroid Build Coastguard Worker                                 clientVersion,
134*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SAMPLE_BUFFERS,
135*8975f5c5SAndroid Build Coastguard Worker                                 1,
136*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SAMPLES,
137*8975f5c5SAndroid Build Coastguard Worker                                 4,
138*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SURFACE_TYPE,
139*8975f5c5SAndroid Build Coastguard Worker                                 EGL_WINDOW_BIT,
140*8975f5c5SAndroid Build Coastguard Worker                                 EGL_NONE};
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker         result = eglChooseConfig(mDisplay, attribs, config, 1, &count);
143*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(result && (count > 0));
144*8975f5c5SAndroid Build Coastguard Worker         return result;
145*8975f5c5SAndroid Build Coastguard Worker     }
146*8975f5c5SAndroid Build Coastguard Worker };
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker class EGLBufferAgeTest_MSAA_DS : public EGLBufferAgeTest
149*8975f5c5SAndroid Build Coastguard Worker {
150*8975f5c5SAndroid Build Coastguard Worker   public:
EGLBufferAgeTest_MSAA_DS()151*8975f5c5SAndroid Build Coastguard Worker     EGLBufferAgeTest_MSAA_DS() : EGLBufferAgeTest() {}
152*8975f5c5SAndroid Build Coastguard Worker 
chooseConfig(EGLConfig * config) const153*8975f5c5SAndroid Build Coastguard Worker     bool chooseConfig(EGLConfig *config) const override
154*8975f5c5SAndroid Build Coastguard Worker     {
155*8975f5c5SAndroid Build Coastguard Worker         bool result          = false;
156*8975f5c5SAndroid Build Coastguard Worker         EGLint count         = 0;
157*8975f5c5SAndroid Build Coastguard Worker         EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
158*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[]     = {EGL_RED_SIZE,
159*8975f5c5SAndroid Build Coastguard Worker                                 8,
160*8975f5c5SAndroid Build Coastguard Worker                                 EGL_GREEN_SIZE,
161*8975f5c5SAndroid Build Coastguard Worker                                 8,
162*8975f5c5SAndroid Build Coastguard Worker                                 EGL_BLUE_SIZE,
163*8975f5c5SAndroid Build Coastguard Worker                                 8,
164*8975f5c5SAndroid Build Coastguard Worker                                 EGL_ALPHA_SIZE,
165*8975f5c5SAndroid Build Coastguard Worker                                 8,
166*8975f5c5SAndroid Build Coastguard Worker                                 EGL_DEPTH_SIZE,
167*8975f5c5SAndroid Build Coastguard Worker                                 8,
168*8975f5c5SAndroid Build Coastguard Worker                                 EGL_STENCIL_SIZE,
169*8975f5c5SAndroid Build Coastguard Worker                                 8,
170*8975f5c5SAndroid Build Coastguard Worker                                 EGL_RENDERABLE_TYPE,
171*8975f5c5SAndroid Build Coastguard Worker                                 clientVersion,
172*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SAMPLE_BUFFERS,
173*8975f5c5SAndroid Build Coastguard Worker                                 1,
174*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SAMPLES,
175*8975f5c5SAndroid Build Coastguard Worker                                 4,
176*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SURFACE_TYPE,
177*8975f5c5SAndroid Build Coastguard Worker                                 EGL_WINDOW_BIT,
178*8975f5c5SAndroid Build Coastguard Worker                                 EGL_NONE};
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker         result = eglChooseConfig(mDisplay, attribs, config, 1, &count);
181*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(result && (count > 0));
182*8975f5c5SAndroid Build Coastguard Worker         return result;
183*8975f5c5SAndroid Build Coastguard Worker     }
184*8975f5c5SAndroid Build Coastguard Worker };
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker // Query for buffer age
TEST_P(EGLBufferAgeTest,QueryBufferAge)187*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLBufferAgeTest, QueryBufferAge)
188*8975f5c5SAndroid Build Coastguard Worker {
189*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!mExtensionSupported);
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker     const bool lockSurface3ExtSupported =
192*8975f5c5SAndroid Build Coastguard Worker         IsEGLDisplayExtensionEnabled(mDisplay, "EGL_KHR_lock_surface3");
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
195*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
198*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &context));
199*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = EGL_NO_SURFACE;
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
204*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);
205*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));
206*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
207*8975f5c5SAndroid Build Coastguard Worker 
208*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));
209*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker     const uint32_t loopcount = 15;
214*8975f5c5SAndroid Build Coastguard Worker     EGLint expectedAge       = 0;
215*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < loopcount; i++)
216*8975f5c5SAndroid Build Coastguard Worker     {
217*8975f5c5SAndroid Build Coastguard Worker         // Alternate between eglQuerySurface and eglQuerySurface64KHR
218*8975f5c5SAndroid Build Coastguard Worker         EGLint age = -1;
219*8975f5c5SAndroid Build Coastguard Worker         if (i % 2 == 0 || !lockSurface3ExtSupported)
220*8975f5c5SAndroid Build Coastguard Worker         {
221*8975f5c5SAndroid Build Coastguard Worker             age = queryAge(surface);
222*8975f5c5SAndroid Build Coastguard Worker         }
223*8975f5c5SAndroid Build Coastguard Worker         else
224*8975f5c5SAndroid Build Coastguard Worker         {
225*8975f5c5SAndroid Build Coastguard Worker             age = static_cast<EGLint>(queryAgeAttribKHR(surface));
226*8975f5c5SAndroid Build Coastguard Worker         }
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker         // Should start with zero age and then flip to buffer count - which we don't know.
229*8975f5c5SAndroid Build Coastguard Worker         if ((expectedAge == 0) && (age > 0))
230*8975f5c5SAndroid Build Coastguard Worker         {
231*8975f5c5SAndroid Build Coastguard Worker             expectedAge = age;
232*8975f5c5SAndroid Build Coastguard Worker         }
233*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(age, expectedAge);
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
236*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR() << "glClear failed";
237*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, surface);
238*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
239*8975f5c5SAndroid Build Coastguard Worker     }
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(expectedAge, 0);
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
244*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
245*8975f5c5SAndroid Build Coastguard Worker 
246*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, surface);
247*8975f5c5SAndroid Build Coastguard Worker     surface = EGL_NO_SURFACE;
248*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
249*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
250*8975f5c5SAndroid Build Coastguard Worker 
251*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
252*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
253*8975f5c5SAndroid Build Coastguard Worker }
254*8975f5c5SAndroid Build Coastguard Worker 
255*8975f5c5SAndroid Build Coastguard Worker // Verify contents of buffer are as expected
TEST_P(EGLBufferAgeTest,VerifyContents)256*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLBufferAgeTest, VerifyContents)
257*8975f5c5SAndroid Build Coastguard Worker {
258*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!mExtensionSupported);
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
261*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
264*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &context));
265*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
266*8975f5c5SAndroid Build Coastguard Worker 
267*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = EGL_NO_SURFACE;
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
270*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);
271*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));
272*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));
275*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker     const angle::GLColor kLightGray(191, 191, 191, 255);  // 0.75
278*8975f5c5SAndroid Build Coastguard Worker     const angle::GLColor kDarkGray(64, 64, 64, 255);      // 0.25
279*8975f5c5SAndroid Build Coastguard Worker     const angle::GLColor kColorSet[] = {
280*8975f5c5SAndroid Build Coastguard Worker         GLColor::blue,  GLColor::cyan,   kDarkGray,      GLColor::green,   GLColor::red,
281*8975f5c5SAndroid Build Coastguard Worker         GLColor::white, GLColor::yellow, GLColor::black, GLColor::magenta, kLightGray,
282*8975f5c5SAndroid Build Coastguard Worker         GLColor::black,  // Extra loops until color cycled through
283*8975f5c5SAndroid Build Coastguard Worker         GLColor::black, GLColor::black,  GLColor::black, GLColor::black};
284*8975f5c5SAndroid Build Coastguard Worker 
285*8975f5c5SAndroid Build Coastguard Worker     EGLint age                   = 0;
286*8975f5c5SAndroid Build Coastguard Worker     angle::GLColor expectedColor = GLColor::black;
287*8975f5c5SAndroid Build Coastguard Worker     int loopCount                = (sizeof(kColorSet) / sizeof(kColorSet[0]));
288*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < loopCount; i++)
289*8975f5c5SAndroid Build Coastguard Worker     {
290*8975f5c5SAndroid Build Coastguard Worker         age = queryAge(surface);
291*8975f5c5SAndroid Build Coastguard Worker         if (age > 0)
292*8975f5c5SAndroid Build Coastguard Worker         {
293*8975f5c5SAndroid Build Coastguard Worker             // Check that color/content is what we expect
294*8975f5c5SAndroid Build Coastguard Worker             expectedColor = kColorSet[i - age];
295*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(1, 1, expectedColor);
296*8975f5c5SAndroid Build Coastguard Worker         }
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker         float red   = kColorSet[i].R / 255.0;
299*8975f5c5SAndroid Build Coastguard Worker         float green = kColorSet[i].G / 255.0;
300*8975f5c5SAndroid Build Coastguard Worker         float blue  = kColorSet[i].B / 255.0;
301*8975f5c5SAndroid Build Coastguard Worker         float alpha = kColorSet[i].A / 255.0;
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker         glClearColor(red, green, blue, alpha);
304*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
305*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR() << "glClear failed";
306*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, surface);
307*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
308*8975f5c5SAndroid Build Coastguard Worker     }
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(age, 0);
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
313*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, surface);
316*8975f5c5SAndroid Build Coastguard Worker     surface = EGL_NO_SURFACE;
317*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
318*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
319*8975f5c5SAndroid Build Coastguard Worker 
320*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
321*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
322*8975f5c5SAndroid Build Coastguard Worker }
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker // Verify contents of buffer are as expected for a multisample image
TEST_P(EGLBufferAgeTest_MSAA,VerifyContentsForMultisampled)325*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLBufferAgeTest_MSAA, VerifyContentsForMultisampled)
326*8975f5c5SAndroid Build Coastguard Worker {
327*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!mExtensionSupported);
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
330*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
333*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &context));
334*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = EGL_NO_SURFACE;
337*8975f5c5SAndroid Build Coastguard Worker 
338*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
339*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("EGLBufferAgeTest_MSAA", kWidth, kHeight);
340*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));
341*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
342*8975f5c5SAndroid Build Coastguard Worker 
343*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));
344*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
345*8975f5c5SAndroid Build Coastguard Worker 
346*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::GLColor> kColorSet;
347*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < 16; i++)
348*8975f5c5SAndroid Build Coastguard Worker     {
349*8975f5c5SAndroid Build Coastguard Worker         kColorSet.emplace_back(i * 10, 0, 0, 255);
350*8975f5c5SAndroid Build Coastguard Worker     }
351*8975f5c5SAndroid Build Coastguard Worker 
352*8975f5c5SAndroid Build Coastguard Worker     // Set up
353*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
354*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.0);
355*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker     EGLint age     = 0;
358*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
359*8975f5c5SAndroid Build Coastguard Worker     GLint colorLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform());
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < kColorSet.size(); i++)
362*8975f5c5SAndroid Build Coastguard Worker     {
363*8975f5c5SAndroid Build Coastguard Worker         age = queryAge(surface);
364*8975f5c5SAndroid Build Coastguard Worker         if (age > 0)
365*8975f5c5SAndroid Build Coastguard Worker         {
366*8975f5c5SAndroid Build Coastguard Worker             // Check that color/content is what we expect
367*8975f5c5SAndroid Build Coastguard Worker             angle::GLColor expectedColor = kColorSet[i - age];
368*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(1, 1, expectedColor);
369*8975f5c5SAndroid Build Coastguard Worker         }
370*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
371*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
372*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(colorLocation, 1, kColorSet[i].toNormalizedVector().data());
373*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, surface);
376*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
377*8975f5c5SAndroid Build Coastguard Worker     }
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(age, 0);
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
382*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
383*8975f5c5SAndroid Build Coastguard Worker 
384*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, surface);
385*8975f5c5SAndroid Build Coastguard Worker     surface = EGL_NO_SURFACE;
386*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
387*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
390*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
391*8975f5c5SAndroid Build Coastguard Worker }
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker // Verify contents of buffer are as expected for a multisample image with depth/stencil enabled
TEST_P(EGLBufferAgeTest_MSAA_DS,VerifyContentsForMultisampledWithDepthStencil)394*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLBufferAgeTest_MSAA_DS, VerifyContentsForMultisampledWithDepthStencil)
395*8975f5c5SAndroid Build Coastguard Worker {
396*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!mExtensionSupported);
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
399*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
400*8975f5c5SAndroid Build Coastguard Worker 
401*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
402*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &context));
403*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = EGL_NO_SURFACE;
406*8975f5c5SAndroid Build Coastguard Worker 
407*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
408*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("EGLBufferAgeTest_MSAA", kWidth, kHeight);
409*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));
410*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
411*8975f5c5SAndroid Build Coastguard Worker 
412*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));
413*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
414*8975f5c5SAndroid Build Coastguard Worker 
415*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::GLColor> kColorSet;
416*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < 16; i++)
417*8975f5c5SAndroid Build Coastguard Worker     {
418*8975f5c5SAndroid Build Coastguard Worker         kColorSet.emplace_back(i * 10, 0, 0, 255);
419*8975f5c5SAndroid Build Coastguard Worker     }
420*8975f5c5SAndroid Build Coastguard Worker 
421*8975f5c5SAndroid Build Coastguard Worker     // Set up
422*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
423*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.0);
424*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
425*8975f5c5SAndroid Build Coastguard Worker 
426*8975f5c5SAndroid Build Coastguard Worker     EGLint age     = 0;
427*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
428*8975f5c5SAndroid Build Coastguard Worker     GLint colorLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform());
429*8975f5c5SAndroid Build Coastguard Worker 
430*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < kColorSet.size(); i++)
431*8975f5c5SAndroid Build Coastguard Worker     {
432*8975f5c5SAndroid Build Coastguard Worker         age = queryAge(surface);
433*8975f5c5SAndroid Build Coastguard Worker         if (age > 0)
434*8975f5c5SAndroid Build Coastguard Worker         {
435*8975f5c5SAndroid Build Coastguard Worker             // Check that color/content is what we expect
436*8975f5c5SAndroid Build Coastguard Worker             angle::GLColor expectedColor = kColorSet[i - age];
437*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(1, 1, expectedColor);
438*8975f5c5SAndroid Build Coastguard Worker         }
439*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
440*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
441*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(colorLocation, 1, kColorSet[i].toNormalizedVector().data());
442*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
443*8975f5c5SAndroid Build Coastguard Worker 
444*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, surface);
445*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
446*8975f5c5SAndroid Build Coastguard Worker     }
447*8975f5c5SAndroid Build Coastguard Worker 
448*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(age, 0);
449*8975f5c5SAndroid Build Coastguard Worker 
450*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
451*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
452*8975f5c5SAndroid Build Coastguard Worker 
453*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, surface);
454*8975f5c5SAndroid Build Coastguard Worker     surface = EGL_NO_SURFACE;
455*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
456*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
457*8975f5c5SAndroid Build Coastguard Worker 
458*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
459*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
460*8975f5c5SAndroid Build Coastguard Worker }
461*8975f5c5SAndroid Build Coastguard Worker 
462*8975f5c5SAndroid Build Coastguard Worker // Verify EGL_BAD_SURFACE when not current
TEST_P(EGLBufferAgeTest,UncurrentContextBadSurface)463*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLBufferAgeTest, UncurrentContextBadSurface)
464*8975f5c5SAndroid Build Coastguard Worker {
465*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!mExtensionSupported);
466*8975f5c5SAndroid Build Coastguard Worker 
467*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
468*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
471*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &context));
472*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = EGL_NO_SURFACE;
475*8975f5c5SAndroid Build Coastguard Worker 
476*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
477*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);
478*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));
479*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
480*8975f5c5SAndroid Build Coastguard Worker 
481*8975f5c5SAndroid Build Coastguard Worker     // No current context
482*8975f5c5SAndroid Build Coastguard Worker 
483*8975f5c5SAndroid Build Coastguard Worker     EGLint value = 0;
484*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_FALSE(eglQuerySurface(mDisplay, surface, EGL_BUFFER_AGE_EXT, &value));
485*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_SURFACE);
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     EGLContext otherContext = EGL_NO_CONTEXT;
488*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &otherContext));
489*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
490*8975f5c5SAndroid Build Coastguard Worker 
491*8975f5c5SAndroid Build Coastguard Worker     // Surface current to another context
492*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, otherContext));
493*8975f5c5SAndroid Build Coastguard Worker     // Make context the active context
494*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
495*8975f5c5SAndroid Build Coastguard Worker 
496*8975f5c5SAndroid Build Coastguard Worker     value = 0;
497*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_FALSE(eglQuerySurface(mDisplay, surface, EGL_BUFFER_AGE_EXT, &value));
498*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_SURFACE);
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, surface);
501*8975f5c5SAndroid Build Coastguard Worker     surface = EGL_NO_SURFACE;
502*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
503*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
504*8975f5c5SAndroid Build Coastguard Worker 
505*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, otherContext);
506*8975f5c5SAndroid Build Coastguard Worker     otherContext = EGL_NO_CONTEXT;
507*8975f5c5SAndroid Build Coastguard Worker 
508*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
509*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
510*8975f5c5SAndroid Build Coastguard Worker }
511*8975f5c5SAndroid Build Coastguard Worker 
512*8975f5c5SAndroid Build Coastguard Worker // Expect age always == 1 when EGL_BUFFER_PRESERVED is chosen
TEST_P(EGLBufferAgeTest,BufferPreserved)513*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLBufferAgeTest, BufferPreserved)
514*8975f5c5SAndroid Build Coastguard Worker {
515*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!mExtensionSupported);
516*8975f5c5SAndroid Build Coastguard Worker 
517*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config     = EGL_NO_CONFIG_KHR;
518*8975f5c5SAndroid Build Coastguard Worker     EGLint count         = 0;
519*8975f5c5SAndroid Build Coastguard Worker     EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
520*8975f5c5SAndroid Build Coastguard Worker     EGLint attribs[]     = {EGL_RED_SIZE,
521*8975f5c5SAndroid Build Coastguard Worker                             8,
522*8975f5c5SAndroid Build Coastguard Worker                             EGL_GREEN_SIZE,
523*8975f5c5SAndroid Build Coastguard Worker                             8,
524*8975f5c5SAndroid Build Coastguard Worker                             EGL_BLUE_SIZE,
525*8975f5c5SAndroid Build Coastguard Worker                             8,
526*8975f5c5SAndroid Build Coastguard Worker                             EGL_ALPHA_SIZE,
527*8975f5c5SAndroid Build Coastguard Worker                             0,
528*8975f5c5SAndroid Build Coastguard Worker                             EGL_RENDERABLE_TYPE,
529*8975f5c5SAndroid Build Coastguard Worker                             clientVersion,
530*8975f5c5SAndroid Build Coastguard Worker                             EGL_SURFACE_TYPE,
531*8975f5c5SAndroid Build Coastguard Worker                             EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT,
532*8975f5c5SAndroid Build Coastguard Worker                             EGL_NONE};
533*8975f5c5SAndroid Build Coastguard Worker 
534*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, attribs, &config, 1, &count));
535*8975f5c5SAndroid Build Coastguard Worker     // Skip if no configs, this indicates EGL_BUFFER_PRESERVED is not supported.
536*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(count == 0);
537*8975f5c5SAndroid Build Coastguard Worker 
538*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
539*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &context));
540*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
541*8975f5c5SAndroid Build Coastguard Worker 
542*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = EGL_NO_SURFACE;
543*8975f5c5SAndroid Build Coastguard Worker 
544*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
545*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);
546*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));
547*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
548*8975f5c5SAndroid Build Coastguard Worker 
549*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));
550*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
551*8975f5c5SAndroid Build Coastguard Worker 
552*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
553*8975f5c5SAndroid Build Coastguard Worker 
554*8975f5c5SAndroid Build Coastguard Worker     const uint32_t loopcount = 10;
555*8975f5c5SAndroid Build Coastguard Worker     EGLint expectedAge       = 1;
556*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < loopcount; i++)
557*8975f5c5SAndroid Build Coastguard Worker     {
558*8975f5c5SAndroid Build Coastguard Worker         EGLint age = queryAge(surface);
559*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(age, expectedAge);
560*8975f5c5SAndroid Build Coastguard Worker 
561*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
562*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR() << "glClear failed";
563*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, surface);
564*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
565*8975f5c5SAndroid Build Coastguard Worker     }
566*8975f5c5SAndroid Build Coastguard Worker 
567*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
568*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
569*8975f5c5SAndroid Build Coastguard Worker 
570*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, surface);
571*8975f5c5SAndroid Build Coastguard Worker     surface = EGL_NO_SURFACE;
572*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
573*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
574*8975f5c5SAndroid Build Coastguard Worker 
575*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
576*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
577*8975f5c5SAndroid Build Coastguard Worker }
578*8975f5c5SAndroid Build Coastguard Worker 
579*8975f5c5SAndroid Build Coastguard Worker // Expect age always == 0 when EGL_SINGLE_BUFFER is chosen
TEST_P(EGLBufferAgeTest,SingleBuffer)580*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLBufferAgeTest, SingleBuffer)
581*8975f5c5SAndroid Build Coastguard Worker {
582*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!mExtensionSupported);
583*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_KHR_mutable_render_buffer"));
584*8975f5c5SAndroid Build Coastguard Worker 
585*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config     = EGL_NO_CONFIG_KHR;
586*8975f5c5SAndroid Build Coastguard Worker     EGLint count         = 0;
587*8975f5c5SAndroid Build Coastguard Worker     EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
588*8975f5c5SAndroid Build Coastguard Worker     EGLint attribs[]     = {EGL_RED_SIZE,
589*8975f5c5SAndroid Build Coastguard Worker                             8,
590*8975f5c5SAndroid Build Coastguard Worker                             EGL_GREEN_SIZE,
591*8975f5c5SAndroid Build Coastguard Worker                             8,
592*8975f5c5SAndroid Build Coastguard Worker                             EGL_BLUE_SIZE,
593*8975f5c5SAndroid Build Coastguard Worker                             8,
594*8975f5c5SAndroid Build Coastguard Worker                             EGL_ALPHA_SIZE,
595*8975f5c5SAndroid Build Coastguard Worker                             0,
596*8975f5c5SAndroid Build Coastguard Worker                             EGL_RENDERABLE_TYPE,
597*8975f5c5SAndroid Build Coastguard Worker                             clientVersion,
598*8975f5c5SAndroid Build Coastguard Worker                             EGL_SURFACE_TYPE,
599*8975f5c5SAndroid Build Coastguard Worker                             EGL_WINDOW_BIT | EGL_MUTABLE_RENDER_BUFFER_BIT_KHR,
600*8975f5c5SAndroid Build Coastguard Worker                             EGL_NONE};
601*8975f5c5SAndroid Build Coastguard Worker 
602*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, attribs, &config, 1, &count));
603*8975f5c5SAndroid Build Coastguard Worker     // Skip if no configs, this indicates EGL_SINGLE_BUFFER is not supported.
604*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(count == 0);
605*8975f5c5SAndroid Build Coastguard Worker 
606*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
607*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(config, &context));
608*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = EGL_NO_SURFACE;
611*8975f5c5SAndroid Build Coastguard Worker 
612*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
613*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);
614*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));
615*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
616*8975f5c5SAndroid Build Coastguard Worker 
617*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));
618*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
619*8975f5c5SAndroid Build Coastguard Worker 
620*8975f5c5SAndroid Build Coastguard Worker     // Set render buffer to EGL_SINGLE_BUFFER
621*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglSurfaceAttrib(mDisplay, surface, EGL_RENDER_BUFFER, EGL_SINGLE_BUFFER));
622*8975f5c5SAndroid Build Coastguard Worker 
623*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
624*8975f5c5SAndroid Build Coastguard Worker 
625*8975f5c5SAndroid Build Coastguard Worker     // Expect age = 0 before first eglSwapBuffers() call
626*8975f5c5SAndroid Build Coastguard Worker     EGLint age = queryAge(surface);
627*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(age, 0);
628*8975f5c5SAndroid Build Coastguard Worker     eglSwapBuffers(mDisplay, surface);
629*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
630*8975f5c5SAndroid Build Coastguard Worker 
631*8975f5c5SAndroid Build Coastguard Worker     const uint32_t loopcount = 10;
632*8975f5c5SAndroid Build Coastguard Worker     EGLint expectedAge       = 0;
633*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < loopcount; i++)
634*8975f5c5SAndroid Build Coastguard Worker     {
635*8975f5c5SAndroid Build Coastguard Worker         age = queryAge(surface);
636*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(age, expectedAge);
637*8975f5c5SAndroid Build Coastguard Worker 
638*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
639*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR() << "glClear failed";
640*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, surface);
641*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
642*8975f5c5SAndroid Build Coastguard Worker     }
643*8975f5c5SAndroid Build Coastguard Worker 
644*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
645*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
646*8975f5c5SAndroid Build Coastguard Worker 
647*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, surface);
648*8975f5c5SAndroid Build Coastguard Worker     surface = EGL_NO_SURFACE;
649*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
650*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
651*8975f5c5SAndroid Build Coastguard Worker 
652*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
653*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
654*8975f5c5SAndroid Build Coastguard Worker }
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(EGLBufferAgeTest,
657*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_METAL()),
658*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_METAL()),
659*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_OPENGLES()),
660*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_OPENGLES()),
661*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_OPENGL()),
662*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_OPENGL()),
663*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_VULKAN()),
664*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_VULKAN()));
665*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(EGLBufferAgeTest_MSAA,
666*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_METAL()),
667*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_METAL()),
668*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_OPENGLES()),
669*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_OPENGLES()),
670*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_OPENGL()),
671*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_OPENGL()),
672*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_VULKAN()),
673*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_VULKAN()));
674*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(EGLBufferAgeTest_MSAA_DS,
675*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_METAL()),
676*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_METAL()),
677*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_OPENGLES()),
678*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_OPENGLES()),
679*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_OPENGL()),
680*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_OPENGL()),
681*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_VULKAN()),
682*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_VULKAN()));
683