Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/gl_tests/DebugTest.cpp
1693 views
1
//
2
// Copyright 2015 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
7
// DebugTest.cpp : Tests of the GL_KHR_debug extension
8
9
#include "common/debug.h"
10
#include "test_utils/ANGLETest.h"
11
12
namespace angle
13
{
14
constexpr char kBufferObjLabel[] = "buffer";
15
constexpr char kShaderObjLabel[] = "shader";
16
constexpr char kProgramObjLabel[] = "program";
17
constexpr char kVertexArrayObjLabel[] = "vertexarray";
18
constexpr char kQueryObjLabel[] = "query";
19
constexpr char kProgramPipelineObjLabel[] = "programpipeline";
20
constexpr GLenum kObjectTypes[] = {GL_BUFFER_OBJECT_EXT, GL_SHADER_OBJECT_EXT,
21
GL_PROGRAM_OBJECT_EXT, GL_QUERY_OBJECT_EXT,
22
GL_PROGRAM_PIPELINE_OBJECT_EXT, GL_VERTEX_ARRAY_OBJECT_EXT};
23
24
class DebugTest : public ANGLETest
25
{
26
protected:
27
DebugTest() : mDebugExtensionAvailable(false)
28
{
29
setWindowWidth(128);
30
setWindowHeight(128);
31
setConfigRedBits(8);
32
setConfigGreenBits(8);
33
setConfigBlueBits(8);
34
setConfigAlphaBits(8);
35
setConfigDepthBits(24);
36
setDebugEnabled(true);
37
}
38
39
void testSetUp() override
40
{
41
mDebugExtensionAvailable = IsGLExtensionEnabled("GL_KHR_debug");
42
if (mDebugExtensionAvailable)
43
{
44
glEnable(GL_DEBUG_OUTPUT);
45
}
46
}
47
48
bool mDebugExtensionAvailable;
49
};
50
51
void createGLObjectAndLabel(GLenum identifier, GLuint &object, const char **label)
52
{
53
switch (identifier)
54
{
55
case GL_BUFFER_OBJECT_EXT:
56
glGenBuffers(1, &object);
57
glBindBuffer(GL_ARRAY_BUFFER, object);
58
*label = kBufferObjLabel;
59
break;
60
case GL_SHADER_OBJECT_EXT:
61
object = glCreateShader(GL_VERTEX_SHADER);
62
*label = kShaderObjLabel;
63
break;
64
case GL_PROGRAM_OBJECT_EXT:
65
object = glCreateProgram();
66
*label = kProgramObjLabel;
67
break;
68
case GL_VERTEX_ARRAY_OBJECT_EXT:
69
glGenVertexArrays(1, &object);
70
glBindVertexArray(object);
71
*label = kVertexArrayObjLabel;
72
break;
73
case GL_QUERY_OBJECT_EXT:
74
glGenQueries(1, &object);
75
glBeginQuery(GL_ANY_SAMPLES_PASSED, object);
76
*label = kQueryObjLabel;
77
break;
78
case GL_PROGRAM_PIPELINE_OBJECT_EXT:
79
glGenProgramPipelines(1, &object);
80
glBindProgramPipeline(object);
81
*label = kProgramPipelineObjLabel;
82
break;
83
default:
84
UNREACHABLE();
85
break;
86
}
87
}
88
89
void deleteGLObject(GLenum identifier, GLuint &object)
90
{
91
switch (identifier)
92
{
93
case GL_BUFFER_OBJECT_EXT:
94
glDeleteBuffers(1, &object);
95
break;
96
case GL_SHADER_OBJECT_EXT:
97
glDeleteShader(object);
98
break;
99
case GL_PROGRAM_OBJECT_EXT:
100
glDeleteProgram(object);
101
break;
102
case GL_VERTEX_ARRAY_OBJECT_EXT:
103
glDeleteVertexArrays(1, &object);
104
break;
105
case GL_QUERY_OBJECT_EXT:
106
glEndQuery(GL_ANY_SAMPLES_PASSED);
107
glDeleteQueries(1, &object);
108
break;
109
case GL_PROGRAM_PIPELINE_OBJECT_EXT:
110
glDeleteProgramPipelines(1, &object);
111
break;
112
default:
113
UNREACHABLE();
114
break;
115
}
116
}
117
118
// Test basic usage of setting and getting labels using GL_EXT_debug_label
119
TEST_P(DebugTest, ObjectLabelsEXT)
120
{
121
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_debug_label"));
122
123
for (const GLenum identifier : kObjectTypes)
124
{
125
bool skip = false;
126
switch (identifier)
127
{
128
case GL_PROGRAM_PIPELINE_OBJECT_EXT:
129
if (!(getClientMajorVersion() >= 3 && getClientMinorVersion() >= 1) ||
130
!IsGLExtensionEnabled("GL_EXT_separate_shader_objects"))
131
{
132
skip = true;
133
}
134
break;
135
case GL_QUERY_OBJECT_EXT:
136
// GLES3 context is required for glGenQueries()
137
if (getClientMajorVersion() < 3 ||
138
!IsGLExtensionEnabled("GL_EXT_occlusion_query_boolean"))
139
{
140
skip = true;
141
}
142
break;
143
case GL_VERTEX_ARRAY_OBJECT_EXT:
144
if (getClientMajorVersion() < 3)
145
{
146
skip = true;
147
}
148
break;
149
default:
150
break;
151
}
152
153
// if object enum is not supported, move on to the next object type
154
if (skip)
155
{
156
continue;
157
}
158
159
GLuint object;
160
const char *label;
161
createGLObjectAndLabel(identifier, object, &label);
162
163
glLabelObjectEXT(identifier, object, 0, label);
164
ASSERT_GL_NO_ERROR();
165
166
std::vector<char> labelBuf(strlen(label) + 1);
167
GLsizei labelLengthBuf = 0;
168
glGetObjectLabelEXT(identifier, object, static_cast<GLsizei>(labelBuf.size()),
169
&labelLengthBuf, labelBuf.data());
170
ASSERT_GL_NO_ERROR();
171
172
EXPECT_EQ(static_cast<GLsizei>(strlen(label)), labelLengthBuf);
173
EXPECT_STREQ(label, labelBuf.data());
174
175
ASSERT_GL_NO_ERROR();
176
177
deleteGLObject(identifier, object);
178
179
glLabelObjectEXT(identifier, object, 0, label);
180
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
181
182
glGetObjectLabelEXT(identifier, object, static_cast<GLsizei>(labelBuf.size()),
183
&labelLengthBuf, labelBuf.data());
184
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
185
}
186
}
187
188
class DebugTestES3 : public DebugTest
189
{};
190
191
struct Message
192
{
193
GLenum source;
194
GLenum type;
195
GLuint id;
196
GLenum severity;
197
std::string message;
198
const void *userParam;
199
};
200
201
static void GL_APIENTRY Callback(GLenum source,
202
GLenum type,
203
GLuint id,
204
GLenum severity,
205
GLsizei length,
206
const GLchar *message,
207
const void *userParam)
208
{
209
Message m{source, type, id, severity, std::string(message, length), userParam};
210
std::vector<Message> *messages =
211
static_cast<std::vector<Message> *>(const_cast<void *>(userParam));
212
messages->push_back(m);
213
}
214
215
// Test that all ANGLE back-ends have GL_KHR_debug enabled
216
TEST_P(DebugTestES3, Enabled)
217
{
218
ASSERT_TRUE(mDebugExtensionAvailable);
219
}
220
221
// Test that when debug output is disabled, no message are outputted
222
TEST_P(DebugTestES3, DisabledOutput)
223
{
224
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
225
226
glDisable(GL_DEBUG_OUTPUT);
227
228
glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, 1,
229
GL_DEBUG_SEVERITY_NOTIFICATION, -1, "discarded");
230
231
GLint numMessages = 0;
232
glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
233
ASSERT_EQ(0, numMessages);
234
235
std::vector<Message> messages;
236
glDebugMessageCallbackKHR(Callback, &messages);
237
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
238
239
ASSERT_EQ(0u, messages.size());
240
}
241
242
// Test a basic flow of inserting a message and reading it back
243
TEST_P(DebugTestES3, InsertMessage)
244
{
245
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
246
247
const GLenum source = GL_DEBUG_SOURCE_APPLICATION;
248
const GLenum type = GL_DEBUG_TYPE_OTHER;
249
const GLuint id = 1;
250
const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION;
251
const std::string message = "Message";
252
253
glDebugMessageInsertKHR(source, type, id, severity, -1, message.c_str());
254
255
GLint numMessages = 0;
256
glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
257
ASSERT_EQ(1, numMessages);
258
259
GLint messageLength = 0;
260
glGetIntegerv(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, &messageLength);
261
EXPECT_EQ(static_cast<GLint>(message.length()) + 1, messageLength);
262
263
GLenum sourceBuf = 0;
264
GLenum typeBuf = 0;
265
GLenum idBuf = 0;
266
GLenum severityBuf = 0;
267
GLsizei lengthBuf = 0;
268
std::vector<char> messageBuf(messageLength);
269
GLuint ret =
270
glGetDebugMessageLogKHR(1, static_cast<GLsizei>(messageBuf.size()), &sourceBuf, &typeBuf,
271
&idBuf, &severityBuf, &lengthBuf, messageBuf.data());
272
EXPECT_EQ(1u, ret);
273
EXPECT_EQ(source, sourceBuf);
274
EXPECT_EQ(type, typeBuf);
275
EXPECT_EQ(id, idBuf);
276
EXPECT_EQ(severity, severityBuf);
277
EXPECT_EQ(lengthBuf, messageLength);
278
EXPECT_STREQ(message.c_str(), messageBuf.data());
279
280
glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
281
EXPECT_EQ(0, numMessages);
282
283
ASSERT_GL_NO_ERROR();
284
}
285
286
// Test inserting multiple messages
287
TEST_P(DebugTestES3, InsertMessageMultiple)
288
{
289
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
290
291
const GLenum source = GL_DEBUG_SOURCE_APPLICATION;
292
const GLenum type = GL_DEBUG_TYPE_OTHER;
293
const GLuint startID = 1;
294
const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION;
295
const char messageRepeatChar = 'm';
296
const size_t messageCount = 32;
297
298
for (size_t i = 0; i < messageCount; i++)
299
{
300
std::string message(i + 1, messageRepeatChar);
301
glDebugMessageInsertKHR(source, type, startID + static_cast<GLuint>(i), severity, -1,
302
message.c_str());
303
}
304
305
GLint numMessages = 0;
306
glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
307
ASSERT_EQ(static_cast<GLint>(messageCount), numMessages);
308
309
for (size_t i = 0; i < messageCount; i++)
310
{
311
glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
312
EXPECT_EQ(static_cast<GLint>(messageCount - i), numMessages);
313
314
std::string expectedMessage(i + 1, messageRepeatChar);
315
316
GLint messageLength = 0;
317
glGetIntegerv(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, &messageLength);
318
EXPECT_EQ(static_cast<GLint>(expectedMessage.length()) + 1, messageLength);
319
320
GLenum sourceBuf = 0;
321
GLenum typeBuf = 0;
322
GLenum idBuf = 0;
323
GLenum severityBuf = 0;
324
GLsizei lengthBuf = 0;
325
std::vector<char> messageBuf(messageLength);
326
GLuint ret =
327
glGetDebugMessageLogKHR(1, static_cast<GLsizei>(messageBuf.size()), &sourceBuf,
328
&typeBuf, &idBuf, &severityBuf, &lengthBuf, messageBuf.data());
329
EXPECT_EQ(1u, ret);
330
EXPECT_EQ(source, sourceBuf);
331
EXPECT_EQ(type, typeBuf);
332
EXPECT_EQ(startID + i, idBuf);
333
EXPECT_EQ(severity, severityBuf);
334
EXPECT_EQ(lengthBuf, messageLength);
335
EXPECT_STREQ(expectedMessage.c_str(), messageBuf.data());
336
}
337
338
glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
339
EXPECT_EQ(0, numMessages);
340
341
ASSERT_GL_NO_ERROR();
342
}
343
344
// Test using a debug callback
345
TEST_P(DebugTestES3, DebugCallback)
346
{
347
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
348
349
std::vector<Message> messages;
350
351
glDebugMessageCallbackKHR(Callback, &messages);
352
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
353
354
const GLenum source = GL_DEBUG_SOURCE_APPLICATION;
355
const GLenum type = GL_DEBUG_TYPE_OTHER;
356
const GLuint id = 1;
357
const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION;
358
const std::string message = "Message";
359
360
glDebugMessageInsertKHR(source, type, id, severity, -1, message.c_str());
361
362
GLint numMessages = 0;
363
glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
364
EXPECT_EQ(0, numMessages);
365
366
ASSERT_EQ(1u, messages.size());
367
368
const Message &m = messages.front();
369
EXPECT_EQ(source, m.source);
370
EXPECT_EQ(type, m.type);
371
EXPECT_EQ(id, m.id);
372
EXPECT_EQ(severity, m.severity);
373
EXPECT_EQ(message, m.message);
374
375
ASSERT_GL_NO_ERROR();
376
}
377
378
// Test the glGetPointervKHR entry point
379
TEST_P(DebugTestES3, GetPointer)
380
{
381
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
382
383
std::vector<Message> messages;
384
385
glDebugMessageCallbackKHR(Callback, &messages);
386
387
void *callback = nullptr;
388
glGetPointervKHR(GL_DEBUG_CALLBACK_FUNCTION, &callback);
389
EXPECT_EQ(reinterpret_cast<void *>(Callback), callback);
390
391
void *userData = nullptr;
392
glGetPointervKHR(GL_DEBUG_CALLBACK_USER_PARAM, &userData);
393
EXPECT_EQ(static_cast<void *>(&messages), userData);
394
}
395
396
// Test usage of message control. Example taken from GL_KHR_debug spec.
397
TEST_P(DebugTestES3, MessageControl1)
398
{
399
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
400
401
std::vector<Message> messages;
402
403
glDebugMessageCallbackKHR(Callback, &messages);
404
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
405
406
// Setup of the default active debug group: Filter everything in
407
glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
408
409
// Generate a debug marker debug output message
410
glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100,
411
GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 1");
412
413
// Push debug group 1
414
glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Message 2");
415
416
// Setup of the debug group 1: Filter everything out
417
glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE);
418
419
// This message won't appear in the debug output log of
420
glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100,
421
GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 3");
422
423
// Pop debug group 1, restore the volume control of the default debug group.
424
glPopDebugGroupKHR();
425
426
// Generate a debug marker debug output message
427
glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100,
428
GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 5");
429
430
// Expected debug output from the GL implementation
431
// Message 1
432
// Message 2
433
// Message 2
434
// Message 5
435
EXPECT_EQ(4u, messages.size());
436
EXPECT_STREQ(messages[0].message.c_str(), "Message 1");
437
EXPECT_STREQ(messages[1].message.c_str(), "Message 2");
438
EXPECT_STREQ(messages[2].message.c_str(), "Message 2");
439
EXPECT_STREQ(messages[3].message.c_str(), "Message 5");
440
441
ASSERT_GL_NO_ERROR();
442
}
443
444
// Test usage of message control. Example taken from GL_KHR_debug spec.
445
TEST_P(DebugTestES3, MessageControl2)
446
{
447
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
448
449
std::vector<Message> messages;
450
451
glDebugMessageCallbackKHR(Callback, &messages);
452
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
453
454
// Setup the control of de debug output for the default debug group
455
glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE);
456
glDebugMessageControlKHR(GL_DEBUG_SOURCE_THIRD_PARTY, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr,
457
GL_FALSE);
458
std::vector<GLuint> ids0 = {1234, 2345, 3456, 4567};
459
glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE,
460
static_cast<GLuint>(ids0.size()), ids0.data(), GL_FALSE);
461
glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, GL_DONT_CARE,
462
static_cast<GLuint>(ids0.size()), ids0.data(), GL_FALSE);
463
464
// Push debug group 1
465
// Inherit of the default debug group debug output volume control
466
// Filtered out by glDebugMessageControl
467
glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Message 1");
468
469
// In this section of the code, we are interested in performances.
470
glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE,
471
0, nullptr, GL_TRUE);
472
// But we already identify that some messages are not really useful for us.
473
std::vector<GLuint> ids1 = {5678, 6789};
474
glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE,
475
static_cast<GLuint>(ids1.size()), ids1.data(), GL_FALSE);
476
477
glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 1357,
478
GL_DEBUG_SEVERITY_MEDIUM, -1, "Message 2");
479
glDebugMessageInsertKHR(GL_DEBUG_SOURCE_THIRD_PARTY, // We still filter out these messages.
480
GL_DEBUG_TYPE_OTHER, 3579, GL_DEBUG_SEVERITY_MEDIUM, -1, "Message 3");
481
482
glPopDebugGroupKHR();
483
484
// Expected debug output from the GL implementation
485
// Message 2
486
EXPECT_EQ(1u, messages.size());
487
EXPECT_STREQ(messages[0].message.c_str(), "Message 2");
488
489
ASSERT_GL_NO_ERROR();
490
}
491
492
// Test basic usage of setting and getting labels
493
TEST_P(DebugTestES3, ObjectLabels)
494
{
495
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
496
497
GLuint renderbuffer = 0;
498
glGenRenderbuffers(1, &renderbuffer);
499
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
500
501
const std::string &label = "renderbuffer";
502
glObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, -1, label.c_str());
503
504
std::vector<char> labelBuf(label.length() + 1);
505
GLsizei labelLengthBuf = 0;
506
glGetObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()),
507
&labelLengthBuf, labelBuf.data());
508
509
EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
510
EXPECT_STREQ(label.c_str(), labelBuf.data());
511
512
ASSERT_GL_NO_ERROR();
513
514
glDeleteRenderbuffers(1, &renderbuffer);
515
516
glObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, -1, label.c_str());
517
EXPECT_GL_ERROR(GL_INVALID_VALUE);
518
519
glGetObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()),
520
&labelLengthBuf, labelBuf.data());
521
EXPECT_GL_ERROR(GL_INVALID_VALUE);
522
}
523
524
// Test basic usage of setting and getting labels
525
TEST_P(DebugTestES3, ObjectPtrLabels)
526
{
527
ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
528
529
GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
530
531
const std::string &label = "sync";
532
glObjectPtrLabelKHR(sync, -1, label.c_str());
533
534
std::vector<char> labelBuf(label.length() + 1);
535
GLsizei labelLengthBuf = 0;
536
glGetObjectPtrLabelKHR(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf,
537
labelBuf.data());
538
539
EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
540
EXPECT_STREQ(label.c_str(), labelBuf.data());
541
542
ASSERT_GL_NO_ERROR();
543
544
glDeleteSync(sync);
545
546
glObjectPtrLabelKHR(sync, -1, label.c_str());
547
EXPECT_GL_ERROR(GL_INVALID_VALUE);
548
549
glGetObjectPtrLabelKHR(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf,
550
labelBuf.data());
551
EXPECT_GL_ERROR(GL_INVALID_VALUE);
552
}
553
554
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DebugTestES3);
555
ANGLE_INSTANTIATE_TEST_ES3(DebugTestES3);
556
557
ANGLE_INSTANTIATE_TEST(DebugTest,
558
ANGLE_ALL_TEST_PLATFORMS_ES1,
559
ANGLE_ALL_TEST_PLATFORMS_ES2,
560
ANGLE_ALL_TEST_PLATFORMS_ES3,
561
ANGLE_ALL_TEST_PLATFORMS_ES31);
562
} // namespace angle
563
564