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
51 glwrap_lookup (char *name)
53 const char *libgl_filename = "libGL.so.1";
54 static void *libgl_handle = NULL;
57 libgl_handle = dlwrap_real_dlopen (libgl_filename, RTLD_NOW | RTLD_DEEPBIND);
59 fprintf (stderr, "Error: Failed to dlopen %s\n",
65 return dlwrap_real_dlsym (libgl_handle, name);
68 /* Execute a glBegineQuery/glEndQuery pair around an OpenGL call. */
69 #define TIMED_DEFER(function,...) do { \
71 counter = metrics_add_counter (); \
72 glBeginQuery (GL_TIME_ELAPSED, counter); \
73 GLWRAP_DEFER(function, __VA_ARGS__); \
74 glEndQuery (GL_TIME_ELAPSED); \
77 /* Thanks to apitrace source code for the list of OpenGL draw calls. */
79 glDrawArrays (GLenum mode, GLint first, GLsizei count)
81 TIMED_DEFER (glDrawArrays, mode, first, count);
85 glDrawArraysEXT (GLenum mode, GLint first, GLsizei count)
87 TIMED_DEFER (glDrawArraysEXT, mode, first, count);
91 glDrawArraysIndirect (GLenum mode, const GLvoid *indirect)
93 TIMED_DEFER (glDrawArraysIndirect, mode, indirect);
97 glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count,
100 TIMED_DEFER (glDrawArraysInstanced, mode, first, count, primcount);
104 glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count,
107 TIMED_DEFER (glDrawArraysInstancedARB, mode, first, count, primcount);
111 glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count,
114 TIMED_DEFER (glDrawArraysInstancedEXT, mode, start, count, primcount);
118 glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count,
119 GLsizei primcount, GLuint baseinstance)
121 TIMED_DEFER (glDrawArraysInstancedBaseInstance, mode,
122 first, count, primcount, baseinstance);
126 glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width)
128 TIMED_DEFER (glDrawMeshArraysSUN, mode, first, count, width);
132 glMultiDrawArrays (GLenum mode, const GLint *first,
133 const GLsizei *count, GLsizei primcount)
135 TIMED_DEFER (glMultiDrawArrays, mode, first, count, primcount);
139 glMultiDrawArraysEXT (GLenum mode, const GLint *first,
140 const GLsizei *count, GLsizei primcount)
142 TIMED_DEFER (glMultiDrawArraysEXT, mode, first, count, primcount);
146 glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first,
147 const GLsizei *count, GLsizei primcount,
150 TIMED_DEFER (glMultiModeDrawArraysIBM, mode,
151 first, count, primcount, modestride);
156 glMultiDrawArraysIndirect (...)
158 TIMED_DEFER (glMultiDrawArraysIndirect, ...);
163 glMultiDrawArraysIndirectAMD (GLenum mode, const GLvoid *indirect,
164 GLsizei primcount, GLsizei stride)
166 TIMED_DEFER (glMultiDrawArraysIndirectAMD, mode,
167 indirect, primcount, stride);
171 glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
173 TIMED_DEFER (glDrawElements, mode, count, type, indices);
177 glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type,
178 const GLvoid *indices, GLint basevertex)
180 TIMED_DEFER (glDrawElementsBaseVertex, mode, count,
181 type, indices, basevertex);
185 glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect)
187 TIMED_DEFER (glDrawElementsIndirect, mode, type, indirect);
191 glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type,
192 const GLvoid *indices, GLsizei primcount)
194 TIMED_DEFER (glDrawElementsInstanced, mode, count,
195 type, indices, primcount);
199 glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type,
200 const GLvoid *indices, GLsizei primcount)
202 TIMED_DEFER (glDrawElementsInstancedARB, mode, count,
203 type, indices, primcount);
207 glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type,
208 const GLvoid *indices, GLsizei primcount)
210 TIMED_DEFER (glDrawElementsInstancedEXT, mode, count,
211 type, indices, primcount);
215 glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type,
216 const GLvoid *indices, GLsizei primcount,
219 TIMED_DEFER (glDrawElementsInstancedBaseVertex, mode, count,
220 type, indices, primcount, basevertex);
224 glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type,
225 const void *indices, GLsizei primcount,
228 TIMED_DEFER (glDrawElementsInstancedBaseInstance, mode, count, type,
229 indices, primcount, baseinstance);
233 glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count,
234 GLenum type, const void *indices, GLsizei primcount,
235 GLint basevertex, GLuint baseinstance)
237 TIMED_DEFER (glDrawElementsInstancedBaseVertexBaseInstance, mode,
238 count, type, indices, primcount, basevertex, baseinstance);
242 glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count,
243 GLenum type, const GLvoid *indices)
245 TIMED_DEFER (glDrawRangeElements, mode, start, end,
246 count, type, indices);
250 glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count,
251 GLenum type, const GLvoid *indices)
253 TIMED_DEFER (glDrawRangeElementsEXT, mode, start, end,
254 count, type, indices);
258 glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end,
259 GLsizei count, GLenum type,
260 const GLvoid *indices, GLint basevertex)
262 TIMED_DEFER (glDrawRangeElementsBaseVertex, mode, start, end,
263 count, type, indices, basevertex);
267 glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type,
268 const GLvoid* *indices, GLsizei primcount)
270 TIMED_DEFER (glMultiDrawElements, mode, count, type,
275 glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count,
276 GLenum type, const GLvoid* *indices,
277 GLsizei primcount, const GLint *basevertex)
279 TIMED_DEFER (glMultiDrawElementsBaseVertex, mode, count,
280 type, indices, primcount, basevertex);
284 glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type,
285 const GLvoid* *indices, GLsizei primcount)
287 TIMED_DEFER (glMultiDrawElementsEXT, mode, count,
288 type, indices, primcount);
292 glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count,
293 GLenum type, const GLvoid* const *indices,
294 GLsizei primcount, GLint modestride)
296 TIMED_DEFER (glMultiModeDrawElementsIBM, mode, count,
297 type, indices, primcount, modestride);
302 glMultiDrawElementsIndirect (...)
304 TIMED_DEFER (glMultiDrawElementsIndirect, ...);
309 glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type,
310 const GLvoid *indirect,
311 GLsizei primcount, GLsizei stride)
313 TIMED_DEFER (glMultiDrawElementsIndirectAMD, mode, type,
314 indirect, primcount, stride);
318 glCallList (GLuint list)
320 TIMED_DEFER (glCallList, list);
324 glCallLists (GLsizei n, GLenum type, const GLvoid *lists)
326 TIMED_DEFER (glCallLists, n, type, lists);
330 glClear (GLbitfield mask)
332 TIMED_DEFER (glClear, mask);
335 /* We can't just use TIMED_DEFER for glBegin/glEnd since the
336 * glBeginQuery/glEndQuery calls must both be outside
339 glBegin (GLenum mode)
341 if (! inside_new_list)
344 counter = metrics_add_counter ();
345 glBeginQuery (GL_TIME_ELAPSED, counter);
348 GLWRAP_DEFER (glBegin, mode);
354 GLWRAP_DEFER (glEnd);
356 if (! inside_new_list) {
357 glEndQuery (GL_TIME_ELAPSED);
362 glDrawPixels (GLsizei width, GLsizei height, GLenum format,
363 GLenum type, const GLvoid *pixels)
365 TIMED_DEFER (glDrawPixels, width, height, format, type, pixels);
369 glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
370 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
371 GLbitfield mask, GLenum filter)
373 TIMED_DEFER (glBlitFramebuffer,
374 srcX0, srcY0, srcX1, srcY1,
375 dstX0, dstY0, dstX1, dstY1,
380 glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
381 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
382 GLbitfield mask, GLenum filter)
384 TIMED_DEFER (glBlitFramebufferEXT,
385 srcX0, srcY0, srcX1, srcY1,
386 dstX0, dstY0, dstX1, dstY1,
391 glUseProgram (GLuint program)
393 metrics_set_current_program (program);
395 GLWRAP_DEFER(glUseProgram, program);
399 glUseProgramObjectARB (GLhandleARB programObj)
401 metrics_set_current_program (programObj);
403 GLWRAP_DEFER(glUseProgramObjectARB, programObj);