1 /* Copyright © 2013, Intel Corporation
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28 /* The prototypes for some OpenGL functions changed at one point from:
30 * const void* *indices
32 * const void* const coist *indices
34 * This makes it difficult for us to provide an implementation of
35 * these functions that is consistent with the locally-available gl.h
36 * since we don't know if the extra const will be present or not.
38 * To workaround this problem, we simply #define away const altogether
39 * before including gl.h.
41 * Kudos to Keith Packard for suggesting this kludge.
45 #define GL_GLEXT_PROTOTYPES
50 static int inside_new_list = 0;
53 glwrap_lookup (char *name)
55 const char *libgl_filename = "libGL.so.1";
56 static void *libgl_handle = NULL;
59 libgl_handle = dlwrap_real_dlopen (libgl_filename, RTLD_NOW | RTLD_DEEPBIND);
61 fprintf (stderr, "Error: Failed to dlopen %s\n",
67 return dlwrap_real_dlsym (libgl_handle, name);
70 /* Execute a glBeginQuery/glEndQuery pair around an OpenGL call. */
71 #define TIMED_DEFER(function,...) do { \
72 if (! inside_new_list) { \
74 counter = metrics_add_counter (); \
75 glBeginQuery (GL_TIME_ELAPSED, counter); \
77 GLWRAP_DEFER(function, __VA_ARGS__); \
78 if (! inside_new_list) { \
79 glEndQuery (GL_TIME_ELAPSED); \
83 /* Thanks to apitrace source code for the list of OpenGL draw calls. */
85 glDrawArrays (GLenum mode, GLint first, GLsizei count)
87 TIMED_DEFER (glDrawArrays, mode, first, count);
91 glDrawArraysEXT (GLenum mode, GLint first, GLsizei count)
93 TIMED_DEFER (glDrawArraysEXT, mode, first, count);
97 glDrawArraysIndirect (GLenum mode, const GLvoid *indirect)
99 TIMED_DEFER (glDrawArraysIndirect, mode, indirect);
103 glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count,
106 TIMED_DEFER (glDrawArraysInstanced, mode, first, count, primcount);
110 glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count,
113 TIMED_DEFER (glDrawArraysInstancedARB, mode, first, count, primcount);
117 glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count,
120 TIMED_DEFER (glDrawArraysInstancedEXT, mode, start, count, primcount);
124 glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count,
125 GLsizei primcount, GLuint baseinstance)
127 TIMED_DEFER (glDrawArraysInstancedBaseInstance, mode,
128 first, count, primcount, baseinstance);
132 glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width)
134 TIMED_DEFER (glDrawMeshArraysSUN, mode, first, count, width);
138 glMultiDrawArrays (GLenum mode, const GLint *first,
139 const GLsizei *count, GLsizei primcount)
141 TIMED_DEFER (glMultiDrawArrays, mode, first, count, primcount);
145 glMultiDrawArraysEXT (GLenum mode, const GLint *first,
146 const GLsizei *count, GLsizei primcount)
148 TIMED_DEFER (glMultiDrawArraysEXT, mode, first, count, primcount);
152 glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first,
153 const GLsizei *count, GLsizei primcount,
156 TIMED_DEFER (glMultiModeDrawArraysIBM, mode,
157 first, count, primcount, modestride);
162 glMultiDrawArraysIndirect (...)
164 TIMED_DEFER (glMultiDrawArraysIndirect, ...);
169 glMultiDrawArraysIndirectAMD (GLenum mode, const GLvoid *indirect,
170 GLsizei primcount, GLsizei stride)
172 TIMED_DEFER (glMultiDrawArraysIndirectAMD, mode,
173 indirect, primcount, stride);
177 glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
179 TIMED_DEFER (glDrawElements, mode, count, type, indices);
183 glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type,
184 const GLvoid *indices, GLint basevertex)
186 TIMED_DEFER (glDrawElementsBaseVertex, mode, count,
187 type, indices, basevertex);
191 glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect)
193 TIMED_DEFER (glDrawElementsIndirect, mode, type, indirect);
197 glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type,
198 const GLvoid *indices, GLsizei primcount)
200 TIMED_DEFER (glDrawElementsInstanced, mode, count,
201 type, indices, primcount);
205 glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type,
206 const GLvoid *indices, GLsizei primcount)
208 TIMED_DEFER (glDrawElementsInstancedARB, mode, count,
209 type, indices, primcount);
213 glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type,
214 const GLvoid *indices, GLsizei primcount)
216 TIMED_DEFER (glDrawElementsInstancedEXT, mode, count,
217 type, indices, primcount);
221 glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type,
222 const GLvoid *indices, GLsizei primcount,
225 TIMED_DEFER (glDrawElementsInstancedBaseVertex, mode, count,
226 type, indices, primcount, basevertex);
230 glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type,
231 const void *indices, GLsizei primcount,
234 TIMED_DEFER (glDrawElementsInstancedBaseInstance, mode, count, type,
235 indices, primcount, baseinstance);
239 glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count,
240 GLenum type, const void *indices, GLsizei primcount,
241 GLint basevertex, GLuint baseinstance)
243 TIMED_DEFER (glDrawElementsInstancedBaseVertexBaseInstance, mode,
244 count, type, indices, primcount, basevertex, baseinstance);
248 glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count,
249 GLenum type, const GLvoid *indices)
251 TIMED_DEFER (glDrawRangeElements, mode, start, end,
252 count, type, indices);
256 glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count,
257 GLenum type, const GLvoid *indices)
259 TIMED_DEFER (glDrawRangeElementsEXT, mode, start, end,
260 count, type, indices);
264 glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end,
265 GLsizei count, GLenum type,
266 const GLvoid *indices, GLint basevertex)
268 TIMED_DEFER (glDrawRangeElementsBaseVertex, mode, start, end,
269 count, type, indices, basevertex);
273 glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type,
274 const GLvoid* *indices, GLsizei primcount)
276 TIMED_DEFER (glMultiDrawElements, mode, count, type,
281 glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count,
282 GLenum type, const GLvoid* *indices,
283 GLsizei primcount, const GLint *basevertex)
285 TIMED_DEFER (glMultiDrawElementsBaseVertex, mode, count,
286 type, indices, primcount, basevertex);
290 glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type,
291 const GLvoid* *indices, GLsizei primcount)
293 TIMED_DEFER (glMultiDrawElementsEXT, mode, count,
294 type, indices, primcount);
298 glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count,
299 GLenum type, const GLvoid* const *indices,
300 GLsizei primcount, GLint modestride)
302 TIMED_DEFER (glMultiModeDrawElementsIBM, mode, count,
303 type, indices, primcount, modestride);
308 glMultiDrawElementsIndirect (...)
310 TIMED_DEFER (glMultiDrawElementsIndirect, ...);
315 glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type,
316 const GLvoid *indirect,
317 GLsizei primcount, GLsizei stride)
319 TIMED_DEFER (glMultiDrawElementsIndirectAMD, mode, type,
320 indirect, primcount, stride);
324 glCallList (GLuint list)
326 TIMED_DEFER (glCallList, list);
330 glCallLists (GLsizei n, GLenum type, const GLvoid *lists)
332 TIMED_DEFER (glCallLists, n, type, lists);
336 glClear (GLbitfield mask)
338 TIMED_DEFER (glClear, mask);
341 /* We can't just use TIMED_DEFER for glBegin/glEnd since the
342 * glBeginQuery/glEndQuery calls must both be outside
345 glBegin (GLenum mode)
347 if (! inside_new_list)
350 counter = metrics_add_counter ();
351 glBeginQuery (GL_TIME_ELAPSED, counter);
354 GLWRAP_DEFER (glBegin, mode);
360 GLWRAP_DEFER (glEnd);
362 if (! inside_new_list) {
363 glEndQuery (GL_TIME_ELAPSED);
367 /* And we need to track display lists to avoid inserting queries
368 * inside the list while it's being constructed. */
370 glNewList (GLuint list, GLenum mode)
373 GLWRAP_DEFER (glNewList, list, mode);
379 GLWRAP_DEFER (glEndList);
384 glDrawPixels (GLsizei width, GLsizei height, GLenum format,
385 GLenum type, const GLvoid *pixels)
387 TIMED_DEFER (glDrawPixels, width, height, format, type, pixels);
391 glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
392 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
393 GLbitfield mask, GLenum filter)
395 TIMED_DEFER (glBlitFramebuffer,
396 srcX0, srcY0, srcX1, srcY1,
397 dstX0, dstY0, dstX1, dstY1,
402 glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
403 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
404 GLbitfield mask, GLenum filter)
406 TIMED_DEFER (glBlitFramebufferEXT,
407 srcX0, srcY0, srcX1, srcY1,
408 dstX0, dstY0, dstX1, dstY1,
413 glUseProgram (GLuint program)
415 metrics_set_current_program (program);
417 GLWRAP_DEFER(glUseProgram, program);
421 glUseProgramObjectARB (GLhandleARB programObj)
423 metrics_set_current_program (programObj);
425 GLWRAP_DEFER(glUseProgramObjectARB, programObj);