xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ErrorMessages.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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