1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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
7*8975f5c5SAndroid Build Coastguard Worker // DebugTest.cpp : Tests of the GL_KHR_debug extension
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker namespace angle
14*8975f5c5SAndroid Build Coastguard Worker {
15*8975f5c5SAndroid Build Coastguard Worker constexpr char kBufferObjLabel[] = "buffer";
16*8975f5c5SAndroid Build Coastguard Worker constexpr char kShaderObjLabel[] = "shader";
17*8975f5c5SAndroid Build Coastguard Worker constexpr char kProgramObjLabel[] = "program";
18*8975f5c5SAndroid Build Coastguard Worker constexpr char kVertexArrayObjLabel[] = "vertexarray";
19*8975f5c5SAndroid Build Coastguard Worker constexpr char kQueryObjLabel[] = "query";
20*8975f5c5SAndroid Build Coastguard Worker constexpr char kProgramPipelineObjLabel[] = "programpipeline";
21*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kObjectTypes[] = {GL_BUFFER_OBJECT_EXT, GL_SHADER_OBJECT_EXT,
22*8975f5c5SAndroid Build Coastguard Worker GL_PROGRAM_OBJECT_EXT, GL_QUERY_OBJECT_EXT,
23*8975f5c5SAndroid Build Coastguard Worker GL_PROGRAM_PIPELINE_OBJECT_EXT, GL_VERTEX_ARRAY_OBJECT_EXT};
24*8975f5c5SAndroid Build Coastguard Worker
25*8975f5c5SAndroid Build Coastguard Worker class DebugTest : public ANGLETest<>
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker protected:
DebugTest()28*8975f5c5SAndroid Build Coastguard Worker DebugTest() : mDebugExtensionAvailable(false)
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(128);
31*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(128);
32*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
33*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
34*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
35*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
36*8975f5c5SAndroid Build Coastguard Worker setConfigDepthBits(24);
37*8975f5c5SAndroid Build Coastguard Worker setDebugEnabled(true);
38*8975f5c5SAndroid Build Coastguard Worker }
39*8975f5c5SAndroid Build Coastguard Worker
testSetUp()40*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker mDebugExtensionAvailable = IsGLExtensionEnabled("GL_KHR_debug");
43*8975f5c5SAndroid Build Coastguard Worker if (mDebugExtensionAvailable)
44*8975f5c5SAndroid Build Coastguard Worker {
45*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEBUG_OUTPUT);
46*8975f5c5SAndroid Build Coastguard Worker }
47*8975f5c5SAndroid Build Coastguard Worker }
48*8975f5c5SAndroid Build Coastguard Worker
49*8975f5c5SAndroid Build Coastguard Worker bool mDebugExtensionAvailable;
50*8975f5c5SAndroid Build Coastguard Worker };
51*8975f5c5SAndroid Build Coastguard Worker
createGLObjectAndLabel(GLenum identifier,GLuint & object,const char ** label)52*8975f5c5SAndroid Build Coastguard Worker void createGLObjectAndLabel(GLenum identifier, GLuint &object, const char **label)
53*8975f5c5SAndroid Build Coastguard Worker {
54*8975f5c5SAndroid Build Coastguard Worker switch (identifier)
55*8975f5c5SAndroid Build Coastguard Worker {
56*8975f5c5SAndroid Build Coastguard Worker case GL_BUFFER_OBJECT_EXT:
57*8975f5c5SAndroid Build Coastguard Worker glGenBuffers(1, &object);
58*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, object);
59*8975f5c5SAndroid Build Coastguard Worker *label = kBufferObjLabel;
60*8975f5c5SAndroid Build Coastguard Worker break;
61*8975f5c5SAndroid Build Coastguard Worker case GL_SHADER_OBJECT_EXT:
62*8975f5c5SAndroid Build Coastguard Worker object = glCreateShader(GL_VERTEX_SHADER);
63*8975f5c5SAndroid Build Coastguard Worker *label = kShaderObjLabel;
64*8975f5c5SAndroid Build Coastguard Worker break;
65*8975f5c5SAndroid Build Coastguard Worker case GL_PROGRAM_OBJECT_EXT:
66*8975f5c5SAndroid Build Coastguard Worker object = glCreateProgram();
67*8975f5c5SAndroid Build Coastguard Worker *label = kProgramObjLabel;
68*8975f5c5SAndroid Build Coastguard Worker break;
69*8975f5c5SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY_OBJECT_EXT:
70*8975f5c5SAndroid Build Coastguard Worker glGenVertexArrays(1, &object);
71*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(object);
72*8975f5c5SAndroid Build Coastguard Worker *label = kVertexArrayObjLabel;
73*8975f5c5SAndroid Build Coastguard Worker break;
74*8975f5c5SAndroid Build Coastguard Worker case GL_QUERY_OBJECT_EXT:
75*8975f5c5SAndroid Build Coastguard Worker glGenQueries(1, &object);
76*8975f5c5SAndroid Build Coastguard Worker glBeginQuery(GL_ANY_SAMPLES_PASSED, object);
77*8975f5c5SAndroid Build Coastguard Worker *label = kQueryObjLabel;
78*8975f5c5SAndroid Build Coastguard Worker break;
79*8975f5c5SAndroid Build Coastguard Worker case GL_PROGRAM_PIPELINE_OBJECT_EXT:
80*8975f5c5SAndroid Build Coastguard Worker glGenProgramPipelines(1, &object);
81*8975f5c5SAndroid Build Coastguard Worker glBindProgramPipeline(object);
82*8975f5c5SAndroid Build Coastguard Worker *label = kProgramPipelineObjLabel;
83*8975f5c5SAndroid Build Coastguard Worker break;
84*8975f5c5SAndroid Build Coastguard Worker default:
85*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
86*8975f5c5SAndroid Build Coastguard Worker break;
87*8975f5c5SAndroid Build Coastguard Worker }
88*8975f5c5SAndroid Build Coastguard Worker }
89*8975f5c5SAndroid Build Coastguard Worker
deleteGLObject(GLenum identifier,GLuint & object)90*8975f5c5SAndroid Build Coastguard Worker void deleteGLObject(GLenum identifier, GLuint &object)
91*8975f5c5SAndroid Build Coastguard Worker {
92*8975f5c5SAndroid Build Coastguard Worker switch (identifier)
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker case GL_BUFFER_OBJECT_EXT:
95*8975f5c5SAndroid Build Coastguard Worker glDeleteBuffers(1, &object);
96*8975f5c5SAndroid Build Coastguard Worker break;
97*8975f5c5SAndroid Build Coastguard Worker case GL_SHADER_OBJECT_EXT:
98*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(object);
99*8975f5c5SAndroid Build Coastguard Worker break;
100*8975f5c5SAndroid Build Coastguard Worker case GL_PROGRAM_OBJECT_EXT:
101*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(object);
102*8975f5c5SAndroid Build Coastguard Worker break;
103*8975f5c5SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY_OBJECT_EXT:
104*8975f5c5SAndroid Build Coastguard Worker glDeleteVertexArrays(1, &object);
105*8975f5c5SAndroid Build Coastguard Worker break;
106*8975f5c5SAndroid Build Coastguard Worker case GL_QUERY_OBJECT_EXT:
107*8975f5c5SAndroid Build Coastguard Worker glEndQuery(GL_ANY_SAMPLES_PASSED);
108*8975f5c5SAndroid Build Coastguard Worker glDeleteQueries(1, &object);
109*8975f5c5SAndroid Build Coastguard Worker break;
110*8975f5c5SAndroid Build Coastguard Worker case GL_PROGRAM_PIPELINE_OBJECT_EXT:
111*8975f5c5SAndroid Build Coastguard Worker glDeleteProgramPipelines(1, &object);
112*8975f5c5SAndroid Build Coastguard Worker break;
113*8975f5c5SAndroid Build Coastguard Worker default:
114*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
115*8975f5c5SAndroid Build Coastguard Worker break;
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker
119*8975f5c5SAndroid Build Coastguard Worker // Test basic usage of setting and getting labels using GL_EXT_debug_label
TEST_P(DebugTest,ObjectLabelsEXT)120*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTest, ObjectLabelsEXT)
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_debug_label"));
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker for (const GLenum identifier : kObjectTypes)
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker bool skip = false;
127*8975f5c5SAndroid Build Coastguard Worker switch (identifier)
128*8975f5c5SAndroid Build Coastguard Worker {
129*8975f5c5SAndroid Build Coastguard Worker case GL_PROGRAM_PIPELINE_OBJECT_EXT:
130*8975f5c5SAndroid Build Coastguard Worker if (!(getClientMajorVersion() >= 3 && getClientMinorVersion() >= 1) ||
131*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_EXT_separate_shader_objects"))
132*8975f5c5SAndroid Build Coastguard Worker {
133*8975f5c5SAndroid Build Coastguard Worker skip = true;
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker break;
136*8975f5c5SAndroid Build Coastguard Worker case GL_QUERY_OBJECT_EXT:
137*8975f5c5SAndroid Build Coastguard Worker // GLES3 context is required for glGenQueries()
138*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() < 3 ||
139*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_EXT_occlusion_query_boolean"))
140*8975f5c5SAndroid Build Coastguard Worker {
141*8975f5c5SAndroid Build Coastguard Worker skip = true;
142*8975f5c5SAndroid Build Coastguard Worker }
143*8975f5c5SAndroid Build Coastguard Worker break;
144*8975f5c5SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY_OBJECT_EXT:
145*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() < 3)
146*8975f5c5SAndroid Build Coastguard Worker {
147*8975f5c5SAndroid Build Coastguard Worker skip = true;
148*8975f5c5SAndroid Build Coastguard Worker }
149*8975f5c5SAndroid Build Coastguard Worker break;
150*8975f5c5SAndroid Build Coastguard Worker default:
151*8975f5c5SAndroid Build Coastguard Worker break;
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker
154*8975f5c5SAndroid Build Coastguard Worker // if object enum is not supported, move on to the next object type
155*8975f5c5SAndroid Build Coastguard Worker if (skip)
156*8975f5c5SAndroid Build Coastguard Worker {
157*8975f5c5SAndroid Build Coastguard Worker continue;
158*8975f5c5SAndroid Build Coastguard Worker }
159*8975f5c5SAndroid Build Coastguard Worker
160*8975f5c5SAndroid Build Coastguard Worker GLuint object;
161*8975f5c5SAndroid Build Coastguard Worker const char *label;
162*8975f5c5SAndroid Build Coastguard Worker createGLObjectAndLabel(identifier, object, &label);
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker glLabelObjectEXT(identifier, object, 0, label);
165*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
166*8975f5c5SAndroid Build Coastguard Worker
167*8975f5c5SAndroid Build Coastguard Worker std::vector<char> labelBuf(strlen(label) + 1);
168*8975f5c5SAndroid Build Coastguard Worker GLsizei labelLengthBuf = 0;
169*8975f5c5SAndroid Build Coastguard Worker glGetObjectLabelEXT(identifier, object, static_cast<GLsizei>(labelBuf.size()),
170*8975f5c5SAndroid Build Coastguard Worker &labelLengthBuf, labelBuf.data());
171*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
172*8975f5c5SAndroid Build Coastguard Worker
173*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLsizei>(strlen(label)), labelLengthBuf);
174*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(label, labelBuf.data());
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
177*8975f5c5SAndroid Build Coastguard Worker
178*8975f5c5SAndroid Build Coastguard Worker deleteGLObject(identifier, object);
179*8975f5c5SAndroid Build Coastguard Worker
180*8975f5c5SAndroid Build Coastguard Worker glLabelObjectEXT(identifier, object, 0, label);
181*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
182*8975f5c5SAndroid Build Coastguard Worker
183*8975f5c5SAndroid Build Coastguard Worker glGetObjectLabelEXT(identifier, object, static_cast<GLsizei>(labelBuf.size()),
184*8975f5c5SAndroid Build Coastguard Worker &labelLengthBuf, labelBuf.data());
185*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
186*8975f5c5SAndroid Build Coastguard Worker }
187*8975f5c5SAndroid Build Coastguard Worker }
188*8975f5c5SAndroid Build Coastguard Worker
189*8975f5c5SAndroid Build Coastguard Worker class DebugTestES3 : public DebugTest
190*8975f5c5SAndroid Build Coastguard Worker {};
191*8975f5c5SAndroid Build Coastguard Worker
192*8975f5c5SAndroid Build Coastguard Worker class DebugTestES32 : public DebugTestES3
193*8975f5c5SAndroid Build Coastguard Worker {
testSetUp()194*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override { ; }
195*8975f5c5SAndroid Build Coastguard Worker };
196*8975f5c5SAndroid Build Coastguard Worker
197*8975f5c5SAndroid Build Coastguard Worker struct Message
198*8975f5c5SAndroid Build Coastguard Worker {
199*8975f5c5SAndroid Build Coastguard Worker GLenum source;
200*8975f5c5SAndroid Build Coastguard Worker GLenum type;
201*8975f5c5SAndroid Build Coastguard Worker GLuint id;
202*8975f5c5SAndroid Build Coastguard Worker GLenum severity;
203*8975f5c5SAndroid Build Coastguard Worker std::string message;
204*8975f5c5SAndroid Build Coastguard Worker const void *userParam;
205*8975f5c5SAndroid Build Coastguard Worker };
206*8975f5c5SAndroid Build Coastguard Worker
Callback(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar * message,const void * userParam)207*8975f5c5SAndroid Build Coastguard Worker static void GL_APIENTRY Callback(GLenum source,
208*8975f5c5SAndroid Build Coastguard Worker GLenum type,
209*8975f5c5SAndroid Build Coastguard Worker GLuint id,
210*8975f5c5SAndroid Build Coastguard Worker GLenum severity,
211*8975f5c5SAndroid Build Coastguard Worker GLsizei length,
212*8975f5c5SAndroid Build Coastguard Worker const GLchar *message,
213*8975f5c5SAndroid Build Coastguard Worker const void *userParam)
214*8975f5c5SAndroid Build Coastguard Worker {
215*8975f5c5SAndroid Build Coastguard Worker Message m{source, type, id, severity, std::string(message, length), userParam};
216*8975f5c5SAndroid Build Coastguard Worker std::vector<Message> *messages =
217*8975f5c5SAndroid Build Coastguard Worker static_cast<std::vector<Message> *>(const_cast<void *>(userParam));
218*8975f5c5SAndroid Build Coastguard Worker messages->push_back(m);
219*8975f5c5SAndroid Build Coastguard Worker }
220*8975f5c5SAndroid Build Coastguard Worker
221*8975f5c5SAndroid Build Coastguard Worker // Test that all ANGLE back-ends have GL_KHR_debug enabled
TEST_P(DebugTestES3,Enabled)222*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, Enabled)
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(mDebugExtensionAvailable);
225*8975f5c5SAndroid Build Coastguard Worker }
226*8975f5c5SAndroid Build Coastguard Worker
227*8975f5c5SAndroid Build Coastguard Worker // Test that when debug output is disabled, no message are outputted
TEST_P(DebugTestES3,DisabledOutput)228*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, DisabledOutput)
229*8975f5c5SAndroid Build Coastguard Worker {
230*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEBUG_OUTPUT);
233*8975f5c5SAndroid Build Coastguard Worker
234*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, 1,
235*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_NOTIFICATION, -1, "discarded");
236*8975f5c5SAndroid Build Coastguard Worker
237*8975f5c5SAndroid Build Coastguard Worker GLint numMessages = 0;
238*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
239*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, numMessages);
240*8975f5c5SAndroid Build Coastguard Worker
241*8975f5c5SAndroid Build Coastguard Worker std::vector<Message> messages;
242*8975f5c5SAndroid Build Coastguard Worker glDebugMessageCallbackKHR(Callback, &messages);
243*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
244*8975f5c5SAndroid Build Coastguard Worker
245*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0u, messages.size());
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker
248*8975f5c5SAndroid Build Coastguard Worker // Test a basic flow of inserting a message and reading it back
TEST_P(DebugTestES3,InsertMessage)249*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, InsertMessage)
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
252*8975f5c5SAndroid Build Coastguard Worker
253*8975f5c5SAndroid Build Coastguard Worker const GLenum source = GL_DEBUG_SOURCE_APPLICATION;
254*8975f5c5SAndroid Build Coastguard Worker const GLenum type = GL_DEBUG_TYPE_OTHER;
255*8975f5c5SAndroid Build Coastguard Worker const GLuint id = 1;
256*8975f5c5SAndroid Build Coastguard Worker const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION;
257*8975f5c5SAndroid Build Coastguard Worker const std::string message = "Message";
258*8975f5c5SAndroid Build Coastguard Worker
259*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(source, type, id, severity, -1, message.c_str());
260*8975f5c5SAndroid Build Coastguard Worker
261*8975f5c5SAndroid Build Coastguard Worker GLint numMessages = 0;
262*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
263*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(1, numMessages);
264*8975f5c5SAndroid Build Coastguard Worker
265*8975f5c5SAndroid Build Coastguard Worker GLint messageLength = 0;
266*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, &messageLength);
267*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLint>(message.length()) + 1, messageLength);
268*8975f5c5SAndroid Build Coastguard Worker
269*8975f5c5SAndroid Build Coastguard Worker GLenum sourceBuf = 0;
270*8975f5c5SAndroid Build Coastguard Worker GLenum typeBuf = 0;
271*8975f5c5SAndroid Build Coastguard Worker GLenum idBuf = 0;
272*8975f5c5SAndroid Build Coastguard Worker GLenum severityBuf = 0;
273*8975f5c5SAndroid Build Coastguard Worker GLsizei lengthBuf = 0;
274*8975f5c5SAndroid Build Coastguard Worker std::vector<char> messageBuf(messageLength);
275*8975f5c5SAndroid Build Coastguard Worker GLuint ret =
276*8975f5c5SAndroid Build Coastguard Worker glGetDebugMessageLogKHR(1, static_cast<GLsizei>(messageBuf.size()), &sourceBuf, &typeBuf,
277*8975f5c5SAndroid Build Coastguard Worker &idBuf, &severityBuf, &lengthBuf, messageBuf.data());
278*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(1u, ret);
279*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(source, sourceBuf);
280*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(type, typeBuf);
281*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(id, idBuf);
282*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(severity, severityBuf);
283*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(lengthBuf, messageLength);
284*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(message.c_str(), messageBuf.data());
285*8975f5c5SAndroid Build Coastguard Worker
286*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
287*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(0, numMessages);
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
290*8975f5c5SAndroid Build Coastguard Worker }
291*8975f5c5SAndroid Build Coastguard Worker
292*8975f5c5SAndroid Build Coastguard Worker // Test inserting multiple messages
TEST_P(DebugTestES3,InsertMessageMultiple)293*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, InsertMessageMultiple)
294*8975f5c5SAndroid Build Coastguard Worker {
295*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
296*8975f5c5SAndroid Build Coastguard Worker
297*8975f5c5SAndroid Build Coastguard Worker const GLenum source = GL_DEBUG_SOURCE_APPLICATION;
298*8975f5c5SAndroid Build Coastguard Worker const GLenum type = GL_DEBUG_TYPE_OTHER;
299*8975f5c5SAndroid Build Coastguard Worker const GLuint startID = 1;
300*8975f5c5SAndroid Build Coastguard Worker const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION;
301*8975f5c5SAndroid Build Coastguard Worker const char messageRepeatChar = 'm';
302*8975f5c5SAndroid Build Coastguard Worker const size_t messageCount = 32;
303*8975f5c5SAndroid Build Coastguard Worker
304*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < messageCount; i++)
305*8975f5c5SAndroid Build Coastguard Worker {
306*8975f5c5SAndroid Build Coastguard Worker std::string message(i + 1, messageRepeatChar);
307*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(source, type, startID + static_cast<GLuint>(i), severity, -1,
308*8975f5c5SAndroid Build Coastguard Worker message.c_str());
309*8975f5c5SAndroid Build Coastguard Worker }
310*8975f5c5SAndroid Build Coastguard Worker
311*8975f5c5SAndroid Build Coastguard Worker GLint numMessages = 0;
312*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
313*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<GLint>(messageCount), numMessages);
314*8975f5c5SAndroid Build Coastguard Worker
315*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < messageCount; i++)
316*8975f5c5SAndroid Build Coastguard Worker {
317*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
318*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLint>(messageCount - i), numMessages);
319*8975f5c5SAndroid Build Coastguard Worker
320*8975f5c5SAndroid Build Coastguard Worker std::string expectedMessage(i + 1, messageRepeatChar);
321*8975f5c5SAndroid Build Coastguard Worker
322*8975f5c5SAndroid Build Coastguard Worker GLint messageLength = 0;
323*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, &messageLength);
324*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLint>(expectedMessage.length()) + 1, messageLength);
325*8975f5c5SAndroid Build Coastguard Worker
326*8975f5c5SAndroid Build Coastguard Worker GLenum sourceBuf = 0;
327*8975f5c5SAndroid Build Coastguard Worker GLenum typeBuf = 0;
328*8975f5c5SAndroid Build Coastguard Worker GLenum idBuf = 0;
329*8975f5c5SAndroid Build Coastguard Worker GLenum severityBuf = 0;
330*8975f5c5SAndroid Build Coastguard Worker GLsizei lengthBuf = 0;
331*8975f5c5SAndroid Build Coastguard Worker std::vector<char> messageBuf(messageLength);
332*8975f5c5SAndroid Build Coastguard Worker GLuint ret =
333*8975f5c5SAndroid Build Coastguard Worker glGetDebugMessageLogKHR(1, static_cast<GLsizei>(messageBuf.size()), &sourceBuf,
334*8975f5c5SAndroid Build Coastguard Worker &typeBuf, &idBuf, &severityBuf, &lengthBuf, messageBuf.data());
335*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(1u, ret);
336*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(source, sourceBuf);
337*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(type, typeBuf);
338*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(startID + i, idBuf);
339*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(severity, severityBuf);
340*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(lengthBuf, messageLength);
341*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(expectedMessage.c_str(), messageBuf.data());
342*8975f5c5SAndroid Build Coastguard Worker }
343*8975f5c5SAndroid Build Coastguard Worker
344*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
345*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(0, numMessages);
346*8975f5c5SAndroid Build Coastguard Worker
347*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
348*8975f5c5SAndroid Build Coastguard Worker }
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker // Test using a debug callback
TEST_P(DebugTestES3,DebugCallback)351*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, DebugCallback)
352*8975f5c5SAndroid Build Coastguard Worker {
353*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
354*8975f5c5SAndroid Build Coastguard Worker
355*8975f5c5SAndroid Build Coastguard Worker std::vector<Message> messages;
356*8975f5c5SAndroid Build Coastguard Worker
357*8975f5c5SAndroid Build Coastguard Worker glDebugMessageCallbackKHR(Callback, &messages);
358*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
359*8975f5c5SAndroid Build Coastguard Worker
360*8975f5c5SAndroid Build Coastguard Worker const GLenum source = GL_DEBUG_SOURCE_APPLICATION;
361*8975f5c5SAndroid Build Coastguard Worker const GLenum type = GL_DEBUG_TYPE_OTHER;
362*8975f5c5SAndroid Build Coastguard Worker const GLuint id = 1;
363*8975f5c5SAndroid Build Coastguard Worker const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION;
364*8975f5c5SAndroid Build Coastguard Worker const std::string message = "Message";
365*8975f5c5SAndroid Build Coastguard Worker
366*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(source, type, id, severity, -1, message.c_str());
367*8975f5c5SAndroid Build Coastguard Worker
368*8975f5c5SAndroid Build Coastguard Worker GLint numMessages = 0;
369*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
370*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(0, numMessages);
371*8975f5c5SAndroid Build Coastguard Worker
372*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(1u, messages.size());
373*8975f5c5SAndroid Build Coastguard Worker
374*8975f5c5SAndroid Build Coastguard Worker const Message &m = messages.front();
375*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(source, m.source);
376*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(type, m.type);
377*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(id, m.id);
378*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(severity, m.severity);
379*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(message, m.message);
380*8975f5c5SAndroid Build Coastguard Worker
381*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
382*8975f5c5SAndroid Build Coastguard Worker }
383*8975f5c5SAndroid Build Coastguard Worker
384*8975f5c5SAndroid Build Coastguard Worker // Test the glGetPointervKHR entry point
TEST_P(DebugTestES3,GetPointer)385*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, GetPointer)
386*8975f5c5SAndroid Build Coastguard Worker {
387*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
388*8975f5c5SAndroid Build Coastguard Worker
389*8975f5c5SAndroid Build Coastguard Worker std::vector<Message> messages;
390*8975f5c5SAndroid Build Coastguard Worker
391*8975f5c5SAndroid Build Coastguard Worker glDebugMessageCallbackKHR(Callback, &messages);
392*8975f5c5SAndroid Build Coastguard Worker
393*8975f5c5SAndroid Build Coastguard Worker void *callback = nullptr;
394*8975f5c5SAndroid Build Coastguard Worker glGetPointervKHR(GL_DEBUG_CALLBACK_FUNCTION, &callback);
395*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(reinterpret_cast<void *>(Callback), callback);
396*8975f5c5SAndroid Build Coastguard Worker
397*8975f5c5SAndroid Build Coastguard Worker void *userData = nullptr;
398*8975f5c5SAndroid Build Coastguard Worker glGetPointervKHR(GL_DEBUG_CALLBACK_USER_PARAM, &userData);
399*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<void *>(&messages), userData);
400*8975f5c5SAndroid Build Coastguard Worker }
401*8975f5c5SAndroid Build Coastguard Worker
402*8975f5c5SAndroid Build Coastguard Worker // Test usage of message control. Example taken from GL_KHR_debug spec.
TEST_P(DebugTestES3,MessageControl1)403*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, MessageControl1)
404*8975f5c5SAndroid Build Coastguard Worker {
405*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
406*8975f5c5SAndroid Build Coastguard Worker
407*8975f5c5SAndroid Build Coastguard Worker std::vector<Message> messages;
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker glDebugMessageCallbackKHR(Callback, &messages);
410*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
411*8975f5c5SAndroid Build Coastguard Worker
412*8975f5c5SAndroid Build Coastguard Worker // Setup of the default active debug group: Filter everything in
413*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
414*8975f5c5SAndroid Build Coastguard Worker
415*8975f5c5SAndroid Build Coastguard Worker // Generate a debug marker debug output message
416*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100,
417*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 1");
418*8975f5c5SAndroid Build Coastguard Worker
419*8975f5c5SAndroid Build Coastguard Worker // Push debug group 1
420*8975f5c5SAndroid Build Coastguard Worker glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Message 2");
421*8975f5c5SAndroid Build Coastguard Worker
422*8975f5c5SAndroid Build Coastguard Worker // Setup of the debug group 1: Filter everything out
423*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE);
424*8975f5c5SAndroid Build Coastguard Worker
425*8975f5c5SAndroid Build Coastguard Worker // This message won't appear in the debug output log of
426*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100,
427*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 3");
428*8975f5c5SAndroid Build Coastguard Worker
429*8975f5c5SAndroid Build Coastguard Worker // Pop debug group 1, restore the volume control of the default debug group.
430*8975f5c5SAndroid Build Coastguard Worker glPopDebugGroupKHR();
431*8975f5c5SAndroid Build Coastguard Worker
432*8975f5c5SAndroid Build Coastguard Worker // Generate a debug marker debug output message
433*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100,
434*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 5");
435*8975f5c5SAndroid Build Coastguard Worker
436*8975f5c5SAndroid Build Coastguard Worker // Expected debug output from the GL implementation
437*8975f5c5SAndroid Build Coastguard Worker // Message 1
438*8975f5c5SAndroid Build Coastguard Worker // Message 2
439*8975f5c5SAndroid Build Coastguard Worker // Message 2
440*8975f5c5SAndroid Build Coastguard Worker // Message 5
441*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(4u, messages.size());
442*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(messages[0].message.c_str(), "Message 1");
443*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(messages[1].message.c_str(), "Message 2");
444*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(messages[2].message.c_str(), "Message 2");
445*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(messages[3].message.c_str(), "Message 5");
446*8975f5c5SAndroid Build Coastguard Worker
447*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
448*8975f5c5SAndroid Build Coastguard Worker }
449*8975f5c5SAndroid Build Coastguard Worker
450*8975f5c5SAndroid Build Coastguard Worker // Test usage of message control. Example taken from GL_KHR_debug spec.
TEST_P(DebugTestES3,MessageControl2)451*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, MessageControl2)
452*8975f5c5SAndroid Build Coastguard Worker {
453*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
454*8975f5c5SAndroid Build Coastguard Worker
455*8975f5c5SAndroid Build Coastguard Worker std::vector<Message> messages;
456*8975f5c5SAndroid Build Coastguard Worker
457*8975f5c5SAndroid Build Coastguard Worker glDebugMessageCallbackKHR(Callback, &messages);
458*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
459*8975f5c5SAndroid Build Coastguard Worker
460*8975f5c5SAndroid Build Coastguard Worker // Setup the control of de debug output for the default debug group
461*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE);
462*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DEBUG_SOURCE_THIRD_PARTY, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr,
463*8975f5c5SAndroid Build Coastguard Worker GL_FALSE);
464*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> ids0 = {1234, 2345, 3456, 4567};
465*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE,
466*8975f5c5SAndroid Build Coastguard Worker static_cast<GLuint>(ids0.size()), ids0.data(), GL_FALSE);
467*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, GL_DONT_CARE,
468*8975f5c5SAndroid Build Coastguard Worker static_cast<GLuint>(ids0.size()), ids0.data(), GL_FALSE);
469*8975f5c5SAndroid Build Coastguard Worker
470*8975f5c5SAndroid Build Coastguard Worker // Push debug group 1
471*8975f5c5SAndroid Build Coastguard Worker // Inherit of the default debug group debug output volume control
472*8975f5c5SAndroid Build Coastguard Worker // Filtered out by glDebugMessageControl
473*8975f5c5SAndroid Build Coastguard Worker glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Message 1");
474*8975f5c5SAndroid Build Coastguard Worker
475*8975f5c5SAndroid Build Coastguard Worker // In this section of the code, we are interested in performances.
476*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE,
477*8975f5c5SAndroid Build Coastguard Worker 0, nullptr, GL_TRUE);
478*8975f5c5SAndroid Build Coastguard Worker // But we already identify that some messages are not really useful for us.
479*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> ids1 = {5678, 6789};
480*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE,
481*8975f5c5SAndroid Build Coastguard Worker static_cast<GLuint>(ids1.size()), ids1.data(), GL_FALSE);
482*8975f5c5SAndroid Build Coastguard Worker
483*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 1357,
484*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_MEDIUM, -1, "Message 2");
485*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_THIRD_PARTY, // We still filter out these messages.
486*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_TYPE_OTHER, 3579, GL_DEBUG_SEVERITY_MEDIUM, -1, "Message 3");
487*8975f5c5SAndroid Build Coastguard Worker
488*8975f5c5SAndroid Build Coastguard Worker glPopDebugGroupKHR();
489*8975f5c5SAndroid Build Coastguard Worker
490*8975f5c5SAndroid Build Coastguard Worker // Expected debug output from the GL implementation
491*8975f5c5SAndroid Build Coastguard Worker // Message 2
492*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(1u, messages.size());
493*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(messages[0].message.c_str(), "Message 2");
494*8975f5c5SAndroid Build Coastguard Worker
495*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
496*8975f5c5SAndroid Build Coastguard Worker }
497*8975f5c5SAndroid Build Coastguard Worker
498*8975f5c5SAndroid Build Coastguard Worker // Test basic usage of setting and getting labels
TEST_P(DebugTestES3,ObjectLabelsKHR)499*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, ObjectLabelsKHR)
500*8975f5c5SAndroid Build Coastguard Worker {
501*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
502*8975f5c5SAndroid Build Coastguard Worker
503*8975f5c5SAndroid Build Coastguard Worker GLuint renderbuffer = 0;
504*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &renderbuffer);
505*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
506*8975f5c5SAndroid Build Coastguard Worker
507*8975f5c5SAndroid Build Coastguard Worker const std::string &label = "renderbuffer";
508*8975f5c5SAndroid Build Coastguard Worker glObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, -1, label.c_str());
509*8975f5c5SAndroid Build Coastguard Worker
510*8975f5c5SAndroid Build Coastguard Worker std::vector<char> labelBuf(label.length() + 1);
511*8975f5c5SAndroid Build Coastguard Worker GLsizei labelLengthBuf = 0;
512*8975f5c5SAndroid Build Coastguard Worker glGetObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()),
513*8975f5c5SAndroid Build Coastguard Worker &labelLengthBuf, labelBuf.data());
514*8975f5c5SAndroid Build Coastguard Worker
515*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
516*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(label.c_str(), labelBuf.data());
517*8975f5c5SAndroid Build Coastguard Worker
518*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
519*8975f5c5SAndroid Build Coastguard Worker
520*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &renderbuffer);
521*8975f5c5SAndroid Build Coastguard Worker
522*8975f5c5SAndroid Build Coastguard Worker glObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, -1, label.c_str());
523*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
524*8975f5c5SAndroid Build Coastguard Worker
525*8975f5c5SAndroid Build Coastguard Worker glGetObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()),
526*8975f5c5SAndroid Build Coastguard Worker &labelLengthBuf, labelBuf.data());
527*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
528*8975f5c5SAndroid Build Coastguard Worker }
529*8975f5c5SAndroid Build Coastguard Worker
530*8975f5c5SAndroid Build Coastguard Worker // Test basic usage of setting and getting labels
TEST_P(DebugTestES3,ObjectPtrLabelsKHR)531*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, ObjectPtrLabelsKHR)
532*8975f5c5SAndroid Build Coastguard Worker {
533*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
534*8975f5c5SAndroid Build Coastguard Worker
535*8975f5c5SAndroid Build Coastguard Worker GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
536*8975f5c5SAndroid Build Coastguard Worker
537*8975f5c5SAndroid Build Coastguard Worker const std::string &label = "sync";
538*8975f5c5SAndroid Build Coastguard Worker glObjectPtrLabelKHR(sync, -1, label.c_str());
539*8975f5c5SAndroid Build Coastguard Worker
540*8975f5c5SAndroid Build Coastguard Worker std::vector<char> labelBuf(label.length() + 1);
541*8975f5c5SAndroid Build Coastguard Worker GLsizei labelLengthBuf = 0;
542*8975f5c5SAndroid Build Coastguard Worker glGetObjectPtrLabelKHR(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf,
543*8975f5c5SAndroid Build Coastguard Worker labelBuf.data());
544*8975f5c5SAndroid Build Coastguard Worker
545*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
546*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(label.c_str(), labelBuf.data());
547*8975f5c5SAndroid Build Coastguard Worker
548*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
549*8975f5c5SAndroid Build Coastguard Worker
550*8975f5c5SAndroid Build Coastguard Worker glDeleteSync(sync);
551*8975f5c5SAndroid Build Coastguard Worker
552*8975f5c5SAndroid Build Coastguard Worker glObjectPtrLabelKHR(sync, -1, label.c_str());
553*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
554*8975f5c5SAndroid Build Coastguard Worker
555*8975f5c5SAndroid Build Coastguard Worker glGetObjectPtrLabelKHR(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf,
556*8975f5c5SAndroid Build Coastguard Worker labelBuf.data());
557*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
558*8975f5c5SAndroid Build Coastguard Worker }
559*8975f5c5SAndroid Build Coastguard Worker
560*8975f5c5SAndroid Build Coastguard Worker // Test setting labels before, during and after rendering. The debug markers can be validated by
561*8975f5c5SAndroid Build Coastguard Worker // capturing this test under a graphics debugger.
TEST_P(DebugTestES3,Rendering)562*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES3, Rendering)
563*8975f5c5SAndroid Build Coastguard Worker {
564*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
565*8975f5c5SAndroid Build Coastguard Worker
566*8975f5c5SAndroid Build Coastguard Worker // The test produces the following hierarchy:
567*8975f5c5SAndroid Build Coastguard Worker //
568*8975f5c5SAndroid Build Coastguard Worker // Group: Before Draw
569*8975f5c5SAndroid Build Coastguard Worker // Message: Before Draw Marker
570*8975f5c5SAndroid Build Coastguard Worker // Message: In Group 1 Marker
571*8975f5c5SAndroid Build Coastguard Worker // glDrawArrays
572*8975f5c5SAndroid Build Coastguard Worker // Group: After Draw 1
573*8975f5c5SAndroid Build Coastguard Worker // glDrawArrays
574*8975f5c5SAndroid Build Coastguard Worker // Message: In Group 2 Marker
575*8975f5c5SAndroid Build Coastguard Worker //
576*8975f5c5SAndroid Build Coastguard Worker // glCopyTexImage <-- this breaks the render pass
577*8975f5c5SAndroid Build Coastguard Worker //
578*8975f5c5SAndroid Build Coastguard Worker // glDrawArrays
579*8975f5c5SAndroid Build Coastguard Worker // End Group
580*8975f5c5SAndroid Build Coastguard Worker //
581*8975f5c5SAndroid Build Coastguard Worker // glCopyTexImage <-- this breaks the render pass
582*8975f5c5SAndroid Build Coastguard Worker //
583*8975f5c5SAndroid Build Coastguard Worker // Group: After Draw 2
584*8975f5c5SAndroid Build Coastguard Worker // glDrawArrays
585*8975f5c5SAndroid Build Coastguard Worker //
586*8975f5c5SAndroid Build Coastguard Worker // glCopyTexImage <-- this breaks the render pass
587*8975f5c5SAndroid Build Coastguard Worker //
588*8975f5c5SAndroid Build Coastguard Worker // Message: In Group 3 Marker
589*8975f5c5SAndroid Build Coastguard Worker // End Group
590*8975f5c5SAndroid Build Coastguard Worker // Message: After Draw Marker
591*8975f5c5SAndroid Build Coastguard Worker // End Group
592*8975f5c5SAndroid Build Coastguard Worker const std::string beforeDrawGroup = "Before Draw";
593*8975f5c5SAndroid Build Coastguard Worker const std::string drawGroup1 = "Group 1";
594*8975f5c5SAndroid Build Coastguard Worker const std::string drawGroup2 = "Group 2";
595*8975f5c5SAndroid Build Coastguard Worker
596*8975f5c5SAndroid Build Coastguard Worker const std::string beforeDrawMarker = "Before Draw Marker";
597*8975f5c5SAndroid Build Coastguard Worker const std::string inGroup1Marker = "In Group 1 Marker";
598*8975f5c5SAndroid Build Coastguard Worker const std::string inGroup2Marker = "In Group 2 Marker";
599*8975f5c5SAndroid Build Coastguard Worker const std::string inGroup3Marker = "In Group 3 Marker";
600*8975f5c5SAndroid Build Coastguard Worker const std::string afterDrawMarker = "After Draw Marker";
601*8975f5c5SAndroid Build Coastguard Worker
602*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
603*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
604*8975f5c5SAndroid Build Coastguard Worker
605*8975f5c5SAndroid Build Coastguard Worker glPushDebugGroupKHR(GL_DEBUG_SOURCE_THIRD_PARTY, 0, -1, beforeDrawGroup.c_str());
606*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 0,
607*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_NOTIFICATION, -1, beforeDrawMarker.c_str());
608*8975f5c5SAndroid Build Coastguard Worker {
609*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
610*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_LOW, -1, inGroup1Marker.c_str());
611*8975f5c5SAndroid Build Coastguard Worker
612*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
613*8975f5c5SAndroid Build Coastguard Worker
614*8975f5c5SAndroid Build Coastguard Worker glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 0, -1, drawGroup1.c_str());
615*8975f5c5SAndroid Build Coastguard Worker {
616*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
617*8975f5c5SAndroid Build Coastguard Worker
618*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_THIRD_PARTY, GL_DEBUG_TYPE_PORTABILITY, 0,
619*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_MEDIUM, -1, inGroup2Marker.c_str());
620*8975f5c5SAndroid Build Coastguard Worker
621*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
622*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
623*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
624*8975f5c5SAndroid Build Coastguard Worker
625*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
626*8975f5c5SAndroid Build Coastguard Worker }
627*8975f5c5SAndroid Build Coastguard Worker glPopDebugGroupKHR();
628*8975f5c5SAndroid Build Coastguard Worker
629*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 2, 2, 0);
630*8975f5c5SAndroid Build Coastguard Worker
631*8975f5c5SAndroid Build Coastguard Worker glPushDebugGroupKHR(GL_DEBUG_SOURCE_THIRD_PARTY, 0, -1, drawGroup2.c_str());
632*8975f5c5SAndroid Build Coastguard Worker {
633*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
634*8975f5c5SAndroid Build Coastguard Worker
635*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 3, 3, 0);
636*8975f5c5SAndroid Build Coastguard Worker
637*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_THIRD_PARTY, GL_DEBUG_TYPE_OTHER, 0,
638*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_HIGH, -1, inGroup3Marker.c_str());
639*8975f5c5SAndroid Build Coastguard Worker }
640*8975f5c5SAndroid Build Coastguard Worker glPopGroupMarkerEXT();
641*8975f5c5SAndroid Build Coastguard Worker
642*8975f5c5SAndroid Build Coastguard Worker glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0,
643*8975f5c5SAndroid Build Coastguard Worker GL_DEBUG_SEVERITY_HIGH, -1, afterDrawMarker.c_str());
644*8975f5c5SAndroid Build Coastguard Worker }
645*8975f5c5SAndroid Build Coastguard Worker glPopGroupMarkerEXT();
646*8975f5c5SAndroid Build Coastguard Worker
647*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
648*8975f5c5SAndroid Build Coastguard Worker }
649*8975f5c5SAndroid Build Coastguard Worker
650*8975f5c5SAndroid Build Coastguard Worker // Simple test for gl[Push, Pop]DebugGroup using ES32 core APIs
TEST_P(DebugTestES32,DebugGroup)651*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES32, DebugGroup)
652*8975f5c5SAndroid Build Coastguard Worker {
653*8975f5c5SAndroid Build Coastguard Worker const std::string testDrawGroup = "Test Draw Group";
654*8975f5c5SAndroid Build Coastguard Worker
655*8975f5c5SAndroid Build Coastguard Worker // Pop without a push should generate GL_STACK_UNDERFLOW error
656*8975f5c5SAndroid Build Coastguard Worker glPopDebugGroup();
657*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_STACK_UNDERFLOW);
658*8975f5c5SAndroid Build Coastguard Worker
659*8975f5c5SAndroid Build Coastguard Worker // Push a test debug group and expect no error
660*8975f5c5SAndroid Build Coastguard Worker glPushDebugGroup(GL_DEBUG_SOURCE_THIRD_PARTY, 0, -1, testDrawGroup.c_str());
661*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
662*8975f5c5SAndroid Build Coastguard Worker
663*8975f5c5SAndroid Build Coastguard Worker // Pop the test debug group and expect no error
664*8975f5c5SAndroid Build Coastguard Worker glPopDebugGroup();
665*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
666*8975f5c5SAndroid Build Coastguard Worker }
667*8975f5c5SAndroid Build Coastguard Worker
668*8975f5c5SAndroid Build Coastguard Worker // Simple test for setting and getting labels using ES32 core APIs
TEST_P(DebugTestES32,ObjectLabels)669*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES32, ObjectLabels)
670*8975f5c5SAndroid Build Coastguard Worker {
671*8975f5c5SAndroid Build Coastguard Worker GLuint renderbuffer = 0;
672*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &renderbuffer);
673*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
674*8975f5c5SAndroid Build Coastguard Worker
675*8975f5c5SAndroid Build Coastguard Worker const std::string &label = "renderbuffer";
676*8975f5c5SAndroid Build Coastguard Worker glObjectLabel(GL_RENDERBUFFER, renderbuffer, -1, label.c_str());
677*8975f5c5SAndroid Build Coastguard Worker
678*8975f5c5SAndroid Build Coastguard Worker std::vector<char> labelBuf(label.length() + 1);
679*8975f5c5SAndroid Build Coastguard Worker GLsizei labelLengthBuf = 0;
680*8975f5c5SAndroid Build Coastguard Worker glGetObjectLabel(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()),
681*8975f5c5SAndroid Build Coastguard Worker &labelLengthBuf, labelBuf.data());
682*8975f5c5SAndroid Build Coastguard Worker
683*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
684*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(label.c_str(), labelBuf.data());
685*8975f5c5SAndroid Build Coastguard Worker
686*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
687*8975f5c5SAndroid Build Coastguard Worker
688*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &renderbuffer);
689*8975f5c5SAndroid Build Coastguard Worker
690*8975f5c5SAndroid Build Coastguard Worker glObjectLabel(GL_RENDERBUFFER, renderbuffer, -1, label.c_str());
691*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
692*8975f5c5SAndroid Build Coastguard Worker
693*8975f5c5SAndroid Build Coastguard Worker glGetObjectLabel(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()),
694*8975f5c5SAndroid Build Coastguard Worker &labelLengthBuf, labelBuf.data());
695*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
696*8975f5c5SAndroid Build Coastguard Worker }
697*8975f5c5SAndroid Build Coastguard Worker
698*8975f5c5SAndroid Build Coastguard Worker // Simple test for setting and getting labels using ES32 core APIs
TEST_P(DebugTestES32,ObjectPtrLabels)699*8975f5c5SAndroid Build Coastguard Worker TEST_P(DebugTestES32, ObjectPtrLabels)
700*8975f5c5SAndroid Build Coastguard Worker {
701*8975f5c5SAndroid Build Coastguard Worker GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
702*8975f5c5SAndroid Build Coastguard Worker
703*8975f5c5SAndroid Build Coastguard Worker const std::string &label = "sync";
704*8975f5c5SAndroid Build Coastguard Worker glObjectPtrLabel(sync, -1, label.c_str());
705*8975f5c5SAndroid Build Coastguard Worker
706*8975f5c5SAndroid Build Coastguard Worker std::vector<char> labelBuf(label.length() + 1);
707*8975f5c5SAndroid Build Coastguard Worker GLsizei labelLengthBuf = 0;
708*8975f5c5SAndroid Build Coastguard Worker glGetObjectPtrLabel(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf,
709*8975f5c5SAndroid Build Coastguard Worker labelBuf.data());
710*8975f5c5SAndroid Build Coastguard Worker
711*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
712*8975f5c5SAndroid Build Coastguard Worker EXPECT_STREQ(label.c_str(), labelBuf.data());
713*8975f5c5SAndroid Build Coastguard Worker
714*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
715*8975f5c5SAndroid Build Coastguard Worker
716*8975f5c5SAndroid Build Coastguard Worker glDeleteSync(sync);
717*8975f5c5SAndroid Build Coastguard Worker
718*8975f5c5SAndroid Build Coastguard Worker glObjectPtrLabel(sync, -1, label.c_str());
719*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
720*8975f5c5SAndroid Build Coastguard Worker
721*8975f5c5SAndroid Build Coastguard Worker glGetObjectPtrLabel(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf,
722*8975f5c5SAndroid Build Coastguard Worker labelBuf.data());
723*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
724*8975f5c5SAndroid Build Coastguard Worker }
725*8975f5c5SAndroid Build Coastguard Worker
726*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DebugTestES3);
727*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(DebugTestES3);
728*8975f5c5SAndroid Build Coastguard Worker
729*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(DebugTest,
730*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES1,
731*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES2,
732*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES3,
733*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES31);
734*8975f5c5SAndroid Build Coastguard Worker
735*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DebugTestES32);
736*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES32(DebugTestES32);
737*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
738