1 /**************************************************************************
2 *
3 * Copyright 2015 VMware, Inc.
4 * Copyright 2011 Jose Fonseca
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE.
24 *
25 **************************************************************************/
26
27
28 /*
29 * Label functions based on their name.
30 */
31
32
33 #include "trace_parser.hpp"
34
35 #include <assert.h>
36
37 #include <regex>
38
39 #include "trace_lookup.hpp"
40
41
42 using namespace trace;
43
44
45 /**
46 * Shortcut for SwapBuffers, which terminate and swap bound render buffer.
47 */
48 #define CALL_FLAG_SWAPBUFFERS (CALL_FLAG_END_FRAME | CALL_FLAG_SWAP_RENDERTARGET)
49
50
51
52 /**
53 * Default call flags.
54 */
55 const CallFlags
56 defaultCallFlags = 0;
57
58
59 /**
60 * Call flags lookup table.
61 */
62 const Entry<CallFlags>
63 callFlagTable[] = {
64 { "CGLFlushDrawable", CALL_FLAG_END_FRAME },
65 { "CGLGetCurrentContext", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
66 { "D3DPERF_BeginEvent", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
67 { "D3DPERF_EndEvent", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP },
68 { "D3DPERF_SetMarker", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER },
69 { "ID3D11VideoProcessorEnumerator::CheckVideoProcessorFormat", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
70 { "ID3DUserDefinedAnnotation::BeginEvent", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
71 { "ID3DUserDefinedAnnotation::EndEvent", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP },
72 { "ID3DUserDefinedAnnotation::SetMarker", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER },
73 { "IDirect3D8::CheckDeviceFormat", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
74 { "IDirect3D8::EnumAdapterModes", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
75 { "IDirect3D8::GetAdapterModeCount", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
76 { "IDirect3D8::GetDeviceCaps", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
77 { "IDirect3D9::CheckDeviceFormat", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
78 { "IDirect3D9::EnumAdapterModes", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
79 { "IDirect3D9::GetAdapterModeCount", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
80 { "IDirect3D9::GetDeviceCaps", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
81 { "IDirect3D9Ex::CheckDeviceFormat", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
82 { "IDirect3D9Ex::EnumAdapterModes", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
83 { "IDirect3D9Ex::GetAdapterModeCount", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
84 { "IDirect3D9Ex::GetDeviceCaps", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
85 { "IDirect3DDevice2::DrawIndexedPrimitive", CALL_FLAG_RENDER },
86 { "IDirect3DDevice2::DrawPrimitive", CALL_FLAG_RENDER },
87 { "IDirect3DDevice3::DrawIndexedPrimitive", CALL_FLAG_RENDER },
88 { "IDirect3DDevice3::DrawIndexedPrimitiveStrided", CALL_FLAG_RENDER },
89 { "IDirect3DDevice3::DrawIndexedPrimitiveVB", CALL_FLAG_RENDER },
90 { "IDirect3DDevice3::DrawPrimitive", CALL_FLAG_RENDER },
91 { "IDirect3DDevice3::DrawPrimitiveStrided", CALL_FLAG_RENDER },
92 { "IDirect3DDevice3::DrawPrimitiveVB", CALL_FLAG_RENDER },
93 { "IDirect3DDevice7::Clear", CALL_FLAG_RENDER },
94 { "IDirect3DDevice7::DrawIndexedPrimitive", CALL_FLAG_RENDER },
95 { "IDirect3DDevice7::DrawIndexedPrimitiveStrided", CALL_FLAG_RENDER },
96 { "IDirect3DDevice7::DrawIndexedPrimitiveVB", CALL_FLAG_RENDER },
97 { "IDirect3DDevice7::DrawPrimitive", CALL_FLAG_RENDER },
98 { "IDirect3DDevice7::DrawPrimitiveStrided", CALL_FLAG_RENDER },
99 { "IDirect3DDevice7::DrawPrimitiveVB", CALL_FLAG_RENDER },
100 { "IDirect3DDevice8::Clear", CALL_FLAG_RENDER },
101 { "IDirect3DDevice8::DrawIndexedPrimitive", CALL_FLAG_RENDER },
102 { "IDirect3DDevice8::DrawIndexedPrimitiveUP", CALL_FLAG_RENDER },
103 { "IDirect3DDevice8::DrawPrimitive", CALL_FLAG_RENDER },
104 { "IDirect3DDevice8::DrawPrimitiveUP", CALL_FLAG_RENDER },
105 { "IDirect3DDevice8::DrawRectPatch", CALL_FLAG_RENDER },
106 { "IDirect3DDevice8::DrawTriPatch", CALL_FLAG_RENDER },
107 { "IDirect3DDevice8::GetDeviceCaps", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
108 { "IDirect3DDevice8::Present", CALL_FLAG_SWAPBUFFERS },
109 { "IDirect3DDevice8::SetRenderTarget", CALL_FLAG_SWAP_RENDERTARGET },
110 { "IDirect3DDevice9::Clear", CALL_FLAG_RENDER },
111 { "IDirect3DDevice9::DrawIndexedPrimitive", CALL_FLAG_RENDER },
112 { "IDirect3DDevice9::DrawIndexedPrimitiveUP", CALL_FLAG_RENDER },
113 { "IDirect3DDevice9::DrawPrimitive", CALL_FLAG_RENDER },
114 { "IDirect3DDevice9::DrawPrimitiveUP", CALL_FLAG_RENDER },
115 { "IDirect3DDevice9::DrawRectPatch", CALL_FLAG_RENDER },
116 { "IDirect3DDevice9::DrawTriPatch", CALL_FLAG_RENDER },
117 { "IDirect3DDevice9::GetDeviceCaps", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
118 { "IDirect3DDevice9::GetRenderTargetData", CALL_FLAG_END_FRAME },
119 { "IDirect3DDevice9::Present", CALL_FLAG_SWAPBUFFERS },
120 { "IDirect3DDevice9::SetRenderTarget", CALL_FLAG_SWAP_RENDERTARGET },
121 { "IDirect3DDevice9Ex::Clear", CALL_FLAG_RENDER },
122 { "IDirect3DDevice9Ex::DrawIndexedPrimitive", CALL_FLAG_RENDER },
123 { "IDirect3DDevice9Ex::DrawIndexedPrimitiveUP", CALL_FLAG_RENDER },
124 { "IDirect3DDevice9Ex::DrawPrimitive", CALL_FLAG_RENDER },
125 { "IDirect3DDevice9Ex::DrawPrimitiveUP", CALL_FLAG_RENDER },
126 { "IDirect3DDevice9Ex::DrawRectPatch", CALL_FLAG_RENDER },
127 { "IDirect3DDevice9Ex::DrawTriPatch", CALL_FLAG_RENDER },
128 { "IDirect3DDevice9Ex::GetDeviceCaps", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
129 { "IDirect3DDevice9Ex::GetRenderTargetData", CALL_FLAG_END_FRAME },
130 { "IDirect3DDevice9Ex::Present", CALL_FLAG_SWAPBUFFERS },
131 { "IDirect3DDevice9Ex::PresentEx", CALL_FLAG_SWAPBUFFERS },
132 { "IDirect3DDevice9Ex::SetRenderTarget", CALL_FLAG_SWAP_RENDERTARGET },
133 { "IDirect3DSwapChain9::Present", CALL_FLAG_SWAPBUFFERS },
134 { "IDirect3DSwapChain9Ex::Present", CALL_FLAG_SWAPBUFFERS },
135 { "IDirect3DViewport2::Clear", CALL_FLAG_RENDER },
136 { "IDirect3DViewport3::Clear", CALL_FLAG_RENDER },
137 { "IDirect3DViewport3::Clear2", CALL_FLAG_RENDER },
138 { "IDirect3DViewport::Clear", CALL_FLAG_RENDER },
139 { "eglGetConfigAttrib", CALL_FLAG_VERBOSE },
140 { "eglGetProcAddress", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
141 { "eglQueryString", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
142 { "eglSwapBuffers", CALL_FLAG_SWAPBUFFERS },
143 { "eglSwapBuffersWithDamageEXT", CALL_FLAG_SWAPBUFFERS },
144 { "eglSwapBuffersWithDamageKHR", CALL_FLAG_SWAPBUFFERS },
145 { "glAreProgramsResidentNV", CALL_FLAG_NO_SIDE_EFFECTS },
146 { "glAreTexturesResident", CALL_FLAG_NO_SIDE_EFFECTS },
147 { "glAreTexturesResidentEXT", CALL_FLAG_NO_SIDE_EFFECTS },
148 { "glBufferRegionEnabled", CALL_FLAG_NO_SIDE_EFFECTS },
149 { "glDebugMessageControl", CALL_FLAG_NO_SIDE_EFFECTS },
150 { "glDebugMessageControlARB", CALL_FLAG_NO_SIDE_EFFECTS },
151 { "glDebugMessageEnableAMD", CALL_FLAG_NO_SIDE_EFFECTS },
152 { "glDebugMessageInsert", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
153 { "glDebugMessageInsertAMD", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
154 { "glDebugMessageInsertARB", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
155 { "glDebugMessageInsertKHR", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
156 { "glFrameTerminatorGREMEDY", CALL_FLAG_END_FRAME },
157 { "glGetActiveAtomicCounterBufferiv", CALL_FLAG_NO_SIDE_EFFECTS },
158 { "glGetActiveAttrib", CALL_FLAG_NO_SIDE_EFFECTS },
159 { "glGetActiveAttribARB", CALL_FLAG_NO_SIDE_EFFECTS },
160 { "glGetActiveSubroutineName", CALL_FLAG_NO_SIDE_EFFECTS },
161 { "glGetActiveSubroutineUniformName", CALL_FLAG_NO_SIDE_EFFECTS },
162 { "glGetActiveSubroutineUniformiv", CALL_FLAG_NO_SIDE_EFFECTS },
163 { "glGetActiveUniform", CALL_FLAG_NO_SIDE_EFFECTS },
164 { "glGetActiveUniformARB", CALL_FLAG_NO_SIDE_EFFECTS },
165 { "glGetActiveUniformBlockName", CALL_FLAG_NO_SIDE_EFFECTS },
166 { "glGetActiveUniformBlockiv", CALL_FLAG_NO_SIDE_EFFECTS },
167 { "glGetActiveUniformName", CALL_FLAG_NO_SIDE_EFFECTS },
168 { "glGetActiveUniformsiv", CALL_FLAG_NO_SIDE_EFFECTS },
169 { "glGetActiveVaryingNV", CALL_FLAG_NO_SIDE_EFFECTS },
170 { "glGetArrayObjectfvATI", CALL_FLAG_NO_SIDE_EFFECTS },
171 { "glGetArrayObjectivATI", CALL_FLAG_NO_SIDE_EFFECTS },
172 { "glGetAttachedObjectsARB", CALL_FLAG_NO_SIDE_EFFECTS },
173 { "glGetAttachedShaders", CALL_FLAG_NO_SIDE_EFFECTS },
174 { "glGetBooleanIndexedvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
175 { "glGetBooleani_v", CALL_FLAG_NO_SIDE_EFFECTS },
176 { "glGetBooleanv", CALL_FLAG_NO_SIDE_EFFECTS },
177 { "glGetBufferParameteri64v", CALL_FLAG_NO_SIDE_EFFECTS },
178 { "glGetBufferParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
179 { "glGetBufferParameterivARB", CALL_FLAG_NO_SIDE_EFFECTS },
180 { "glGetBufferParameterui64vNV", CALL_FLAG_NO_SIDE_EFFECTS },
181 { "glGetBufferPointerv", CALL_FLAG_NO_SIDE_EFFECTS },
182 { "glGetBufferPointervARB", CALL_FLAG_NO_SIDE_EFFECTS },
183 { "glGetBufferSubData", CALL_FLAG_NO_SIDE_EFFECTS },
184 { "glGetBufferSubDataARB", CALL_FLAG_NO_SIDE_EFFECTS },
185 { "glGetClipPlane", CALL_FLAG_NO_SIDE_EFFECTS },
186 { "glGetColorTable", CALL_FLAG_NO_SIDE_EFFECTS },
187 { "glGetColorTableEXT", CALL_FLAG_NO_SIDE_EFFECTS },
188 { "glGetColorTableParameterfv", CALL_FLAG_NO_SIDE_EFFECTS },
189 { "glGetColorTableParameterfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
190 { "glGetColorTableParameterfvSGI", CALL_FLAG_NO_SIDE_EFFECTS },
191 { "glGetColorTableParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
192 { "glGetColorTableParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
193 { "glGetColorTableParameterivSGI", CALL_FLAG_NO_SIDE_EFFECTS },
194 { "glGetColorTableSGI", CALL_FLAG_NO_SIDE_EFFECTS },
195 { "glGetCombinerInputParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
196 { "glGetCombinerInputParameterivNV", CALL_FLAG_NO_SIDE_EFFECTS },
197 { "glGetCombinerOutputParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
198 { "glGetCombinerOutputParameterivNV", CALL_FLAG_NO_SIDE_EFFECTS },
199 { "glGetCombinerStageParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
200 { "glGetConvolutionFilterEXT", CALL_FLAG_NO_SIDE_EFFECTS },
201 { "glGetConvolutionParameterfv", CALL_FLAG_NO_SIDE_EFFECTS },
202 { "glGetConvolutionParameterfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
203 { "glGetConvolutionParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
204 { "glGetConvolutionParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
205 { "glGetDetailTexFuncSGIS", CALL_FLAG_NO_SIDE_EFFECTS },
206 { "glGetDoubleIndexedvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
207 { "glGetDoublei_v", CALL_FLAG_NO_SIDE_EFFECTS },
208 { "glGetDoublev", CALL_FLAG_NO_SIDE_EFFECTS },
209 { "glGetError", CALL_FLAG_NO_SIDE_EFFECTS }, // verbose will be set later for GL_NO_ERROR
210 { "glGetFenceivNV", CALL_FLAG_NO_SIDE_EFFECTS },
211 { "glGetFinalCombinerInputParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
212 { "glGetFinalCombinerInputParameterivNV", CALL_FLAG_NO_SIDE_EFFECTS },
213 { "glGetFogFuncSGIS", CALL_FLAG_NO_SIDE_EFFECTS },
214 { "glGetFragDataIndex", CALL_FLAG_NO_SIDE_EFFECTS },
215 { "glGetFragmentLightfvSGIX", CALL_FLAG_NO_SIDE_EFFECTS },
216 { "glGetFragmentLightivSGIX", CALL_FLAG_NO_SIDE_EFFECTS },
217 { "glGetFragmentMaterialfvSGIX", CALL_FLAG_NO_SIDE_EFFECTS },
218 { "glGetFragmentMaterialivSGIX", CALL_FLAG_NO_SIDE_EFFECTS },
219 { "glGetFramebufferAttachmentParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
220 { "glGetFramebufferAttachmentParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
221 { "glGetFramebufferParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
222 { "glGetFramebufferParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
223 { "glGetGraphicsResetStatusARB", CALL_FLAG_NO_SIDE_EFFECTS },
224 { "glGetHandleARB", CALL_FLAG_NO_SIDE_EFFECTS },
225 { "glGetHistogramEXT", CALL_FLAG_NO_SIDE_EFFECTS },
226 { "glGetHistogramParameterfv", CALL_FLAG_NO_SIDE_EFFECTS },
227 { "glGetHistogramParameterfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
228 { "glGetHistogramParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
229 { "glGetHistogramParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
230 { "glGetImageTransformParameterfvHP", CALL_FLAG_NO_SIDE_EFFECTS },
231 { "glGetImageTransformParameterivHP", CALL_FLAG_NO_SIDE_EFFECTS },
232 { "glGetInfoLogARB", CALL_FLAG_NO_SIDE_EFFECTS },
233 { "glGetInstrumentsSGIX", CALL_FLAG_NO_SIDE_EFFECTS },
234 { "glGetInternalformati64v", CALL_FLAG_NO_SIDE_EFFECTS },
235 { "glGetInternalformativ", CALL_FLAG_NO_SIDE_EFFECTS },
236 { "glGetInvariantBooleanvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
237 { "glGetInvariantFloatvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
238 { "glGetInvariantIntegervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
239 { "glGetLightfv", CALL_FLAG_NO_SIDE_EFFECTS },
240 { "glGetLightiv", CALL_FLAG_NO_SIDE_EFFECTS },
241 { "glGetListParameterfvSGIX", CALL_FLAG_NO_SIDE_EFFECTS },
242 { "glGetListParameterivSGIX", CALL_FLAG_NO_SIDE_EFFECTS },
243 { "glGetLocalConstantBooleanvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
244 { "glGetLocalConstantFloatvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
245 { "glGetLocalConstantIntegervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
246 { "glGetMapAttribParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
247 { "glGetMapAttribParameterivNV", CALL_FLAG_NO_SIDE_EFFECTS },
248 { "glGetMapControlPointsNV", CALL_FLAG_NO_SIDE_EFFECTS },
249 { "glGetMapParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
250 { "glGetMapParameterivNV", CALL_FLAG_NO_SIDE_EFFECTS },
251 { "glGetMapdv", CALL_FLAG_NO_SIDE_EFFECTS },
252 { "glGetMapfv", CALL_FLAG_NO_SIDE_EFFECTS },
253 { "glGetMapiv", CALL_FLAG_NO_SIDE_EFFECTS },
254 { "glGetMaterialfv", CALL_FLAG_NO_SIDE_EFFECTS },
255 { "glGetMaterialiv", CALL_FLAG_NO_SIDE_EFFECTS },
256 { "glGetMinmaxEXT", CALL_FLAG_NO_SIDE_EFFECTS },
257 { "glGetMinmaxParameterfv", CALL_FLAG_NO_SIDE_EFFECTS },
258 { "glGetMinmaxParameterfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
259 { "glGetMinmaxParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
260 { "glGetMinmaxParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
261 { "glGetMultiTexEnvfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
262 { "glGetMultiTexEnvivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
263 { "glGetMultiTexGendvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
264 { "glGetMultiTexGenfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
265 { "glGetMultiTexGenivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
266 { "glGetMultiTexLevelParameterfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
267 { "glGetMultiTexLevelParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
268 { "glGetMultiTexParameterIivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
269 { "glGetMultiTexParameterIuivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
270 { "glGetMultiTexParameterfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
271 { "glGetMultiTexParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
272 { "glGetMultisamplefv", CALL_FLAG_NO_SIDE_EFFECTS },
273 { "glGetMultisamplefvNV", CALL_FLAG_NO_SIDE_EFFECTS },
274 { "glGetNamedBufferParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
275 { "glGetNamedBufferParameterui64vNV", CALL_FLAG_NO_SIDE_EFFECTS },
276 { "glGetNamedBufferPointervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
277 { "glGetNamedBufferSubDataEXT", CALL_FLAG_NO_SIDE_EFFECTS },
278 { "glGetNamedFramebufferAttachmentParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
279 { "glGetNamedFramebufferParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
280 { "glGetNamedProgramLocalParameterIivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
281 { "glGetNamedProgramLocalParameterIuivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
282 { "glGetNamedProgramLocalParameterdvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
283 { "glGetNamedProgramLocalParameterfvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
284 { "glGetNamedProgramStringEXT", CALL_FLAG_NO_SIDE_EFFECTS },
285 { "glGetNamedProgramivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
286 { "glGetNamedRenderbufferParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
287 { "glGetNamedStringARB", CALL_FLAG_NO_SIDE_EFFECTS },
288 { "glGetNamedStringivARB", CALL_FLAG_NO_SIDE_EFFECTS },
289 { "glGetObjectBufferfvATI", CALL_FLAG_NO_SIDE_EFFECTS },
290 { "glGetObjectBufferivATI", CALL_FLAG_NO_SIDE_EFFECTS },
291 { "glGetObjectLabel", CALL_FLAG_NO_SIDE_EFFECTS },
292 { "glGetObjectParameterfvARB", CALL_FLAG_NO_SIDE_EFFECTS },
293 { "glGetObjectParameterivAPPLE", CALL_FLAG_NO_SIDE_EFFECTS },
294 { "glGetObjectParameterivARB", CALL_FLAG_NO_SIDE_EFFECTS },
295 { "glGetObjectPtrLabel", CALL_FLAG_NO_SIDE_EFFECTS },
296 { "glGetOcclusionQueryivNV", CALL_FLAG_NO_SIDE_EFFECTS },
297 { "glGetOcclusionQueryuivNV", CALL_FLAG_NO_SIDE_EFFECTS },
298 { "glGetPerfMonitorCounterDataAMD", CALL_FLAG_NO_SIDE_EFFECTS },
299 { "glGetPerfMonitorCounterInfoAMD", CALL_FLAG_NO_SIDE_EFFECTS },
300 { "glGetPerfMonitorCounterStringAMD", CALL_FLAG_NO_SIDE_EFFECTS },
301 { "glGetPerfMonitorCountersAMD", CALL_FLAG_NO_SIDE_EFFECTS },
302 { "glGetPerfMonitorGroupStringAMD", CALL_FLAG_NO_SIDE_EFFECTS },
303 { "glGetPerfMonitorGroupsAMD", CALL_FLAG_NO_SIDE_EFFECTS },
304 { "glGetPixelTexGenParameterfvSGIS", CALL_FLAG_NO_SIDE_EFFECTS },
305 { "glGetPixelTexGenParameterivSGIS", CALL_FLAG_NO_SIDE_EFFECTS },
306 { "glGetPointerIndexedvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
307 { "glGetPointerv", CALL_FLAG_NO_SIDE_EFFECTS },
308 { "glGetPointervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
309 { "glGetProgramBinary", CALL_FLAG_NO_SIDE_EFFECTS },
310 { "glGetProgramEnvParameterIivNV", CALL_FLAG_NO_SIDE_EFFECTS },
311 { "glGetProgramEnvParameterIuivNV", CALL_FLAG_NO_SIDE_EFFECTS },
312 { "glGetProgramEnvParameterdvARB", CALL_FLAG_NO_SIDE_EFFECTS },
313 { "glGetProgramEnvParameterfvARB", CALL_FLAG_NO_SIDE_EFFECTS },
314 { "glGetProgramInfoLog", CALL_FLAG_NO_SIDE_EFFECTS },
315 { "glGetProgramInterfaceiv", CALL_FLAG_NO_SIDE_EFFECTS },
316 { "glGetProgramLocalParameterIivNV", CALL_FLAG_NO_SIDE_EFFECTS },
317 { "glGetProgramLocalParameterIuivNV", CALL_FLAG_NO_SIDE_EFFECTS },
318 { "glGetProgramLocalParameterdvARB", CALL_FLAG_NO_SIDE_EFFECTS },
319 { "glGetProgramLocalParameterfvARB", CALL_FLAG_NO_SIDE_EFFECTS },
320 { "glGetProgramNamedParameterdvNV", CALL_FLAG_NO_SIDE_EFFECTS },
321 { "glGetProgramNamedParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
322 { "glGetProgramParameterdvNV", CALL_FLAG_NO_SIDE_EFFECTS },
323 { "glGetProgramParameterfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
324 { "glGetProgramPipelineInfoLog", CALL_FLAG_NO_SIDE_EFFECTS },
325 { "glGetProgramPipelineiv", CALL_FLAG_NO_SIDE_EFFECTS },
326 { "glGetProgramResourceIndex", CALL_FLAG_NO_SIDE_EFFECTS },
327 { "glGetProgramResourceLocation", CALL_FLAG_NO_SIDE_EFFECTS },
328 { "glGetProgramResourceLocationIndex", CALL_FLAG_NO_SIDE_EFFECTS },
329 { "glGetProgramResourceName", CALL_FLAG_NO_SIDE_EFFECTS },
330 { "glGetProgramResourceiv", CALL_FLAG_NO_SIDE_EFFECTS },
331 { "glGetProgramStageiv", CALL_FLAG_NO_SIDE_EFFECTS },
332 { "glGetProgramStringARB", CALL_FLAG_NO_SIDE_EFFECTS },
333 { "glGetProgramStringNV", CALL_FLAG_NO_SIDE_EFFECTS },
334 { "glGetProgramSubroutineParameteruivNV", CALL_FLAG_NO_SIDE_EFFECTS },
335 { "glGetProgramiv", CALL_FLAG_NO_SIDE_EFFECTS },
336 { "glGetProgramivARB", CALL_FLAG_NO_SIDE_EFFECTS },
337 { "glGetProgramivNV", CALL_FLAG_NO_SIDE_EFFECTS },
338 { "glGetQueryIndexediv", CALL_FLAG_NO_SIDE_EFFECTS },
339 { "glGetQueryiv", CALL_FLAG_NO_SIDE_EFFECTS },
340 { "glGetQueryivARB", CALL_FLAG_NO_SIDE_EFFECTS },
341 { "glGetRenderbufferParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
342 { "glGetRenderbufferParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
343 { "glGetSamplerParameterIiv", CALL_FLAG_NO_SIDE_EFFECTS },
344 { "glGetSamplerParameterIuiv", CALL_FLAG_NO_SIDE_EFFECTS },
345 { "glGetSamplerParameterfv", CALL_FLAG_NO_SIDE_EFFECTS },
346 { "glGetSamplerParameteriv", CALL_FLAG_NO_SIDE_EFFECTS },
347 { "glGetSeparableFilterEXT", CALL_FLAG_NO_SIDE_EFFECTS },
348 { "glGetShaderInfoLog", CALL_FLAG_NO_SIDE_EFFECTS },
349 { "glGetShaderPrecisionFormat", CALL_FLAG_NO_SIDE_EFFECTS },
350 { "glGetShaderSource", CALL_FLAG_NO_SIDE_EFFECTS },
351 { "glGetShaderSourceARB", CALL_FLAG_NO_SIDE_EFFECTS },
352 { "glGetShaderiv", CALL_FLAG_NO_SIDE_EFFECTS },
353 { "glGetSharpenTexFuncSGIS", CALL_FLAG_NO_SIDE_EFFECTS },
354 { "glGetString", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
355 { "glGetStringi", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
356 { "glGetSynciv", CALL_FLAG_NO_SIDE_EFFECTS },
357 { "glGetTexBumpParameterfvATI", CALL_FLAG_NO_SIDE_EFFECTS },
358 { "glGetTexBumpParameterivATI", CALL_FLAG_NO_SIDE_EFFECTS },
359 { "glGetTexEnvfv", CALL_FLAG_NO_SIDE_EFFECTS },
360 { "glGetTexEnviv", CALL_FLAG_NO_SIDE_EFFECTS },
361 { "glGetTexFilterFuncSGIS", CALL_FLAG_NO_SIDE_EFFECTS },
362 { "glGetTexGendv", CALL_FLAG_NO_SIDE_EFFECTS },
363 { "glGetTexGenfv", CALL_FLAG_NO_SIDE_EFFECTS },
364 { "glGetTexGeniv", CALL_FLAG_NO_SIDE_EFFECTS },
365 { "glGetTrackMatrixivNV", CALL_FLAG_NO_SIDE_EFFECTS },
366 { "glGetTransformFeedbackVarying", CALL_FLAG_NO_SIDE_EFFECTS },
367 { "glGetTransformFeedbackVaryingEXT", CALL_FLAG_NO_SIDE_EFFECTS },
368 { "glGetTransformFeedbackVaryingNV", CALL_FLAG_NO_SIDE_EFFECTS },
369 { "glGetUniformIndices", CALL_FLAG_NO_SIDE_EFFECTS },
370 { "glGetUniformSubroutineuiv", CALL_FLAG_NO_SIDE_EFFECTS },
371 { "glGetUniformdv", CALL_FLAG_NO_SIDE_EFFECTS },
372 { "glGetUniformfv", CALL_FLAG_NO_SIDE_EFFECTS },
373 { "glGetUniformfvARB", CALL_FLAG_NO_SIDE_EFFECTS },
374 { "glGetUniformi64vNV", CALL_FLAG_NO_SIDE_EFFECTS },
375 { "glGetUniformiv", CALL_FLAG_NO_SIDE_EFFECTS },
376 { "glGetUniformivARB", CALL_FLAG_NO_SIDE_EFFECTS },
377 { "glGetUniformui64vNV", CALL_FLAG_NO_SIDE_EFFECTS },
378 { "glGetUniformuiv", CALL_FLAG_NO_SIDE_EFFECTS },
379 { "glGetUniformuivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
380 { "glGetVariantArrayObjectfvATI", CALL_FLAG_NO_SIDE_EFFECTS },
381 { "glGetVariantArrayObjectivATI", CALL_FLAG_NO_SIDE_EFFECTS },
382 { "glGetVariantBooleanvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
383 { "glGetVariantFloatvEXT", CALL_FLAG_NO_SIDE_EFFECTS },
384 { "glGetVariantIntegervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
385 { "glGetVariantPointervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
386 { "glGetVertexArrayIntegeri_vEXT", CALL_FLAG_NO_SIDE_EFFECTS },
387 { "glGetVertexArrayIntegervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
388 { "glGetVertexArrayPointeri_vEXT", CALL_FLAG_NO_SIDE_EFFECTS },
389 { "glGetVertexArrayPointervEXT", CALL_FLAG_NO_SIDE_EFFECTS },
390 { "glGetVideoCaptureStreamdvNV", CALL_FLAG_NO_SIDE_EFFECTS },
391 { "glGetVideoCaptureStreamfvNV", CALL_FLAG_NO_SIDE_EFFECTS },
392 { "glGetVideoCaptureStreamivNV", CALL_FLAG_NO_SIDE_EFFECTS },
393 { "glGetVideoCaptureivNV", CALL_FLAG_NO_SIDE_EFFECTS },
394 { "glGetVideoi64vNV", CALL_FLAG_NO_SIDE_EFFECTS },
395 { "glGetVideoivNV", CALL_FLAG_NO_SIDE_EFFECTS },
396 { "glGetVideoui64vNV", CALL_FLAG_NO_SIDE_EFFECTS },
397 { "glGetVideouivNV", CALL_FLAG_NO_SIDE_EFFECTS },
398 { "glGetnMapdvARB", CALL_FLAG_NO_SIDE_EFFECTS },
399 { "glGetnMapfvARB", CALL_FLAG_NO_SIDE_EFFECTS },
400 { "glGetnMapivARB", CALL_FLAG_NO_SIDE_EFFECTS },
401 { "glGetnUniformdvARB", CALL_FLAG_NO_SIDE_EFFECTS },
402 { "glGetnUniformfvARB", CALL_FLAG_NO_SIDE_EFFECTS },
403 { "glGetnUniformivARB", CALL_FLAG_NO_SIDE_EFFECTS },
404 { "glGetnUniformuivARB", CALL_FLAG_NO_SIDE_EFFECTS },
405 { "glInsertEventMarkerEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
406 { "glIsAsyncMarkerSGIX", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
407 { "glIsBuffer", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
408 { "glIsBufferARB", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
409 { "glIsBufferResidentNV", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
410 { "glIsEnabled", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
411 { "glIsEnabledIndexedEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
412 { "glIsEnabledi", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
413 { "glIsFenceAPPLE", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
414 { "glIsFenceNV", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
415 { "glIsFramebuffer", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
416 { "glIsFramebufferEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
417 { "glIsList", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
418 { "glIsNameAMD", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
419 { "glIsNamedBufferResidentNV", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
420 { "glIsNamedStringARB", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
421 { "glIsObjectBufferATI", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
422 { "glIsOcclusionQueryNV", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
423 { "glIsProgram", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
424 { "glIsProgramARB", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
425 { "glIsProgramNV", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
426 { "glIsProgramPipeline", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
427 { "glIsQuery", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
428 { "glIsQueryARB", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
429 { "glIsRenderbuffer", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
430 { "glIsRenderbufferEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
431 { "glIsSampler", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
432 { "glIsShader", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
433 { "glIsSync", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
434 { "glIsTexture", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
435 { "glIsTextureEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
436 { "glIsTransformFeedback", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
437 { "glIsTransformFeedbackNV", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
438 { "glIsVariantEnabledEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
439 { "glIsVertexArray", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
440 { "glIsVertexArrayAPPLE", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
441 { "glIsVertexAttribEnabledAPPLE", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
442 { "glObjectLabel", CALL_FLAG_NO_SIDE_EFFECTS },
443 { "glObjectLabelKHR", CALL_FLAG_NO_SIDE_EFFECTS },
444 { "glObjectPtrLabel", CALL_FLAG_NO_SIDE_EFFECTS },
445 { "glObjectPtrLabelKHR", CALL_FLAG_NO_SIDE_EFFECTS },
446 { "glPopDebugGroup", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP},
447 { "glPopDebugGroupKHR", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP},
448 { "glPopGroupMarkerEXT", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP},
449 { "glPushDebugGroup", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
450 { "glPushDebugGroupKHR", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
451 { "glPushGroupMarkerEXT", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
452 { "glStringMarkerGREMEDY", /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER },
453 { "glXGetClientString", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
454 { "glXGetConfig", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
455 { "glXGetCurrentContext", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
456 { "glXGetCurrentDisplay", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
457 { "glXGetCurrentDisplayEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
458 { "glXGetCurrentDrawable", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
459 { "glXGetCurrentReadDrawable", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
460 { "glXGetCurrentReadDrawableSGI", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
461 { "glXGetFBConfigAttrib", CALL_FLAG_VERBOSE },
462 { "glXGetFBConfigAttribSGIX", CALL_FLAG_VERBOSE },
463 { "glXGetProcAddress", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
464 { "glXGetProcAddressARB", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
465 { "glXIsDirect", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
466 { "glXQueryExtension", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
467 { "glXQueryExtensionsString", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
468 { "glXQueryVersion", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
469 { "glXSwapBuffers", CALL_FLAG_SWAPBUFFERS },
470 { "glXSwapBuffersMscOML", CALL_FLAG_SWAPBUFFERS },
471 { "wglDescribePixelFormat", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
472 { "wglGetCurrentContext", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
473 { "wglGetCurrentDC", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
474 { "wglGetDefaultProcAddress", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
475 { "wglGetExtensionsStringARB", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
476 { "wglGetExtensionsStringEXT", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
477 { "wglGetPixelFormat", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
478 { "wglGetPixelFormatAttribivARB", CALL_FLAG_VERBOSE },
479 { "wglGetPixelFormatAttribivEXT", CALL_FLAG_VERBOSE },
480 { "wglGetProcAddress", CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
481 { "wglSwapBuffers", CALL_FLAG_SWAPBUFFERS },
482 { "wglSwapLayerBuffers", CALL_FLAG_SWAPBUFFERS },
483 { "wglSwapMultipleBuffers", CALL_FLAG_SWAPBUFFERS },
484 // NOTE: New entries must be sorted alphabetically
485 };
486
487
488
489
490
491 /**
492 * Lookup call flags by name.
493 */
494 CallFlags
lookupCallFlags(const char * name)495 Parser::lookupCallFlags(const char *name)
496 {
497 using namespace std;
498
499 if (name[0] == 'g') {
500 static const regex draw(
501 "^gl([A-Z][a-z]+)*Draw(Range|Mesh)?(Arrays|Elements)([A-Z][a-zA-Z]*)?$"
502 );
503
504 static const regex miscDraw(
505 "^gl("
506 "CallLists?|"
507 "Clear|"
508 "End|"
509 "DrawPixels|"
510 "DrawTransformFeedback([A-Z][a-zA-Z]*)?|"
511 "BlitFramebuffer|"
512 "Rect[dfis]v?|"
513 "EvalMesh[0-9]+"
514 ")[0-9A-Z]*$"
515 );
516 if (regex_match(name, draw) ||
517 regex_match(name, miscDraw)) {
518 return CALL_FLAG_RENDER;
519 }
520
521 static const regex fbo( "^glBindFramebuffer[0-9A-Z]*");
522 if (regex_match(name, fbo)) {
523 return CALL_FLAG_SWAP_RENDERTARGET;
524 }
525
526 static const regex get(
527 "^gl("
528 "GetFloat|"
529 "GetInteger|"
530 "GetVertexAttrib|"
531 "GetTex(ture)?(Level)?Parameter"
532 ")\\w+$"
533 );
534 if (regex_match(name, get)) {
535 return CALL_FLAG_NO_SIDE_EFFECTS;
536 }
537 }
538
539 if (name[0] == 'I') {
540 static const regex present("^IDXGI(Decode)?SwapChain\\w*::Present\\w*$");
541 static const regex draw ("^ID3D1(0Device|1DeviceContext)\\d*::(Draw\\w*|ExecuteCommandList)$");
542 static const regex srt ("^ID3D1(0Device|1DeviceContext)\\d*::OMSetRenderTargets\\w*$");
543 static const regex cmql ("^ID3D1[01]Device\\d*::(CheckFormatSupport|CheckMultisampleQualityLevels)$");
544
545 if (regex_match(name, draw)) return CALL_FLAG_RENDER;
546 if (regex_match(name, srt)) return CALL_FLAG_SWAP_RENDERTARGET;
547 if (regex_match(name, present)) return CALL_FLAG_END_FRAME /* | CALL_FLAG_SWAPBUFFERS */;
548 if (regex_match(name, cmql)) return CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE;
549 }
550
551 return entryLookup(name, callFlagTable, defaultCallFlags);
552 }
553