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