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);
161 glMultiDrawArraysIndirect (GLenum mode, const void *indirect,
162 GLsizei drawcount, GLsizei stride)
164 TIMED_DEFER (glMultiDrawArraysIndirect, mode, indirect, drawcount, stride);
168 glMultiDrawArraysIndirectAMD (GLenum mode, const GLvoid *indirect,
169 GLsizei primcount, GLsizei stride)
171 TIMED_DEFER (glMultiDrawArraysIndirectAMD, mode,
172 indirect, primcount, stride);
176 glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
178 TIMED_DEFER (glDrawElements, mode, count, type, indices);
182 glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type,
183 const GLvoid *indices, GLint basevertex)
185 TIMED_DEFER (glDrawElementsBaseVertex, mode, count,
186 type, indices, basevertex);
190 glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect)
192 TIMED_DEFER (glDrawElementsIndirect, mode, type, indirect);
196 glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type,
197 const GLvoid *indices, GLsizei primcount)
199 TIMED_DEFER (glDrawElementsInstanced, mode, count,
200 type, indices, primcount);
204 glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type,
205 const GLvoid *indices, GLsizei primcount)
207 TIMED_DEFER (glDrawElementsInstancedARB, mode, count,
208 type, indices, primcount);
212 glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type,
213 const GLvoid *indices, GLsizei primcount)
215 TIMED_DEFER (glDrawElementsInstancedEXT, mode, count,
216 type, indices, primcount);
220 glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type,
221 const GLvoid *indices, GLsizei primcount,
224 TIMED_DEFER (glDrawElementsInstancedBaseVertex, mode, count,
225 type, indices, primcount, basevertex);
229 glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type,
230 const void *indices, GLsizei primcount,
233 TIMED_DEFER (glDrawElementsInstancedBaseInstance, mode, count, type,
234 indices, primcount, baseinstance);
238 glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count,
239 GLenum type, const void *indices, GLsizei primcount,
240 GLint basevertex, GLuint baseinstance)
242 TIMED_DEFER (glDrawElementsInstancedBaseVertexBaseInstance, mode,
243 count, type, indices, primcount, basevertex, baseinstance);
247 glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count,
248 GLenum type, const GLvoid *indices)
250 TIMED_DEFER (glDrawRangeElements, mode, start, end,
251 count, type, indices);
255 glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count,
256 GLenum type, const GLvoid *indices)
258 TIMED_DEFER (glDrawRangeElementsEXT, mode, start, end,
259 count, type, indices);
263 glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end,
264 GLsizei count, GLenum type,
265 const GLvoid *indices, GLint basevertex)
267 TIMED_DEFER (glDrawRangeElementsBaseVertex, mode, start, end,
268 count, type, indices, basevertex);
272 glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type,
273 const GLvoid* *indices, GLsizei primcount)
275 TIMED_DEFER (glMultiDrawElements, mode, count, type,
280 glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count,
281 GLenum type, const GLvoid* *indices,
282 GLsizei primcount, const GLint *basevertex)
284 TIMED_DEFER (glMultiDrawElementsBaseVertex, mode, count,
285 type, indices, primcount, basevertex);
289 glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type,
290 const GLvoid* *indices, GLsizei primcount)
292 TIMED_DEFER (glMultiDrawElementsEXT, mode, count,
293 type, indices, primcount);
297 glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count,
298 GLenum type, const GLvoid* const *indices,
299 GLsizei primcount, GLint modestride)
301 TIMED_DEFER (glMultiModeDrawElementsIBM, mode, count,
302 type, indices, primcount, modestride);
306 glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect,
307 GLsizei drawcount, GLsizei stride)
309 TIMED_DEFER (glMultiDrawElementsIndirect, mode, type,
310 indirect, drawcount, stride);
314 glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type,
315 const GLvoid *indirect,
316 GLsizei primcount, GLsizei stride)
318 TIMED_DEFER (glMultiDrawElementsIndirectAMD, mode, type,
319 indirect, primcount, stride);
323 glCallList (GLuint list)
325 TIMED_DEFER (glCallList, list);
329 glCallLists (GLsizei n, GLenum type, const GLvoid *lists)
331 TIMED_DEFER (glCallLists, n, type, lists);
335 glClear (GLbitfield mask)
337 TIMED_DEFER (glClear, mask);
340 /* We can't just use TIMED_DEFER for glBegin/glEnd since the
341 * glBeginQuery/glEndQuery calls must both be outside
344 glBegin (GLenum mode)
346 if (! inside_new_list)
349 counter = metrics_add_counter ();
350 glBeginQuery (GL_TIME_ELAPSED, counter);
353 GLWRAP_DEFER (glBegin, mode);
359 GLWRAP_DEFER (glEnd);
361 if (! inside_new_list) {
362 glEndQuery (GL_TIME_ELAPSED);
366 /* And we need to track display lists to avoid inserting queries
367 * inside the list while it's being constructed. */
369 glNewList (GLuint list, GLenum mode)
372 GLWRAP_DEFER (glNewList, list, mode);
378 GLWRAP_DEFER (glEndList);
383 glDrawPixels (GLsizei width, GLsizei height, GLenum format,
384 GLenum type, const GLvoid *pixels)
386 TIMED_DEFER (glDrawPixels, width, height, format, type, pixels);
390 glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
391 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
392 GLbitfield mask, GLenum filter)
394 TIMED_DEFER (glBlitFramebuffer,
395 srcX0, srcY0, srcX1, srcY1,
396 dstX0, dstY0, dstX1, dstY1,
401 glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
402 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
403 GLbitfield mask, GLenum filter)
405 TIMED_DEFER (glBlitFramebufferEXT,
406 srcX0, srcY0, srcX1, srcY1,
407 dstX0, dstY0, dstX1, dstY1,
412 glUseProgram (GLuint program)
414 metrics_set_current_program (program);
416 GLWRAP_DEFER(glUseProgram, program);
420 glUseProgramObjectARB (GLhandleARB programObj)
422 metrics_set_current_program (programObj);
424 GLWRAP_DEFER(glUseProgramObjectARB, programObj);