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