]> git.cworth.org Git - fips/blob - glwrap.c
fips-dispatch: Completely separate fips-dispatch GL prototypes from GL/gl.h
[fips] / glwrap.c
1 /* Copyright © 2013, Intel Corporation
2  *
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:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
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
19  * THE SOFTWARE.
20  */
21
22 /* The prototypes for some OpenGL functions changed at one point from:
23  *
24  *      const void* *indices
25  * to:
26  *      const void* const coist *indices
27  *
28  * This makes it difficult for us to provide an implementation of
29  * these functions that is consistent with the locally-available gl.h
30  * since we don't know if the extra const will be present or not.
31  *
32  * To workaround this problem, we simply #define away const altogether
33  * before including gl.h.
34  *
35  * Kudos to Keith Packard for suggesting this kludge.
36  */
37 #define const
38
39 #define GL_GLEXT_PROTOTYPES
40 #include <GL/gl.h>
41
42 #include "fips.h"
43
44 #include "glwrap.h"
45
46 #include "metrics.h"
47
48 #include "dlwrap.h"
49
50 static int inside_new_list = 0;
51
52 void *
53 glwrap_lookup (char *name)
54 {
55         const char *libgl_filename = "libGL.so.1";
56         static void *libgl_handle = NULL;
57
58         if (! libgl_handle) {
59                 libgl_handle = dlwrap_real_dlopen (libgl_filename, RTLD_NOW | RTLD_DEEPBIND);
60                 if (! libgl_handle) {
61                         fprintf (stderr, "Error: Failed to dlopen %s\n",
62                                  libgl_filename);
63                         exit (1);
64                 }
65         }
66
67         return dlwrap_real_dlsym (libgl_handle, name);
68 }
69
70 /* Execute a glBeginQuery/glEndQuery pair around an OpenGL call. */
71 #define TIMED_DEFER(function,...) do {                                  \
72         if (! inside_new_list) {                                        \
73                 unsigned counter;                                       \
74                 counter = metrics_add_counter ();                       \
75                 glBeginQuery (GL_TIME_ELAPSED, counter);                \
76         }                                                               \
77         GLWRAP_DEFER(function, __VA_ARGS__);                            \
78         if (! inside_new_list) {                                        \
79                 glEndQuery (GL_TIME_ELAPSED);                           \
80         }                                                               \
81 } while (0);
82
83 /* Thanks to apitrace source code for the list of OpenGL draw calls. */
84 void
85 glDrawArrays (GLenum mode, GLint first, GLsizei count)
86 {
87         TIMED_DEFER (glDrawArrays, mode, first, count);
88 }
89
90 void
91 glDrawArraysEXT (GLenum mode, GLint first, GLsizei count)
92 {
93         TIMED_DEFER (glDrawArraysEXT, mode, first, count);
94 }
95
96 void
97 glDrawArraysIndirect (GLenum mode, const GLvoid *indirect)
98 {
99         TIMED_DEFER (glDrawArraysIndirect, mode, indirect);
100 }
101
102 void
103 glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count,
104                        GLsizei primcount)
105 {
106         TIMED_DEFER (glDrawArraysInstanced, mode, first, count, primcount);
107 }
108
109 void
110 glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count,
111                           GLsizei primcount)
112 {
113         TIMED_DEFER (glDrawArraysInstancedARB, mode, first, count, primcount);
114 }
115
116 void
117 glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count,
118                           GLsizei primcount)
119 {
120         TIMED_DEFER (glDrawArraysInstancedEXT, mode, start, count, primcount);
121 }
122
123 void
124 glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count,
125                                    GLsizei primcount, GLuint baseinstance)
126 {
127         TIMED_DEFER (glDrawArraysInstancedBaseInstance, mode,
128                      first, count, primcount, baseinstance);
129 }
130
131 void
132 glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width)
133 {
134         TIMED_DEFER (glDrawMeshArraysSUN, mode, first, count, width);
135 }
136
137 void
138 glMultiDrawArrays (GLenum mode, const GLint *first,
139                    const GLsizei *count, GLsizei primcount)
140 {
141         TIMED_DEFER (glMultiDrawArrays, mode, first, count, primcount);
142 }
143
144 void
145 glMultiDrawArraysEXT (GLenum mode, const GLint *first,
146                       const GLsizei *count, GLsizei primcount)
147 {
148         TIMED_DEFER (glMultiDrawArraysEXT, mode, first, count, primcount);
149 }
150
151 void
152 glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first,
153                           const GLsizei *count, GLsizei primcount,
154                           GLint modestride)
155 {
156         TIMED_DEFER (glMultiModeDrawArraysIBM, mode,
157                      first, count, primcount, modestride);
158 }
159
160 void
161 glMultiDrawArraysIndirect (GLenum mode, const void *indirect,
162                            GLsizei drawcount, GLsizei stride)
163 {
164         TIMED_DEFER (glMultiDrawArraysIndirect, mode, indirect, drawcount, stride);
165 }
166
167 void
168 glMultiDrawArraysIndirectAMD (GLenum mode, const GLvoid *indirect,
169                               GLsizei primcount, GLsizei stride)
170 {
171         TIMED_DEFER (glMultiDrawArraysIndirectAMD, mode,
172                      indirect, primcount, stride);
173 }
174
175 void
176 glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
177 {
178         TIMED_DEFER (glDrawElements, mode, count, type, indices);
179 }
180
181 void
182 glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type,
183                           const GLvoid *indices, GLint basevertex)
184 {
185         TIMED_DEFER (glDrawElementsBaseVertex, mode, count,
186                      type, indices, basevertex);
187 }
188
189 void
190 glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect)
191 {
192         TIMED_DEFER (glDrawElementsIndirect, mode, type, indirect);
193 }
194
195 void
196 glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type,
197                          const GLvoid *indices, GLsizei primcount)
198 {
199         TIMED_DEFER (glDrawElementsInstanced, mode, count,
200                      type, indices, primcount);
201 }
202
203 void
204 glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type,
205                             const GLvoid *indices, GLsizei primcount)
206 {
207         TIMED_DEFER (glDrawElementsInstancedARB, mode, count,
208                      type, indices, primcount);
209 }
210
211 void
212 glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type,
213                             const GLvoid *indices, GLsizei primcount)
214 {
215         TIMED_DEFER (glDrawElementsInstancedEXT, mode, count,
216                      type, indices, primcount);
217 }
218
219 void
220 glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type,
221                                    const GLvoid *indices, GLsizei primcount,
222                                    GLint basevertex)
223 {
224         TIMED_DEFER (glDrawElementsInstancedBaseVertex, mode, count,
225                      type, indices, primcount, basevertex);
226 }
227
228 void
229 glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type,
230                                      const void *indices, GLsizei primcount,
231                                      GLuint baseinstance)
232 {
233         TIMED_DEFER (glDrawElementsInstancedBaseInstance, mode, count, type,
234                      indices, primcount, baseinstance);
235 }
236
237 void
238 glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count,
239                       GLenum type, const void *indices, GLsizei primcount,
240                       GLint basevertex, GLuint baseinstance)
241 {
242         TIMED_DEFER (glDrawElementsInstancedBaseVertexBaseInstance, mode,
243                      count, type, indices, primcount, basevertex, baseinstance);
244 }
245
246 void
247 glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count,
248                      GLenum type, const GLvoid *indices)
249 {
250         TIMED_DEFER (glDrawRangeElements, mode, start, end,
251                      count, type, indices);
252 }
253
254 void
255 glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count,
256                         GLenum type, const GLvoid *indices)
257 {
258         TIMED_DEFER (glDrawRangeElementsEXT, mode, start, end,
259                      count, type, indices);
260 }
261
262 void
263 glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end,
264                                GLsizei count, GLenum type,
265                                const GLvoid *indices, GLint basevertex)
266 {
267         TIMED_DEFER (glDrawRangeElementsBaseVertex, mode, start, end,
268                      count, type, indices, basevertex);
269 }
270
271 void
272 glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type,
273                      const GLvoid* *indices, GLsizei primcount)
274 {
275         TIMED_DEFER (glMultiDrawElements, mode, count, type,
276                      indices, primcount);
277 }
278
279 void
280 glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count,
281                                GLenum type, const GLvoid* *indices,
282                                GLsizei primcount, const GLint *basevertex)
283 {
284         TIMED_DEFER (glMultiDrawElementsBaseVertex, mode, count,
285                      type, indices, primcount, basevertex);
286 }
287
288 void
289 glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type,
290                         const GLvoid* *indices, GLsizei primcount)
291 {
292         TIMED_DEFER (glMultiDrawElementsEXT, mode, count,
293                      type, indices, primcount);
294 }
295
296 void
297 glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count,
298                             GLenum type, const GLvoid* const *indices,
299                             GLsizei primcount, GLint modestride)
300 {
301         TIMED_DEFER (glMultiModeDrawElementsIBM, mode, count,
302                      type, indices, primcount, modestride);
303 }
304
305 void
306 glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect,
307                              GLsizei drawcount, GLsizei stride)
308 {
309         TIMED_DEFER (glMultiDrawElementsIndirect, mode, type,
310                      indirect, drawcount, stride);
311 }
312
313 void
314 glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type,
315                                 const GLvoid *indirect,
316                                 GLsizei primcount, GLsizei stride)
317 {
318         TIMED_DEFER (glMultiDrawElementsIndirectAMD, mode, type,
319                      indirect, primcount, stride);
320 }
321
322 void
323 glCallList (GLuint list)
324 {
325         TIMED_DEFER (glCallList, list);
326 }
327
328 void
329 glCallLists (GLsizei n, GLenum type, const GLvoid *lists)
330 {
331         TIMED_DEFER (glCallLists, n, type, lists);
332 }
333
334 void
335 glClear (GLbitfield mask)
336 {
337         TIMED_DEFER (glClear, mask);
338 }
339
340 /* We can't just use TIMED_DEFER for glBegin/glEnd since the
341  * glBeginQuery/glEndQuery calls must both be outside
342  * glBegin/glEnd. */
343 void
344 glBegin (GLenum mode)
345 {
346         if (! inside_new_list)
347         {
348                 unsigned counter;
349                 counter = metrics_add_counter ();
350                 glBeginQuery (GL_TIME_ELAPSED, counter);
351         }
352
353         GLWRAP_DEFER (glBegin, mode);
354 }
355
356 void
357 glEnd (void)
358 {
359         GLWRAP_DEFER (glEnd);
360
361         if (! inside_new_list) {
362                 glEndQuery (GL_TIME_ELAPSED);
363         }
364 }
365
366 /* And we need to track display lists to avoid inserting queries
367  * inside the list while it's being constructed. */
368 void
369 glNewList (GLuint list, GLenum mode)
370 {
371         inside_new_list = 1;
372         GLWRAP_DEFER (glNewList, list, mode);
373 }
374
375 void
376 glEndList (void)
377 {
378         GLWRAP_DEFER (glEndList);
379         inside_new_list = 0;
380 }
381
382 void
383 glDrawPixels (GLsizei width, GLsizei height, GLenum format,
384               GLenum type, const GLvoid *pixels)
385 {
386         TIMED_DEFER (glDrawPixels, width, height, format, type, pixels);
387 }
388
389 void
390 glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
391                    GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
392                    GLbitfield mask, GLenum filter)
393 {
394         TIMED_DEFER (glBlitFramebuffer,
395                      srcX0, srcY0, srcX1, srcY1,
396                      dstX0, dstY0, dstX1, dstY1,
397                      mask, filter);
398 }
399
400 void
401 glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
402                       GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
403                       GLbitfield mask, GLenum filter)
404 {
405         TIMED_DEFER (glBlitFramebufferEXT,
406                      srcX0, srcY0, srcX1, srcY1,
407                      dstX0, dstY0, dstX1, dstY1,
408                      mask, filter);
409 }
410
411 void
412 glUseProgram (GLuint program)
413 {
414         metrics_set_current_program (program);
415
416         GLWRAP_DEFER(glUseProgram, program);
417 }
418
419 void
420 glUseProgramObjectARB (GLhandleARB programObj)
421 {
422         metrics_set_current_program (programObj);
423
424         GLWRAP_DEFER(glUseProgramObjectARB, programObj);
425 }