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 // ErrorMessages.cpp : Tests functionality of internal error error messages
8
9 #include "test_utils/ANGLETest.h"
10
11 #include "../src/libANGLE/ErrorStrings.h"
12 #include "test_utils/gl_raii.h"
13
14 namespace
15 {
16
17 struct Message
18 {
19 GLenum source;
20 GLenum type;
21 GLenum id;
22 GLenum severity;
23 std::string message;
24 const void *userParam;
25
operator ==__anonaacc6d5d0111::Message26 inline bool operator==(Message a)
27 {
28 if (a.source == source && a.type == type && a.id == id && a.message == message)
29 {
30 return true;
31 }
32 else
33 {
34 return false;
35 }
36 }
37 };
38
Callback(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar * message,const void * userParam)39 static void GL_APIENTRY Callback(GLenum source,
40 GLenum type,
41 GLuint id,
42 GLenum severity,
43 GLsizei length,
44 const GLchar *message,
45 const void *userParam)
46 {
47 Message m{source, type, id, severity, std::string(message, length), userParam};
48 std::vector<Message> *messages =
49 static_cast<std::vector<Message> *>(const_cast<void *>(userParam));
50 messages->push_back(m);
51 }
52
53 } // namespace
54
55 namespace angle
56 {
57
58 class ErrorMessagesTest : public ANGLETest<>
59 {
60 protected:
ErrorMessagesTest()61 ErrorMessagesTest()
62 {
63 setWindowWidth(128);
64 setWindowHeight(128);
65 setConfigRedBits(8);
66 setConfigGreenBits(8);
67 setConfigBlueBits(8);
68 setConfigAlphaBits(8);
69 setWebGLCompatibilityEnabled(true);
70 }
71 };
72
73 // Verify functionality of WebGL specific errors using KHR_debug
TEST_P(ErrorMessagesTest,ErrorMessages)74 TEST_P(ErrorMessagesTest, ErrorMessages)
75 {
76 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_debug"));
77
78 glEnable(GL_DEBUG_OUTPUT);
79
80 std::vector<Message> messages;
81 glDebugMessageCallbackKHR(Callback, &messages);
82 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
83
84 constexpr GLenum source = GL_DEBUG_SOURCE_API;
85 constexpr GLenum type = GL_DEBUG_TYPE_ERROR;
86 constexpr GLenum severity = GL_DEBUG_SEVERITY_HIGH;
87 constexpr GLuint id1 = 1282;
88 const std::string message1 = gl::err::kWebglBindAttribLocationReservedPrefix;
89 Message expectedMessage;
90
91 GLint numMessages = 0;
92 glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages);
93 EXPECT_EQ(0, numMessages);
94
95 glBindAttribLocation(0, 0, "_webgl_var");
96
97 ASSERT_EQ(1u, messages.size());
98
99 expectedMessage.source = source;
100 expectedMessage.id = id1;
101 expectedMessage.type = type;
102 expectedMessage.severity = severity;
103 expectedMessage.message = message1;
104
105 Message &m = messages.front();
106 ASSERT_TRUE(m == expectedMessage);
107 }
108
109 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
110 // tests should be run against.
111 ANGLE_INSTANTIATE_TEST(ErrorMessagesTest,
112 ES2_D3D9(),
113 ES2_D3D11(),
114 ES3_D3D11(),
115 ES2_METAL(),
116 ES2_OPENGL(),
117 ES3_OPENGL(),
118 ES2_OPENGLES(),
119 ES3_OPENGLES(),
120 ES2_VULKAN());
121 } // namespace angle
122