1 /**************************************************************************
2  *
3  * Copyright 2015 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25 
26 
27 #include "trace_parser.hpp"
28 
29 #include "gtest/gtest.h"
30 
31 #include "trace_lookup.hpp"
32 
33 using namespace trace;
34 
35 
36 /**
37  * Shortcut for SwapBuffers, which terminate and swap bound render buffer.
38  */
39 #define CALL_FLAG_SWAPBUFFERS (CALL_FLAG_END_FRAME | CALL_FLAG_SWAP_RENDERTARGET)
40 
41 
42 
43 /**
44  * Call flags lookup table.
45  */
46 static const Entry<CallFlags>
47 entries[] = {
48     { "CGLFlushDrawable",                              CALL_FLAG_END_FRAME },
49     { "CGLGetCurrentContext",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
50     { "D3DPERF_BeginEvent",                            /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
51     { "D3DPERF_EndEvent",                              /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP },
52     { "D3DPERF_SetMarker",                             /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER },
53     { "ID3D10Device1::CheckMultisampleQualityLevels",  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
54     { "ID3D10Device1::Draw",                           CALL_FLAG_RENDER },
55     { "ID3D10Device1::DrawAuto",                       CALL_FLAG_RENDER },
56     { "ID3D10Device1::DrawIndexed",                    CALL_FLAG_RENDER },
57     { "ID3D10Device1::DrawIndexedInstanced",           CALL_FLAG_RENDER },
58     { "ID3D10Device1::DrawInstanced",                  CALL_FLAG_RENDER },
59     { "ID3D10Device1::OMSetRenderTargets",             CALL_FLAG_SWAP_RENDERTARGET },
60     { "ID3D10Device::CheckMultisampleQualityLevels",   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
61     { "ID3D10Device::Draw",                            CALL_FLAG_RENDER },
62     { "ID3D10Device::DrawAuto",                        CALL_FLAG_RENDER },
63     { "ID3D10Device::DrawIndexed",                     CALL_FLAG_RENDER },
64     { "ID3D10Device::DrawIndexedInstanced",            CALL_FLAG_RENDER },
65     { "ID3D10Device::DrawInstanced",                   CALL_FLAG_RENDER },
66     { "ID3D10Device::OMSetRenderTargets",              CALL_FLAG_SWAP_RENDERTARGET },
67     { "ID3D11Device::CheckMultisampleQualityLevels",   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
68     { "ID3D11DeviceContext1::Draw",                          CALL_FLAG_RENDER },
69     { "ID3D11DeviceContext1::DrawAuto",                      CALL_FLAG_RENDER },
70     { "ID3D11DeviceContext1::DrawIndexed",                   CALL_FLAG_RENDER },
71     { "ID3D11DeviceContext1::DrawIndexedInstanced",          CALL_FLAG_RENDER },
72     { "ID3D11DeviceContext1::DrawIndexedInstancedIndirect",  CALL_FLAG_RENDER },
73     { "ID3D11DeviceContext1::DrawInstanced",                 CALL_FLAG_RENDER },
74     { "ID3D11DeviceContext1::DrawInstancedIndirect",         CALL_FLAG_RENDER },
75     { "ID3D11DeviceContext1::ExecuteCommandList",            CALL_FLAG_RENDER },
76     { "ID3D11DeviceContext1::OMSetRenderTargets",       CALL_FLAG_SWAP_RENDERTARGET },
77     { "ID3D11DeviceContext1::OMSetRenderTargetsAndUnorderedAccessViews", CALL_FLAG_SWAP_RENDERTARGET },
78     { "ID3D11DeviceContext::Draw",                          CALL_FLAG_RENDER },
79     { "ID3D11DeviceContext::DrawAuto",                      CALL_FLAG_RENDER },
80     { "ID3D11DeviceContext::DrawIndexed",                   CALL_FLAG_RENDER },
81     { "ID3D11DeviceContext::DrawIndexedInstanced",          CALL_FLAG_RENDER },
82     { "ID3D11DeviceContext::DrawIndexedInstancedIndirect",  CALL_FLAG_RENDER },
83     { "ID3D11DeviceContext::DrawInstanced",                 CALL_FLAG_RENDER },
84     { "ID3D11DeviceContext::DrawInstancedIndirect",         CALL_FLAG_RENDER },
85     { "ID3D11DeviceContext::ExecuteCommandList",            CALL_FLAG_RENDER },
86     { "ID3D11DeviceContext::OMSetRenderTargets",       CALL_FLAG_SWAP_RENDERTARGET },
87     { "ID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews", CALL_FLAG_SWAP_RENDERTARGET },
88     { "ID3DUserDefinedAnnotation::BeginEvent",         /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
89     { "ID3DUserDefinedAnnotation::EndEvent",           /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP },
90     { "ID3DUserDefinedAnnotation::SetMarker",          /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER },
91     { "IDXGIDecodeSwapChain::PresentBuffer",           CALL_FLAG_END_FRAME /* CALL_FLAG_SWAPBUFFERS */ },
92     { "IDXGISwapChain1::Present",                      CALL_FLAG_END_FRAME /* CALL_FLAG_SWAPBUFFERS */ },
93     { "IDXGISwapChain1::Present1",                     CALL_FLAG_END_FRAME /* CALL_FLAG_SWAPBUFFERS */ },
94     { "IDXGISwapChain2::Present",                      CALL_FLAG_END_FRAME /* CALL_FLAG_SWAPBUFFERS */ },
95     { "IDXGISwapChain2::Present1",                     CALL_FLAG_END_FRAME /* CALL_FLAG_SWAPBUFFERS */ },
96     { "IDXGISwapChain::Present",                       CALL_FLAG_END_FRAME /* CALL_FLAG_SWAPBUFFERS */ },
97     { "IDXGISwapChainDWM::Present",                    CALL_FLAG_END_FRAME /* CALL_FLAG_SWAPBUFFERS */ },
98     { "IDirect3D8::CheckDeviceFormat",                 CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
99     { "IDirect3D8::EnumAdapterModes",                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
100     { "IDirect3D8::GetAdapterModeCount",               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
101     { "IDirect3D8::GetDeviceCaps",                     CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
102     { "IDirect3D9::CheckDeviceFormat",                 CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
103     { "IDirect3D9::EnumAdapterModes",                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
104     { "IDirect3D9::GetAdapterModeCount",               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
105     { "IDirect3D9::GetDeviceCaps",                     CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
106     { "IDirect3D9Ex::CheckDeviceFormat",               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
107     { "IDirect3D9Ex::EnumAdapterModes",                CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
108     { "IDirect3D9Ex::GetAdapterModeCount",             CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
109     { "IDirect3D9Ex::GetDeviceCaps",                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
110     { "IDirect3DDevice2::DrawIndexedPrimitive",        CALL_FLAG_RENDER },
111     { "IDirect3DDevice2::DrawPrimitive",               CALL_FLAG_RENDER },
112     { "IDirect3DDevice3::DrawIndexedPrimitive",        CALL_FLAG_RENDER },
113     { "IDirect3DDevice3::DrawIndexedPrimitiveStrided", CALL_FLAG_RENDER },
114     { "IDirect3DDevice3::DrawIndexedPrimitiveVB",      CALL_FLAG_RENDER },
115     { "IDirect3DDevice3::DrawPrimitive",               CALL_FLAG_RENDER },
116     { "IDirect3DDevice3::DrawPrimitiveStrided",        CALL_FLAG_RENDER },
117     { "IDirect3DDevice3::DrawPrimitiveVB",             CALL_FLAG_RENDER },
118     { "IDirect3DDevice7::Clear",                       CALL_FLAG_RENDER },
119     { "IDirect3DDevice7::DrawIndexedPrimitive",        CALL_FLAG_RENDER },
120     { "IDirect3DDevice7::DrawIndexedPrimitiveStrided", CALL_FLAG_RENDER },
121     { "IDirect3DDevice7::DrawIndexedPrimitiveVB",      CALL_FLAG_RENDER },
122     { "IDirect3DDevice7::DrawPrimitive",               CALL_FLAG_RENDER },
123     { "IDirect3DDevice7::DrawPrimitiveStrided",        CALL_FLAG_RENDER },
124     { "IDirect3DDevice7::DrawPrimitiveVB",             CALL_FLAG_RENDER },
125     { "IDirect3DDevice8::Clear",                       CALL_FLAG_RENDER },
126     { "IDirect3DDevice8::DrawIndexedPrimitive",        CALL_FLAG_RENDER },
127     { "IDirect3DDevice8::DrawIndexedPrimitiveUP",      CALL_FLAG_RENDER },
128     { "IDirect3DDevice8::DrawPrimitive",               CALL_FLAG_RENDER },
129     { "IDirect3DDevice8::DrawPrimitiveUP",             CALL_FLAG_RENDER },
130     { "IDirect3DDevice8::DrawRectPatch",               CALL_FLAG_RENDER },
131     { "IDirect3DDevice8::DrawTriPatch",                CALL_FLAG_RENDER },
132     { "IDirect3DDevice8::GetDeviceCaps",               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
133     { "IDirect3DDevice8::Present",                     CALL_FLAG_SWAPBUFFERS },
134     { "IDirect3DDevice8::SetRenderTarget",             CALL_FLAG_SWAP_RENDERTARGET },
135     { "IDirect3DDevice9::Clear",                       CALL_FLAG_RENDER },
136     { "IDirect3DDevice9::DrawIndexedPrimitive",        CALL_FLAG_RENDER },
137     { "IDirect3DDevice9::DrawIndexedPrimitiveUP",      CALL_FLAG_RENDER },
138     { "IDirect3DDevice9::DrawPrimitive",               CALL_FLAG_RENDER },
139     { "IDirect3DDevice9::DrawPrimitiveUP",             CALL_FLAG_RENDER },
140     { "IDirect3DDevice9::DrawRectPatch",               CALL_FLAG_RENDER },
141     { "IDirect3DDevice9::DrawTriPatch",                CALL_FLAG_RENDER },
142     { "IDirect3DDevice9::GetDeviceCaps",               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
143     { "IDirect3DDevice9::GetRenderTargetData",         CALL_FLAG_END_FRAME },
144     { "IDirect3DDevice9::Present",                     CALL_FLAG_SWAPBUFFERS },
145     { "IDirect3DDevice9::SetRenderTarget",             CALL_FLAG_SWAP_RENDERTARGET },
146     { "IDirect3DDevice9Ex::Clear",                     CALL_FLAG_RENDER },
147     { "IDirect3DDevice9Ex::DrawIndexedPrimitive",      CALL_FLAG_RENDER },
148     { "IDirect3DDevice9Ex::DrawIndexedPrimitiveUP",    CALL_FLAG_RENDER },
149     { "IDirect3DDevice9Ex::DrawPrimitive",             CALL_FLAG_RENDER },
150     { "IDirect3DDevice9Ex::DrawPrimitiveUP",           CALL_FLAG_RENDER },
151     { "IDirect3DDevice9Ex::DrawRectPatch",             CALL_FLAG_RENDER },
152     { "IDirect3DDevice9Ex::DrawTriPatch",              CALL_FLAG_RENDER },
153     { "IDirect3DDevice9Ex::GetDeviceCaps",             CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
154     { "IDirect3DDevice9Ex::GetRenderTargetData",       CALL_FLAG_END_FRAME },
155     { "IDirect3DDevice9Ex::Present",                   CALL_FLAG_SWAPBUFFERS },
156     { "IDirect3DDevice9Ex::PresentEx",                 CALL_FLAG_SWAPBUFFERS },
157     { "IDirect3DDevice9Ex::SetRenderTarget",           CALL_FLAG_SWAP_RENDERTARGET },
158     { "IDirect3DSwapChain9::Present",                  CALL_FLAG_SWAPBUFFERS },
159     { "IDirect3DSwapChain9Ex::Present",                CALL_FLAG_SWAPBUFFERS },
160     { "IDirect3DViewport2::Clear",                     CALL_FLAG_RENDER },
161     { "IDirect3DViewport3::Clear",                     CALL_FLAG_RENDER },
162     { "IDirect3DViewport3::Clear2",                    CALL_FLAG_RENDER },
163     { "IDirect3DViewport::Clear",                      CALL_FLAG_RENDER },
164     { "eglGetConfigAttrib",                            CALL_FLAG_VERBOSE },
165     { "eglGetProcAddress",                             CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
166     { "eglQueryString",                                CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
167     { "eglSwapBuffers",                                CALL_FLAG_SWAPBUFFERS },
168     { "glAreProgramsResidentNV",                       CALL_FLAG_NO_SIDE_EFFECTS },
169     { "glAreTexturesResident",                         CALL_FLAG_NO_SIDE_EFFECTS },
170     { "glAreTexturesResidentEXT",                      CALL_FLAG_NO_SIDE_EFFECTS },
171     { "glBindFramebuffer",                             CALL_FLAG_SWAP_RENDERTARGET },
172     { "glBindFramebufferEXT",                          CALL_FLAG_SWAP_RENDERTARGET },
173     { "glBindFramebufferOES",                          CALL_FLAG_SWAP_RENDERTARGET },
174     { "glBlitFramebuffer",                             CALL_FLAG_RENDER },
175     { "glBlitFramebufferANGLE",                        CALL_FLAG_RENDER },
176     { "glBlitFramebufferEXT",                          CALL_FLAG_RENDER },
177     { "glBlitFramebufferNV",                           CALL_FLAG_RENDER },
178     { "glBufferRegionEnabled",                         CALL_FLAG_NO_SIDE_EFFECTS },
179     { "glCallList",                                    CALL_FLAG_RENDER },
180     { "glCallLists",                                   CALL_FLAG_RENDER },
181     { "glClear",                                       CALL_FLAG_RENDER },
182     { "glDebugMessageControl",                         CALL_FLAG_NO_SIDE_EFFECTS },
183     { "glDebugMessageControlARB",                      CALL_FLAG_NO_SIDE_EFFECTS },
184     { "glDebugMessageEnableAMD",                       CALL_FLAG_NO_SIDE_EFFECTS },
185     { "glDebugMessageInsert",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
186     { "glDebugMessageInsertAMD",                       CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
187     { "glDebugMessageInsertARB",                       CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
188     { "glDebugMessageInsertKHR",                       CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
189     { "glDrawArrays",                                  CALL_FLAG_RENDER },
190     { "glDrawArraysEXT",                               CALL_FLAG_RENDER },
191     { "glDrawArraysIndirect",                          CALL_FLAG_RENDER },
192     { "glDrawArraysInstanced",                         CALL_FLAG_RENDER },
193     { "glDrawArraysInstancedANGLE",                    CALL_FLAG_RENDER },
194     { "glDrawArraysInstancedARB",                      CALL_FLAG_RENDER },
195     { "glDrawArraysInstancedBaseInstance",             CALL_FLAG_RENDER },
196     { "glDrawArraysInstancedEXT",                      CALL_FLAG_RENDER },
197     { "glDrawElements",                                CALL_FLAG_RENDER },
198     { "glDrawElementsBaseVertex",                      CALL_FLAG_RENDER },
199     { "glDrawElementsIndirect",                        CALL_FLAG_RENDER },
200     { "glDrawElementsInstanced",                       CALL_FLAG_RENDER },
201     { "glDrawElementsInstancedANGLE",                  CALL_FLAG_RENDER },
202     { "glDrawElementsInstancedARB",                    CALL_FLAG_RENDER },
203     { "glDrawElementsInstancedBaseInstance",           CALL_FLAG_RENDER },
204     { "glDrawElementsInstancedBaseVertex",             CALL_FLAG_RENDER },
205     { "glDrawElementsInstancedBaseVertexBaseInstance", CALL_FLAG_RENDER },
206     { "glDrawElementsInstancedEXT",                    CALL_FLAG_RENDER },
207     { "glDrawMeshArraysSUN",                           CALL_FLAG_RENDER },
208     { "glDrawPixels",                                  CALL_FLAG_RENDER },
209     { "glDrawRangeElementArrayAPPLE",                  0 },
210     { "glDrawRangeElementArrayATI",                    0 },
211     { "glDrawRangeElements",                           CALL_FLAG_RENDER },
212     { "glDrawRangeElementsBaseVertex",                 CALL_FLAG_RENDER },
213     { "glDrawRangeElementsEXT",                        CALL_FLAG_RENDER },
214     { "glDrawTransformFeedback",                       CALL_FLAG_RENDER },
215     { "glDrawTransformFeedbackInstanced",              CALL_FLAG_RENDER },
216     { "glDrawTransformFeedbackNV",                     CALL_FLAG_RENDER },
217     { "glDrawTransformFeedbackStream",                 CALL_FLAG_RENDER },
218     { "glDrawTransformFeedbackStreamInstanced",        CALL_FLAG_RENDER },
219     { "glEnd",                                         CALL_FLAG_RENDER },
220     { "glEvalMesh1",                                   CALL_FLAG_RENDER },
221     { "glEvalMesh2",                                   CALL_FLAG_RENDER },
222     { "glFrameTerminatorGREMEDY",                      CALL_FLAG_END_FRAME },
223     { "glGetActiveAtomicCounterBufferiv",              CALL_FLAG_NO_SIDE_EFFECTS },
224     { "glGetActiveAttrib",                             CALL_FLAG_NO_SIDE_EFFECTS },
225     { "glGetActiveAttribARB",                          CALL_FLAG_NO_SIDE_EFFECTS },
226     { "glGetActiveSubroutineName",                     CALL_FLAG_NO_SIDE_EFFECTS },
227     { "glGetActiveSubroutineUniformName",              CALL_FLAG_NO_SIDE_EFFECTS },
228     { "glGetActiveSubroutineUniformiv",                CALL_FLAG_NO_SIDE_EFFECTS },
229     { "glGetActiveUniform",                            CALL_FLAG_NO_SIDE_EFFECTS },
230     { "glGetActiveUniformARB",                         CALL_FLAG_NO_SIDE_EFFECTS },
231     { "glGetActiveUniformBlockName",                   CALL_FLAG_NO_SIDE_EFFECTS },
232     { "glGetActiveUniformBlockiv",                     CALL_FLAG_NO_SIDE_EFFECTS },
233     { "glGetActiveUniformName",                        CALL_FLAG_NO_SIDE_EFFECTS },
234     { "glGetActiveUniformsiv",                         CALL_FLAG_NO_SIDE_EFFECTS },
235     { "glGetActiveVaryingNV",                          CALL_FLAG_NO_SIDE_EFFECTS },
236     { "glGetArrayObjectfvATI",                         CALL_FLAG_NO_SIDE_EFFECTS },
237     { "glGetArrayObjectivATI",                         CALL_FLAG_NO_SIDE_EFFECTS },
238     { "glGetAttachedObjectsARB",                       CALL_FLAG_NO_SIDE_EFFECTS },
239     { "glGetAttachedShaders",                          CALL_FLAG_NO_SIDE_EFFECTS },
240     { "glGetBooleanIndexedvEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
241     { "glGetBooleani_v",                               CALL_FLAG_NO_SIDE_EFFECTS },
242     { "glGetBooleanv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
243     { "glGetBufferParameteri64v",                      CALL_FLAG_NO_SIDE_EFFECTS },
244     { "glGetBufferParameteriv",                        CALL_FLAG_NO_SIDE_EFFECTS },
245     { "glGetBufferParameterivARB",                     CALL_FLAG_NO_SIDE_EFFECTS },
246     { "glGetBufferParameterui64vNV",                   CALL_FLAG_NO_SIDE_EFFECTS },
247     { "glGetBufferPointerv",                           CALL_FLAG_NO_SIDE_EFFECTS },
248     { "glGetBufferPointervARB",                        CALL_FLAG_NO_SIDE_EFFECTS },
249     { "glGetBufferSubData",                            CALL_FLAG_NO_SIDE_EFFECTS },
250     { "glGetBufferSubDataARB",                         CALL_FLAG_NO_SIDE_EFFECTS },
251     { "glGetClipPlane",                                CALL_FLAG_NO_SIDE_EFFECTS },
252     { "glGetColorTable",                               CALL_FLAG_NO_SIDE_EFFECTS },
253     { "glGetColorTableEXT",                            CALL_FLAG_NO_SIDE_EFFECTS },
254     { "glGetColorTableParameterfv",                    CALL_FLAG_NO_SIDE_EFFECTS },
255     { "glGetColorTableParameterfvEXT",                 CALL_FLAG_NO_SIDE_EFFECTS },
256     { "glGetColorTableParameterfvSGI",                 CALL_FLAG_NO_SIDE_EFFECTS },
257     { "glGetColorTableParameteriv",                    CALL_FLAG_NO_SIDE_EFFECTS },
258     { "glGetColorTableParameterivEXT",                 CALL_FLAG_NO_SIDE_EFFECTS },
259     { "glGetColorTableParameterivSGI",                 CALL_FLAG_NO_SIDE_EFFECTS },
260     { "glGetColorTableSGI",                            CALL_FLAG_NO_SIDE_EFFECTS },
261     { "glGetCombinerInputParameterfvNV",               CALL_FLAG_NO_SIDE_EFFECTS },
262     { "glGetCombinerInputParameterivNV",               CALL_FLAG_NO_SIDE_EFFECTS },
263     { "glGetCombinerOutputParameterfvNV",              CALL_FLAG_NO_SIDE_EFFECTS },
264     { "glGetCombinerOutputParameterivNV",              CALL_FLAG_NO_SIDE_EFFECTS },
265     { "glGetCombinerStageParameterfvNV",               CALL_FLAG_NO_SIDE_EFFECTS },
266     { "glGetConvolutionFilterEXT",                     CALL_FLAG_NO_SIDE_EFFECTS },
267     { "glGetConvolutionParameterfv",                   CALL_FLAG_NO_SIDE_EFFECTS },
268     { "glGetConvolutionParameterfvEXT",                CALL_FLAG_NO_SIDE_EFFECTS },
269     { "glGetConvolutionParameteriv",                   CALL_FLAG_NO_SIDE_EFFECTS },
270     { "glGetConvolutionParameterivEXT",                CALL_FLAG_NO_SIDE_EFFECTS },
271     { "glGetDetailTexFuncSGIS",                        CALL_FLAG_NO_SIDE_EFFECTS },
272     { "glGetDoubleIndexedvEXT",                        CALL_FLAG_NO_SIDE_EFFECTS },
273     { "glGetDoublei_v",                                CALL_FLAG_NO_SIDE_EFFECTS },
274     { "glGetDoublev",                                  CALL_FLAG_NO_SIDE_EFFECTS },
275     { "glGetError",                                    CALL_FLAG_NO_SIDE_EFFECTS }, // verbose will be set later for GL_NO_ERROR
276     { "glGetFenceivNV",                                CALL_FLAG_NO_SIDE_EFFECTS },
277     { "glGetFinalCombinerInputParameterfvNV",          CALL_FLAG_NO_SIDE_EFFECTS },
278     { "glGetFinalCombinerInputParameterivNV",          CALL_FLAG_NO_SIDE_EFFECTS },
279     { "glGetFloatIndexedvEXT",                         CALL_FLAG_NO_SIDE_EFFECTS },
280     { "glGetFloati_v",                                 CALL_FLAG_NO_SIDE_EFFECTS },
281     { "glGetFloatv",                                   CALL_FLAG_NO_SIDE_EFFECTS },
282     { "glGetFogFuncSGIS",                              CALL_FLAG_NO_SIDE_EFFECTS },
283     { "glGetFragDataIndex",                            CALL_FLAG_NO_SIDE_EFFECTS },
284     { "glGetFragmentLightfvSGIX",                      CALL_FLAG_NO_SIDE_EFFECTS },
285     { "glGetFragmentLightivSGIX",                      CALL_FLAG_NO_SIDE_EFFECTS },
286     { "glGetFragmentMaterialfvSGIX",                   CALL_FLAG_NO_SIDE_EFFECTS },
287     { "glGetFragmentMaterialivSGIX",                   CALL_FLAG_NO_SIDE_EFFECTS },
288     { "glGetFramebufferAttachmentParameteriv",         CALL_FLAG_NO_SIDE_EFFECTS },
289     { "glGetFramebufferAttachmentParameterivEXT",      CALL_FLAG_NO_SIDE_EFFECTS },
290     { "glGetFramebufferParameteriv",                   CALL_FLAG_NO_SIDE_EFFECTS },
291     { "glGetFramebufferParameterivEXT",                CALL_FLAG_NO_SIDE_EFFECTS },
292     { "glGetGraphicsResetStatusARB",                   CALL_FLAG_NO_SIDE_EFFECTS },
293     { "glGetHandleARB",                                CALL_FLAG_NO_SIDE_EFFECTS },
294     { "glGetHistogramEXT",                             CALL_FLAG_NO_SIDE_EFFECTS },
295     { "glGetHistogramParameterfv",                     CALL_FLAG_NO_SIDE_EFFECTS },
296     { "glGetHistogramParameterfvEXT",                  CALL_FLAG_NO_SIDE_EFFECTS },
297     { "glGetHistogramParameteriv",                     CALL_FLAG_NO_SIDE_EFFECTS },
298     { "glGetHistogramParameterivEXT",                  CALL_FLAG_NO_SIDE_EFFECTS },
299     { "glGetImageTransformParameterfvHP",              CALL_FLAG_NO_SIDE_EFFECTS },
300     { "glGetImageTransformParameterivHP",              CALL_FLAG_NO_SIDE_EFFECTS },
301     { "glGetInfoLogARB",                               CALL_FLAG_NO_SIDE_EFFECTS },
302     { "glGetInstrumentsSGIX",                          CALL_FLAG_NO_SIDE_EFFECTS },
303     { "glGetInteger64i_v",                             CALL_FLAG_NO_SIDE_EFFECTS },
304     { "glGetInteger64v",                               CALL_FLAG_NO_SIDE_EFFECTS },
305     { "glGetIntegerIndexedvEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
306     { "glGetIntegeri_v",                               CALL_FLAG_NO_SIDE_EFFECTS },
307     { "glGetIntegerui64i_vNV",                         CALL_FLAG_NO_SIDE_EFFECTS },
308     { "glGetIntegerui64vNV",                           CALL_FLAG_NO_SIDE_EFFECTS },
309     { "glGetIntegerv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
310     { "glGetInternalformati64v",                       CALL_FLAG_NO_SIDE_EFFECTS },
311     { "glGetInternalformativ",                         CALL_FLAG_NO_SIDE_EFFECTS },
312     { "glGetInvariantBooleanvEXT",                     CALL_FLAG_NO_SIDE_EFFECTS },
313     { "glGetInvariantFloatvEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
314     { "glGetInvariantIntegervEXT",                     CALL_FLAG_NO_SIDE_EFFECTS },
315     { "glGetLightfv",                                  CALL_FLAG_NO_SIDE_EFFECTS },
316     { "glGetLightiv",                                  CALL_FLAG_NO_SIDE_EFFECTS },
317     { "glGetListParameterfvSGIX",                      CALL_FLAG_NO_SIDE_EFFECTS },
318     { "glGetListParameterivSGIX",                      CALL_FLAG_NO_SIDE_EFFECTS },
319     { "glGetLocalConstantBooleanvEXT",                 CALL_FLAG_NO_SIDE_EFFECTS },
320     { "glGetLocalConstantFloatvEXT",                   CALL_FLAG_NO_SIDE_EFFECTS },
321     { "glGetLocalConstantIntegervEXT",                 CALL_FLAG_NO_SIDE_EFFECTS },
322     { "glGetMapAttribParameterfvNV",                   CALL_FLAG_NO_SIDE_EFFECTS },
323     { "glGetMapAttribParameterivNV",                   CALL_FLAG_NO_SIDE_EFFECTS },
324     { "glGetMapControlPointsNV",                       CALL_FLAG_NO_SIDE_EFFECTS },
325     { "glGetMapParameterfvNV",                         CALL_FLAG_NO_SIDE_EFFECTS },
326     { "glGetMapParameterivNV",                         CALL_FLAG_NO_SIDE_EFFECTS },
327     { "glGetMapdv",                                    CALL_FLAG_NO_SIDE_EFFECTS },
328     { "glGetMapfv",                                    CALL_FLAG_NO_SIDE_EFFECTS },
329     { "glGetMapiv",                                    CALL_FLAG_NO_SIDE_EFFECTS },
330     { "glGetMaterialfv",                               CALL_FLAG_NO_SIDE_EFFECTS },
331     { "glGetMaterialiv",                               CALL_FLAG_NO_SIDE_EFFECTS },
332     { "glGetMinmaxEXT",                                CALL_FLAG_NO_SIDE_EFFECTS },
333     { "glGetMinmaxParameterfv",                        CALL_FLAG_NO_SIDE_EFFECTS },
334     { "glGetMinmaxParameterfvEXT",                     CALL_FLAG_NO_SIDE_EFFECTS },
335     { "glGetMinmaxParameteriv",                        CALL_FLAG_NO_SIDE_EFFECTS },
336     { "glGetMinmaxParameterivEXT",                     CALL_FLAG_NO_SIDE_EFFECTS },
337     { "glGetMultiTexEnvfvEXT",                         CALL_FLAG_NO_SIDE_EFFECTS },
338     { "glGetMultiTexEnvivEXT",                         CALL_FLAG_NO_SIDE_EFFECTS },
339     { "glGetMultiTexGendvEXT",                         CALL_FLAG_NO_SIDE_EFFECTS },
340     { "glGetMultiTexGenfvEXT",                         CALL_FLAG_NO_SIDE_EFFECTS },
341     { "glGetMultiTexGenivEXT",                         CALL_FLAG_NO_SIDE_EFFECTS },
342     { "glGetMultiTexLevelParameterfvEXT",              CALL_FLAG_NO_SIDE_EFFECTS },
343     { "glGetMultiTexLevelParameterivEXT",              CALL_FLAG_NO_SIDE_EFFECTS },
344     { "glGetMultiTexParameterIivEXT",                  CALL_FLAG_NO_SIDE_EFFECTS },
345     { "glGetMultiTexParameterIuivEXT",                 CALL_FLAG_NO_SIDE_EFFECTS },
346     { "glGetMultiTexParameterfvEXT",                   CALL_FLAG_NO_SIDE_EFFECTS },
347     { "glGetMultiTexParameterivEXT",                   CALL_FLAG_NO_SIDE_EFFECTS },
348     { "glGetMultisamplefv",                            CALL_FLAG_NO_SIDE_EFFECTS },
349     { "glGetMultisamplefvNV",                          CALL_FLAG_NO_SIDE_EFFECTS },
350     { "glGetNamedBufferParameterivEXT",                CALL_FLAG_NO_SIDE_EFFECTS },
351     { "glGetNamedBufferParameterui64vNV",              CALL_FLAG_NO_SIDE_EFFECTS },
352     { "glGetNamedBufferPointervEXT",                   CALL_FLAG_NO_SIDE_EFFECTS },
353     { "glGetNamedBufferSubDataEXT",                    CALL_FLAG_NO_SIDE_EFFECTS },
354     { "glGetNamedFramebufferAttachmentParameterivEXT", CALL_FLAG_NO_SIDE_EFFECTS },
355     { "glGetNamedFramebufferParameterivEXT",           CALL_FLAG_NO_SIDE_EFFECTS },
356     { "glGetNamedProgramLocalParameterIivEXT",         CALL_FLAG_NO_SIDE_EFFECTS },
357     { "glGetNamedProgramLocalParameterIuivEXT",        CALL_FLAG_NO_SIDE_EFFECTS },
358     { "glGetNamedProgramLocalParameterdvEXT",          CALL_FLAG_NO_SIDE_EFFECTS },
359     { "glGetNamedProgramLocalParameterfvEXT",          CALL_FLAG_NO_SIDE_EFFECTS },
360     { "glGetNamedProgramStringEXT",                    CALL_FLAG_NO_SIDE_EFFECTS },
361     { "glGetNamedProgramivEXT",                        CALL_FLAG_NO_SIDE_EFFECTS },
362     { "glGetNamedRenderbufferParameterivEXT",          CALL_FLAG_NO_SIDE_EFFECTS },
363     { "glGetNamedStringARB",                           CALL_FLAG_NO_SIDE_EFFECTS },
364     { "glGetNamedStringivARB",                         CALL_FLAG_NO_SIDE_EFFECTS },
365     { "glGetObjectBufferfvATI",                        CALL_FLAG_NO_SIDE_EFFECTS },
366     { "glGetObjectBufferivATI",                        CALL_FLAG_NO_SIDE_EFFECTS },
367     { "glGetObjectLabel",                              CALL_FLAG_NO_SIDE_EFFECTS },
368     { "glGetObjectParameterfvARB",                     CALL_FLAG_NO_SIDE_EFFECTS },
369     { "glGetObjectParameterivAPPLE",                   CALL_FLAG_NO_SIDE_EFFECTS },
370     { "glGetObjectParameterivARB",                     CALL_FLAG_NO_SIDE_EFFECTS },
371     { "glGetObjectPtrLabel",                           CALL_FLAG_NO_SIDE_EFFECTS },
372     { "glGetOcclusionQueryivNV",                       CALL_FLAG_NO_SIDE_EFFECTS },
373     { "glGetOcclusionQueryuivNV",                      CALL_FLAG_NO_SIDE_EFFECTS },
374     { "glGetPerfMonitorCounterDataAMD",                CALL_FLAG_NO_SIDE_EFFECTS },
375     { "glGetPerfMonitorCounterInfoAMD",                CALL_FLAG_NO_SIDE_EFFECTS },
376     { "glGetPerfMonitorCounterStringAMD",              CALL_FLAG_NO_SIDE_EFFECTS },
377     { "glGetPerfMonitorCountersAMD",                   CALL_FLAG_NO_SIDE_EFFECTS },
378     { "glGetPerfMonitorGroupStringAMD",                CALL_FLAG_NO_SIDE_EFFECTS },
379     { "glGetPerfMonitorGroupsAMD",                     CALL_FLAG_NO_SIDE_EFFECTS },
380     { "glGetPixelTexGenParameterfvSGIS",               CALL_FLAG_NO_SIDE_EFFECTS },
381     { "glGetPixelTexGenParameterivSGIS",               CALL_FLAG_NO_SIDE_EFFECTS },
382     { "glGetPointerIndexedvEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
383     { "glGetPointerv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
384     { "glGetPointervEXT",                              CALL_FLAG_NO_SIDE_EFFECTS },
385     { "glGetProgramBinary",                            CALL_FLAG_NO_SIDE_EFFECTS },
386     { "glGetProgramEnvParameterIivNV",                 CALL_FLAG_NO_SIDE_EFFECTS },
387     { "glGetProgramEnvParameterIuivNV",                CALL_FLAG_NO_SIDE_EFFECTS },
388     { "glGetProgramEnvParameterdvARB",                 CALL_FLAG_NO_SIDE_EFFECTS },
389     { "glGetProgramEnvParameterfvARB",                 CALL_FLAG_NO_SIDE_EFFECTS },
390     { "glGetProgramInfoLog",                           CALL_FLAG_NO_SIDE_EFFECTS },
391     { "glGetProgramInterfaceiv",                       CALL_FLAG_NO_SIDE_EFFECTS },
392     { "glGetProgramLocalParameterIivNV",               CALL_FLAG_NO_SIDE_EFFECTS },
393     { "glGetProgramLocalParameterIuivNV",              CALL_FLAG_NO_SIDE_EFFECTS },
394     { "glGetProgramLocalParameterdvARB",               CALL_FLAG_NO_SIDE_EFFECTS },
395     { "glGetProgramLocalParameterfvARB",               CALL_FLAG_NO_SIDE_EFFECTS },
396     { "glGetProgramNamedParameterdvNV",                CALL_FLAG_NO_SIDE_EFFECTS },
397     { "glGetProgramNamedParameterfvNV",                CALL_FLAG_NO_SIDE_EFFECTS },
398     { "glGetProgramParameterdvNV",                     CALL_FLAG_NO_SIDE_EFFECTS },
399     { "glGetProgramParameterfvNV",                     CALL_FLAG_NO_SIDE_EFFECTS },
400     { "glGetProgramPipelineInfoLog",                   CALL_FLAG_NO_SIDE_EFFECTS },
401     { "glGetProgramPipelineiv",                        CALL_FLAG_NO_SIDE_EFFECTS },
402     { "glGetProgramResourceIndex",                     CALL_FLAG_NO_SIDE_EFFECTS },
403     { "glGetProgramResourceLocation",                  CALL_FLAG_NO_SIDE_EFFECTS },
404     { "glGetProgramResourceLocationIndex",             CALL_FLAG_NO_SIDE_EFFECTS },
405     { "glGetProgramResourceName",                      CALL_FLAG_NO_SIDE_EFFECTS },
406     { "glGetProgramResourceiv",                        CALL_FLAG_NO_SIDE_EFFECTS },
407     { "glGetProgramStageiv",                           CALL_FLAG_NO_SIDE_EFFECTS },
408     { "glGetProgramStringARB",                         CALL_FLAG_NO_SIDE_EFFECTS },
409     { "glGetProgramStringNV",                          CALL_FLAG_NO_SIDE_EFFECTS },
410     { "glGetProgramSubroutineParameteruivNV",          CALL_FLAG_NO_SIDE_EFFECTS },
411     { "glGetProgramiv",                                CALL_FLAG_NO_SIDE_EFFECTS },
412     { "glGetProgramivARB",                             CALL_FLAG_NO_SIDE_EFFECTS },
413     { "glGetProgramivNV",                              CALL_FLAG_NO_SIDE_EFFECTS },
414     { "glGetQueryIndexediv",                           CALL_FLAG_NO_SIDE_EFFECTS },
415     { "glGetQueryiv",                                  CALL_FLAG_NO_SIDE_EFFECTS },
416     { "glGetQueryivARB",                               CALL_FLAG_NO_SIDE_EFFECTS },
417     { "glGetRenderbufferParameteriv",                  CALL_FLAG_NO_SIDE_EFFECTS },
418     { "glGetRenderbufferParameterivEXT",               CALL_FLAG_NO_SIDE_EFFECTS },
419     { "glGetSamplerParameterIiv",                      CALL_FLAG_NO_SIDE_EFFECTS },
420     { "glGetSamplerParameterIuiv",                     CALL_FLAG_NO_SIDE_EFFECTS },
421     { "glGetSamplerParameterfv",                       CALL_FLAG_NO_SIDE_EFFECTS },
422     { "glGetSamplerParameteriv",                       CALL_FLAG_NO_SIDE_EFFECTS },
423     { "glGetSeparableFilterEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
424     { "glGetShaderInfoLog",                            CALL_FLAG_NO_SIDE_EFFECTS },
425     { "glGetShaderPrecisionFormat",                    CALL_FLAG_NO_SIDE_EFFECTS },
426     { "glGetShaderSource",                             CALL_FLAG_NO_SIDE_EFFECTS },
427     { "glGetShaderSourceARB",                          CALL_FLAG_NO_SIDE_EFFECTS },
428     { "glGetShaderiv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
429     { "glGetSharpenTexFuncSGIS",                       CALL_FLAG_NO_SIDE_EFFECTS },
430     { "glGetString",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
431     { "glGetStringi",                                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
432     { "glGetSynciv",                                   CALL_FLAG_NO_SIDE_EFFECTS },
433     { "glGetTexBumpParameterfvATI",                    CALL_FLAG_NO_SIDE_EFFECTS },
434     { "glGetTexBumpParameterivATI",                    CALL_FLAG_NO_SIDE_EFFECTS },
435     { "glGetTexEnvfv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
436     { "glGetTexEnviv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
437     { "glGetTexFilterFuncSGIS",                        CALL_FLAG_NO_SIDE_EFFECTS },
438     { "glGetTexGendv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
439     { "glGetTexGenfv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
440     { "glGetTexGeniv",                                 CALL_FLAG_NO_SIDE_EFFECTS },
441     { "glGetTexLevelParameterfv",                      CALL_FLAG_NO_SIDE_EFFECTS },
442     { "glGetTexLevelParameteriv",                      CALL_FLAG_NO_SIDE_EFFECTS },
443     { "glGetTexParameterIiv",                          CALL_FLAG_NO_SIDE_EFFECTS },
444     { "glGetTexParameterIivEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
445     { "glGetTexParameterIuiv",                         CALL_FLAG_NO_SIDE_EFFECTS },
446     { "glGetTexParameterIuivEXT",                      CALL_FLAG_NO_SIDE_EFFECTS },
447     { "glGetTexParameterPointervAPPLE",                CALL_FLAG_NO_SIDE_EFFECTS },
448     { "glGetTexParameterfv",                           CALL_FLAG_NO_SIDE_EFFECTS },
449     { "glGetTexParameteriv",                           CALL_FLAG_NO_SIDE_EFFECTS },
450     { "glGetTextureLevelParameterfvEXT",               CALL_FLAG_NO_SIDE_EFFECTS },
451     { "glGetTextureLevelParameterivEXT",               CALL_FLAG_NO_SIDE_EFFECTS },
452     { "glGetTextureParameterIivEXT",                   CALL_FLAG_NO_SIDE_EFFECTS },
453     { "glGetTextureParameterIuivEXT",                  CALL_FLAG_NO_SIDE_EFFECTS },
454     { "glGetTextureParameterfvEXT",                    CALL_FLAG_NO_SIDE_EFFECTS },
455     { "glGetTextureParameterivEXT",                    CALL_FLAG_NO_SIDE_EFFECTS },
456     { "glGetTrackMatrixivNV",                          CALL_FLAG_NO_SIDE_EFFECTS },
457     { "glGetTransformFeedbackVarying",                 CALL_FLAG_NO_SIDE_EFFECTS },
458     { "glGetTransformFeedbackVaryingEXT",              CALL_FLAG_NO_SIDE_EFFECTS },
459     { "glGetTransformFeedbackVaryingNV",               CALL_FLAG_NO_SIDE_EFFECTS },
460     { "glGetUniformIndices",                           CALL_FLAG_NO_SIDE_EFFECTS },
461     { "glGetUniformSubroutineuiv",                     CALL_FLAG_NO_SIDE_EFFECTS },
462     { "glGetUniformdv",                                CALL_FLAG_NO_SIDE_EFFECTS },
463     { "glGetUniformfv",                                CALL_FLAG_NO_SIDE_EFFECTS },
464     { "glGetUniformfvARB",                             CALL_FLAG_NO_SIDE_EFFECTS },
465     { "glGetUniformi64vNV",                            CALL_FLAG_NO_SIDE_EFFECTS },
466     { "glGetUniformiv",                                CALL_FLAG_NO_SIDE_EFFECTS },
467     { "glGetUniformivARB",                             CALL_FLAG_NO_SIDE_EFFECTS },
468     { "glGetUniformui64vNV",                           CALL_FLAG_NO_SIDE_EFFECTS },
469     { "glGetUniformuiv",                               CALL_FLAG_NO_SIDE_EFFECTS },
470     { "glGetUniformuivEXT",                            CALL_FLAG_NO_SIDE_EFFECTS },
471     { "glGetVariantArrayObjectfvATI",                  CALL_FLAG_NO_SIDE_EFFECTS },
472     { "glGetVariantArrayObjectivATI",                  CALL_FLAG_NO_SIDE_EFFECTS },
473     { "glGetVariantBooleanvEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
474     { "glGetVariantFloatvEXT",                         CALL_FLAG_NO_SIDE_EFFECTS },
475     { "glGetVariantIntegervEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
476     { "glGetVariantPointervEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
477     { "glGetVertexArrayIntegeri_vEXT",                 CALL_FLAG_NO_SIDE_EFFECTS },
478     { "glGetVertexArrayIntegervEXT",                   CALL_FLAG_NO_SIDE_EFFECTS },
479     { "glGetVertexArrayPointeri_vEXT",                 CALL_FLAG_NO_SIDE_EFFECTS },
480     { "glGetVertexArrayPointervEXT",                   CALL_FLAG_NO_SIDE_EFFECTS },
481     { "glGetVertexAttribArrayObjectfvATI",             CALL_FLAG_NO_SIDE_EFFECTS },
482     { "glGetVertexAttribArrayObjectivATI",             CALL_FLAG_NO_SIDE_EFFECTS },
483     { "glGetVertexAttribIiv",                          CALL_FLAG_NO_SIDE_EFFECTS },
484     { "glGetVertexAttribIivEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
485     { "glGetVertexAttribIuiv",                         CALL_FLAG_NO_SIDE_EFFECTS },
486     { "glGetVertexAttribIuivEXT",                      CALL_FLAG_NO_SIDE_EFFECTS },
487     { "glGetVertexAttribLdv",                          CALL_FLAG_NO_SIDE_EFFECTS },
488     { "glGetVertexAttribLdvEXT",                       CALL_FLAG_NO_SIDE_EFFECTS },
489     { "glGetVertexAttribLi64vNV",                      CALL_FLAG_NO_SIDE_EFFECTS },
490     { "glGetVertexAttribLui64vNV",                     CALL_FLAG_NO_SIDE_EFFECTS },
491     { "glGetVertexAttribPointerv",                     CALL_FLAG_NO_SIDE_EFFECTS },
492     { "glGetVertexAttribPointervARB",                  CALL_FLAG_NO_SIDE_EFFECTS },
493     { "glGetVertexAttribPointervNV",                   CALL_FLAG_NO_SIDE_EFFECTS },
494     { "glGetVertexAttribdv",                           CALL_FLAG_NO_SIDE_EFFECTS },
495     { "glGetVertexAttribdvARB",                        CALL_FLAG_NO_SIDE_EFFECTS },
496     { "glGetVertexAttribdvNV",                         CALL_FLAG_NO_SIDE_EFFECTS },
497     { "glGetVertexAttribfv",                           CALL_FLAG_NO_SIDE_EFFECTS },
498     { "glGetVertexAttribfvARB",                        CALL_FLAG_NO_SIDE_EFFECTS },
499     { "glGetVertexAttribfvNV",                         CALL_FLAG_NO_SIDE_EFFECTS },
500     { "glGetVertexAttribiv",                           CALL_FLAG_NO_SIDE_EFFECTS },
501     { "glGetVertexAttribivARB",                        CALL_FLAG_NO_SIDE_EFFECTS },
502     { "glGetVertexAttribivNV",                         CALL_FLAG_NO_SIDE_EFFECTS },
503     { "glGetVideoCaptureStreamdvNV",                   CALL_FLAG_NO_SIDE_EFFECTS },
504     { "glGetVideoCaptureStreamfvNV",                   CALL_FLAG_NO_SIDE_EFFECTS },
505     { "glGetVideoCaptureStreamivNV",                   CALL_FLAG_NO_SIDE_EFFECTS },
506     { "glGetVideoCaptureivNV",                         CALL_FLAG_NO_SIDE_EFFECTS },
507     { "glGetVideoi64vNV",                              CALL_FLAG_NO_SIDE_EFFECTS },
508     { "glGetVideoivNV",                                CALL_FLAG_NO_SIDE_EFFECTS },
509     { "glGetVideoui64vNV",                             CALL_FLAG_NO_SIDE_EFFECTS },
510     { "glGetVideouivNV",                               CALL_FLAG_NO_SIDE_EFFECTS },
511     { "glGetnMapdvARB",                                CALL_FLAG_NO_SIDE_EFFECTS },
512     { "glGetnMapfvARB",                                CALL_FLAG_NO_SIDE_EFFECTS },
513     { "glGetnMapivARB",                                CALL_FLAG_NO_SIDE_EFFECTS },
514     { "glGetnUniformdvARB",                            CALL_FLAG_NO_SIDE_EFFECTS },
515     { "glGetnUniformfvARB",                            CALL_FLAG_NO_SIDE_EFFECTS },
516     { "glGetnUniformivARB",                            CALL_FLAG_NO_SIDE_EFFECTS },
517     { "glGetnUniformuivARB",                           CALL_FLAG_NO_SIDE_EFFECTS },
518     { "glInsertEventMarkerEXT",                        CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_MARKER },
519     { "glIsAsyncMarkerSGIX",                           CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
520     { "glIsBuffer",                                    CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
521     { "glIsBufferARB",                                 CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
522     { "glIsBufferResidentNV",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
523     { "glIsEnabled",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
524     { "glIsEnabledIndexedEXT",                         CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
525     { "glIsEnabledi",                                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
526     { "glIsFenceAPPLE",                                CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
527     { "glIsFenceNV",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
528     { "glIsFramebuffer",                               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
529     { "glIsFramebufferEXT",                            CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
530     { "glIsList",                                      CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
531     { "glIsNameAMD",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
532     { "glIsNamedBufferResidentNV",                     CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
533     { "glIsNamedStringARB",                            CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
534     { "glIsObjectBufferATI",                           CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
535     { "glIsOcclusionQueryNV",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
536     { "glIsProgram",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
537     { "glIsProgramARB",                                CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
538     { "glIsProgramNV",                                 CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
539     { "glIsProgramPipeline",                           CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
540     { "glIsQuery",                                     CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
541     { "glIsQueryARB",                                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
542     { "glIsRenderbuffer",                              CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
543     { "glIsRenderbufferEXT",                           CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
544     { "glIsSampler",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
545     { "glIsShader",                                    CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
546     { "glIsSync",                                      CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
547     { "glIsTexture",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
548     { "glIsTextureEXT",                                CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
549     { "glIsTransformFeedback",                         CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
550     { "glIsTransformFeedbackNV",                       CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
551     { "glIsVariantEnabledEXT",                         CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
552     { "glIsVertexArray",                               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
553     { "glIsVertexArrayAPPLE",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
554     { "glIsVertexAttribEnabledAPPLE",                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
555     { "glMultiDrawArrays",                             CALL_FLAG_RENDER },
556     { "glMultiDrawArraysEXT",                          CALL_FLAG_RENDER },
557     { "glMultiDrawArraysIndirect",                     CALL_FLAG_RENDER },
558     { "glMultiDrawArraysIndirectAMD",                  CALL_FLAG_RENDER },
559     { "glMultiDrawArraysIndirectBindlessNV",           CALL_FLAG_RENDER },
560     { "glMultiDrawArraysIndirectCountARB",             CALL_FLAG_RENDER },
561     { "glMultiDrawElementArrayAPPLE",                  0 },
562     { "glMultiDrawElements",                           CALL_FLAG_RENDER },
563     { "glMultiDrawElementsBaseVertex",                 CALL_FLAG_RENDER },
564     { "glMultiDrawElementsEXT",                        CALL_FLAG_RENDER },
565     { "glMultiDrawElementsIndirect",                   CALL_FLAG_RENDER },
566     { "glMultiDrawElementsIndirectAMD",                CALL_FLAG_RENDER },
567     { "glMultiDrawElementsIndirectBindlessNV",         CALL_FLAG_RENDER },
568     { "glMultiDrawElementsIndirectCountARB",           CALL_FLAG_RENDER },
569     { "glMultiDrawRangeElementArrayAPPLE",             0 },
570     { "glMultiModeDrawArraysIBM",                      CALL_FLAG_RENDER },
571     { "glMultiModeDrawElementsIBM",                    CALL_FLAG_RENDER },
572     { "glObjectLabel",                                 CALL_FLAG_NO_SIDE_EFFECTS },
573     { "glObjectLabelKHR",                              CALL_FLAG_NO_SIDE_EFFECTS },
574     { "glObjectPtrLabel",                              CALL_FLAG_NO_SIDE_EFFECTS },
575     { "glObjectPtrLabelKHR",                           CALL_FLAG_NO_SIDE_EFFECTS },
576     { "glPopDebugGroup",                               /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP},
577     { "glPopDebugGroupKHR",                            /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP},
578     { "glPopGroupMarkerEXT",                           /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_POP},
579     { "glPushDebugGroup",                              /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
580     { "glPushDebugGroupKHR",                           /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
581     { "glPushGroupMarkerEXT",                          /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER | CALL_FLAG_MARKER_PUSH },
582     { "glRectd",                                       CALL_FLAG_RENDER },
583     { "glRectdv",                                      CALL_FLAG_RENDER },
584     { "glRectf",                                       CALL_FLAG_RENDER },
585     { "glRectfv",                                      CALL_FLAG_RENDER },
586     { "glRecti",                                       CALL_FLAG_RENDER },
587     { "glRectiv",                                      CALL_FLAG_RENDER },
588     { "glRects",                                       CALL_FLAG_RENDER },
589     { "glRectsv",                                      CALL_FLAG_RENDER },
590     { "glStringMarkerGREMEDY",                         /* CALL_FLAG_NO_SIDE_EFFECTS | */ CALL_FLAG_MARKER },
591     { "glXGetClientString",                            CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
592     { "glXGetConfig",                                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
593     { "glXGetCurrentContext",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
594     { "glXGetCurrentDisplay",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
595     { "glXGetCurrentDisplayEXT",                       CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
596     { "glXGetCurrentDrawable",                         CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
597     { "glXGetCurrentReadDrawable",                     CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
598     { "glXGetCurrentReadDrawableSGI",                  CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
599     { "glXGetFBConfigAttrib",                          CALL_FLAG_VERBOSE },
600     { "glXGetFBConfigAttribSGIX",                      CALL_FLAG_VERBOSE },
601     { "glXGetProcAddress",                             CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
602     { "glXGetProcAddressARB",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
603     { "glXIsDirect",                                   CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
604     { "glXQueryExtension",                             CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
605     { "glXQueryExtensionsString",                      CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
606     { "glXQueryVersion",                               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
607     { "glXSwapBuffers",                                CALL_FLAG_SWAPBUFFERS },
608     { "wglDescribePixelFormat",                        CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
609     { "wglGetCurrentContext",                          CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
610     { "wglGetCurrentDC",                               CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
611     { "wglGetDefaultProcAddress",                      CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
612     { "wglGetExtensionsStringARB",                     CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
613     { "wglGetExtensionsStringEXT",                     CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
614     { "wglGetPixelFormat",                             CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
615     { "wglGetPixelFormatAttribivARB",                  CALL_FLAG_VERBOSE },
616     { "wglGetPixelFormatAttribivEXT",                  CALL_FLAG_VERBOSE },
617     { "wglGetProcAddress",                             CALL_FLAG_NO_SIDE_EFFECTS | CALL_FLAG_VERBOSE },
618     { "wglSwapBuffers",                                CALL_FLAG_SWAPBUFFERS },
619     { "wglSwapLayerBuffers",                           CALL_FLAG_SWAPBUFFERS },
620     { "wglSwapMultipleBuffers",                        CALL_FLAG_SWAPBUFFERS },
621 };
622 
623 
TEST(common_parser,lookupCallFlags)624 TEST(common_parser, lookupCallFlags)
625 {
626     typedef const Entry<CallFlags> * ConstIterator;
627 
628     ConstIterator first = &entries[0];
629     ConstIterator last = &entries[sizeof entries / sizeof entries[0]];
630 
631     for (ConstIterator it = first; it != last; ++it) {
632         CallFlags flags = Parser::lookupCallFlags(it->name);
633 
634         EXPECT_EQ(it->value, flags) << "flags differ for " << it->name;
635     }
636 }
637 
638 
639 int
main(int argc,char ** argv)640 main(int argc, char **argv)
641 {
642     ::testing::InitGoogleTest(&argc, argv);
643     return RUN_ALL_TESTS();
644 }
645