xref: /aosp_15_r20/external/angle/src/tests/gl_tests/DebugMarkerTest.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 // DebugMarkerTest:
7 //   Basic tests to ensure EXT_debug_marker entry points work.
8 
9 #include "test_utils/ANGLETest.h"
10 #include "test_utils/gl_raii.h"
11 
12 using namespace angle;
13 
14 namespace
15 {
16 
17 class DebugMarkerTest : public ANGLETest<>
18 {
19   protected:
DebugMarkerTest()20     DebugMarkerTest()
21     {
22         setWindowWidth(128);
23         setWindowHeight(128);
24         setConfigRedBits(8);
25         setConfigGreenBits(8);
26         setConfigBlueBits(8);
27         setConfigAlphaBits(8);
28     }
29 };
30 
31 // Simple test to ensure the various EXT_debug_marker entry points don't crash.
32 // The debug markers can be validated by capturing this test under a graphics debugger.
TEST_P(DebugMarkerTest,BasicValidation)33 TEST_P(DebugMarkerTest, BasicValidation)
34 {
35     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_debug_marker"));
36 
37     std::string eventMarkerCaption = "Test event marker caption";
38     std::string groupMarkerCaption = "Test group marker caption";
39 
40     glPushGroupMarkerEXT(static_cast<GLsizei>(groupMarkerCaption.length()),
41                          groupMarkerCaption.c_str());
42 
43     // Do some basic operations between calls to extension entry points
44     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
45     glClear(GL_COLOR_BUFFER_BIT);
46 
47     glInsertEventMarkerEXT(static_cast<GLsizei>(eventMarkerCaption.length()),
48                            eventMarkerCaption.c_str());
49     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
50     glClear(GL_COLOR_BUFFER_BIT);
51 
52     glPushGroupMarkerEXT(0, nullptr);
53     glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
54     glClear(GL_COLOR_BUFFER_BIT);
55 
56     glPopGroupMarkerEXT();
57     glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
58     glClear(GL_COLOR_BUFFER_BIT);
59 
60     glPopGroupMarkerEXT();
61 
62     ASSERT_GL_NO_ERROR();
63 }
64 
65 // Test EXT_debug_marker markers before, during and after rendering.  The debug markers can be
66 // validated by capturing this test under a graphics debugger.
TEST_P(DebugMarkerTest,Rendering)67 TEST_P(DebugMarkerTest, Rendering)
68 {
69     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_debug_marker"));
70 
71     // The test produces the following hierarchy:
72     //
73     // Event: Before Draw Marker
74     // Group: Before Draw
75     //   Event: In Group 1 Marker
76     //   glDrawArrays
77     //   Group: After Draw 1
78     //      Event: In Group 2 Marker
79     //      glDrawArrays
80     //
81     //      glCopyTexImage <-- this breaks the render pass
82     //
83     //      glDrawArrays
84     //   End Group
85     //   glDrawArrays
86     //   Group: After Draw 2
87     //      glDrawArrays
88     //      Event: In Group 3 Marker
89     //
90     //      glCopyTexImage <-- this breaks the render pass
91     //   End Group
92     // End Group
93     // Event: After Draw Marker
94     const std::string beforeDrawGroup = "Before Draw";
95     const std::string drawGroup1      = "Group 1";
96     const std::string drawGroup2      = "Group 2";
97 
98     const std::string beforeDrawMarker = "Before Draw Marker";
99     const std::string inGroup1Marker   = "In Group 1 Marker";
100     const std::string inGroup2Marker   = "In Group 2 Marker";
101     const std::string inGroup3Marker   = "In Group 3 Marker";
102     const std::string afterDrawMarker  = "After Draw Marker";
103 
104     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
105     glUseProgram(program);
106 
107     glInsertEventMarkerEXT(static_cast<GLsizei>(beforeDrawMarker.length()),
108                            beforeDrawMarker.c_str());
109     glPushGroupMarkerEXT(static_cast<GLsizei>(beforeDrawGroup.length()), beforeDrawGroup.c_str());
110     {
111         glInsertEventMarkerEXT(static_cast<GLsizei>(inGroup1Marker.length()),
112                                inGroup1Marker.c_str());
113 
114         glDrawArrays(GL_TRIANGLES, 0, 6);
115 
116         glPushGroupMarkerEXT(static_cast<GLsizei>(drawGroup1.length()), drawGroup1.c_str());
117         {
118             glInsertEventMarkerEXT(static_cast<GLsizei>(inGroup2Marker.length()),
119                                    inGroup2Marker.c_str());
120 
121             glDrawArrays(GL_TRIANGLES, 0, 6);
122 
123             GLTexture texture;
124             glBindTexture(GL_TEXTURE_2D, texture);
125             glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
126 
127             glDrawArrays(GL_TRIANGLES, 0, 6);
128         }
129         glPopGroupMarkerEXT();
130 
131         glDrawArrays(GL_TRIANGLES, 0, 6);
132 
133         glPushGroupMarkerEXT(static_cast<GLsizei>(drawGroup2.length()), drawGroup2.c_str());
134         {
135             glDrawArrays(GL_TRIANGLES, 0, 6);
136 
137             glInsertEventMarkerEXT(static_cast<GLsizei>(inGroup3Marker.length()),
138                                    inGroup3Marker.c_str());
139 
140             glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 2, 2, 0);
141         }
142         glPopGroupMarkerEXT();
143     }
144     glPopGroupMarkerEXT();
145     glInsertEventMarkerEXT(static_cast<GLsizei>(afterDrawMarker.length()), afterDrawMarker.c_str());
146 
147     ASSERT_GL_NO_ERROR();
148 }
149 
150 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
151 // tests should be run against.
152 ANGLE_INSTANTIATE_TEST_ES2(DebugMarkerTest);
153 
154 }  // namespace
155