xref: /aosp_15_r20/external/angle/src/tests/egl_tests/EGLDebugTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 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 // EGLDebugTest.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //   Tests of EGL_KHR_debug extension
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include <gtest/gtest.h>
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/angle_test_configs.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "util/EGLWindow.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker namespace angle
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker class EGLDebugTest : public ANGLETest<>
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker   protected:
testTearDown()20*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override { eglDebugMessageControlKHR(nullptr, nullptr); }
21*8975f5c5SAndroid Build Coastguard Worker 
hasExtension() const22*8975f5c5SAndroid Build Coastguard Worker     bool hasExtension() const { return IsEGLClientExtensionEnabled("EGL_KHR_debug"); }
23*8975f5c5SAndroid Build Coastguard Worker 
StubCallback(EGLenum error,const char * command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char * message)24*8975f5c5SAndroid Build Coastguard Worker     static void EGLAPIENTRY StubCallback(EGLenum error,
25*8975f5c5SAndroid Build Coastguard Worker                                          const char *command,
26*8975f5c5SAndroid Build Coastguard Worker                                          EGLint messageType,
27*8975f5c5SAndroid Build Coastguard Worker                                          EGLLabelKHR threadLabel,
28*8975f5c5SAndroid Build Coastguard Worker                                          EGLLabelKHR objectLabel,
29*8975f5c5SAndroid Build Coastguard Worker                                          const char *message)
30*8975f5c5SAndroid Build Coastguard Worker     {}
31*8975f5c5SAndroid Build Coastguard Worker 
CheckBadBindAPIError(EGLenum error,const char * command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char * message)32*8975f5c5SAndroid Build Coastguard Worker     static void EGLAPIENTRY CheckBadBindAPIError(EGLenum error,
33*8975f5c5SAndroid Build Coastguard Worker                                                  const char *command,
34*8975f5c5SAndroid Build Coastguard Worker                                                  EGLint messageType,
35*8975f5c5SAndroid Build Coastguard Worker                                                  EGLLabelKHR threadLabel,
36*8975f5c5SAndroid Build Coastguard Worker                                                  EGLLabelKHR objectLabel,
37*8975f5c5SAndroid Build Coastguard Worker                                                  const char *message)
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         EXPECT_STREQ("eglBindAPI", command);
40*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGLENUM_EQ(EGL_BAD_PARAMETER, error);
41*8975f5c5SAndroid Build Coastguard Worker         EXPECT_STREQ("Thread", static_cast<const char *>(threadLabel));
42*8975f5c5SAndroid Build Coastguard Worker     }
43*8975f5c5SAndroid Build Coastguard Worker 
EGLAttribToDebugCallback(EGLAttrib attrib)44*8975f5c5SAndroid Build Coastguard Worker     static EGLDEBUGPROCKHR EGLAttribToDebugCallback(EGLAttrib attrib)
45*8975f5c5SAndroid Build Coastguard Worker     {
46*8975f5c5SAndroid Build Coastguard Worker         return reinterpret_cast<EGLDEBUGPROCKHR>(static_cast<uintptr_t>(attrib));
47*8975f5c5SAndroid Build Coastguard Worker     }
48*8975f5c5SAndroid Build Coastguard Worker 
DebugCallbackToEGLAttrib(EGLDEBUGPROCKHR callback)49*8975f5c5SAndroid Build Coastguard Worker     static EGLAttrib DebugCallbackToEGLAttrib(EGLDEBUGPROCKHR callback)
50*8975f5c5SAndroid Build Coastguard Worker     {
51*8975f5c5SAndroid Build Coastguard Worker         return static_cast<EGLAttrib>(reinterpret_cast<intptr_t>(callback));
52*8975f5c5SAndroid Build Coastguard Worker     }
53*8975f5c5SAndroid Build Coastguard Worker };
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker // Test that the extension is always available (it is implemented in ANGLE's frontend).
TEST_P(EGLDebugTest,ExtensionAlwaysAvailable)56*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLDebugTest, ExtensionAlwaysAvailable)
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(hasExtension());
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker // Check that the default message filters and callbacks are correct
TEST_P(EGLDebugTest,DefaultParameters)62*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLDebugTest, DefaultParameters)
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasExtension());
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(nullptr, nullptr));
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     EGLAttrib result = 0;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_ERROR_KHR, &result));
71*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(result);
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_WARN_KHR, &result));
74*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_FALSE(result);
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_INFO_KHR, &result));
77*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_FALSE(result);
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_CALLBACK_KHR, &result));
80*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, EGLAttribToDebugCallback(result));
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker // Check that the message control and callback parameters can be set and then queried back
TEST_P(EGLDebugTest,SetMessageControl)84*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLDebugTest, SetMessageControl)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasExtension());
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     EGLAttrib controls[] = {
89*8975f5c5SAndroid Build Coastguard Worker         EGL_DEBUG_MSG_CRITICAL_KHR,
90*8975f5c5SAndroid Build Coastguard Worker         EGL_FALSE,
91*8975f5c5SAndroid Build Coastguard Worker         // EGL_DEBUG_MSG_ERROR_KHR left unset
92*8975f5c5SAndroid Build Coastguard Worker         EGL_DEBUG_MSG_WARN_KHR,
93*8975f5c5SAndroid Build Coastguard Worker         EGL_TRUE,
94*8975f5c5SAndroid Build Coastguard Worker         EGL_DEBUG_MSG_INFO_KHR,
95*8975f5c5SAndroid Build Coastguard Worker         EGL_FALSE,
96*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
97*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
98*8975f5c5SAndroid Build Coastguard Worker     };
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(&StubCallback, controls));
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker     EGLAttrib result = 0;
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_CRITICAL_KHR, &result));
105*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_FALSE(result);
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_ERROR_KHR, &result));
108*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(result);
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_WARN_KHR, &result));
111*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(result);
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_INFO_KHR, &result));
114*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_FALSE(result);
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_CALLBACK_KHR, &result));
117*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(DebugCallbackToEGLAttrib(&StubCallback), result);
118*8975f5c5SAndroid Build Coastguard Worker }
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker // Set a thread label and then trigger a callback to verify the callback parameters are correct
TEST_P(EGLDebugTest,CorrectCallbackParameters)121*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLDebugTest, CorrectCallbackParameters)
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasExtension());
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(nullptr, nullptr));
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(EGL_SUCCESS, eglLabelObjectKHR(EGL_NO_DISPLAY, EGL_OBJECT_THREAD_KHR, nullptr,
128*8975f5c5SAndroid Build Coastguard Worker                                              const_cast<char *>("Thread")));
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     // Enable all messages
131*8975f5c5SAndroid Build Coastguard Worker     EGLAttrib controls[] = {
132*8975f5c5SAndroid Build Coastguard Worker         EGL_DEBUG_MSG_CRITICAL_KHR,
133*8975f5c5SAndroid Build Coastguard Worker         EGL_TRUE,
134*8975f5c5SAndroid Build Coastguard Worker         EGL_DEBUG_MSG_ERROR_KHR,
135*8975f5c5SAndroid Build Coastguard Worker         EGL_TRUE,
136*8975f5c5SAndroid Build Coastguard Worker         EGL_DEBUG_MSG_WARN_KHR,
137*8975f5c5SAndroid Build Coastguard Worker         EGL_TRUE,
138*8975f5c5SAndroid Build Coastguard Worker         EGL_DEBUG_MSG_INFO_KHR,
139*8975f5c5SAndroid Build Coastguard Worker         EGL_TRUE,
140*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
141*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
142*8975f5c5SAndroid Build Coastguard Worker     };
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS),
145*8975f5c5SAndroid Build Coastguard Worker               eglDebugMessageControlKHR(&CheckBadBindAPIError, controls));
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     // Generate an error and trigger the callback
148*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_FALSE(eglBindAPI(0xBADDBADD));
149*8975f5c5SAndroid Build Coastguard Worker }
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker // Test that labels can be set and that errors are generated if the wrong object type is used
TEST_P(EGLDebugTest,SetLabel)152*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLDebugTest, SetLabel)
153*8975f5c5SAndroid Build Coastguard Worker {
154*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasExtension());
155*8975f5c5SAndroid Build Coastguard Worker 
156*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display = getEGLWindow()->getDisplay();
157*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = getEGLWindow()->getSurface();
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(nullptr, nullptr));
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker     // Display display and object must be equal when setting a display label
162*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(
163*8975f5c5SAndroid Build Coastguard Worker         static_cast<EGLint>(EGL_SUCCESS),
164*8975f5c5SAndroid Build Coastguard Worker         eglLabelObjectKHR(display, EGL_OBJECT_DISPLAY_KHR, display, const_cast<char *>("Display")));
165*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(static_cast<EGLint>(EGL_SUCCESS),
166*8975f5c5SAndroid Build Coastguard Worker               eglLabelObjectKHR(nullptr, EGL_OBJECT_DISPLAY_KHR, getEGLWindow()->getDisplay(),
167*8975f5c5SAndroid Build Coastguard Worker                                 const_cast<char *>("Display")));
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker     //  Set a surface label
170*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(
171*8975f5c5SAndroid Build Coastguard Worker         static_cast<EGLint>(EGL_SUCCESS),
172*8975f5c5SAndroid Build Coastguard Worker         eglLabelObjectKHR(display, EGL_OBJECT_SURFACE_KHR, surface, const_cast<char *>("Surface")));
173*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_SUCCESS);
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker     // Provide a surface but use an image label type
176*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(
177*8975f5c5SAndroid Build Coastguard Worker         static_cast<EGLint>(EGL_BAD_PARAMETER),
178*8975f5c5SAndroid Build Coastguard Worker         eglLabelObjectKHR(display, EGL_OBJECT_IMAGE_KHR, surface, const_cast<char *>("Image")));
179*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
180*8975f5c5SAndroid Build Coastguard Worker }
181*8975f5c5SAndroid Build Coastguard Worker 
182*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLDebugTest);
183*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(EGLDebugTest,
184*8975f5c5SAndroid Build Coastguard Worker                        ES2_D3D9(),
185*8975f5c5SAndroid Build Coastguard Worker                        ES2_D3D11(),
186*8975f5c5SAndroid Build Coastguard Worker                        ES3_D3D11(),
187*8975f5c5SAndroid Build Coastguard Worker                        ES2_OPENGL(),
188*8975f5c5SAndroid Build Coastguard Worker                        ES3_OPENGL(),
189*8975f5c5SAndroid Build Coastguard Worker                        ES2_VULKAN());
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
192