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