]> git.cworth.org Git - fips/blobdiff - glwrap.c
TODO: Remove bug causing libfips-32.so to not build.
[fips] / glwrap.c
index a90ef8c4707b9f67f13de51495534aa6d6d5258a..323c321107c5d37dc7cd0775e0475afe431869c5 100644 (file)
--- a/glwrap.c
+++ b/glwrap.c
@@ -47,6 +47,8 @@
 
 #include "dlwrap.h"
 
+static int inside_new_list = 0;
+
 void *
 glwrap_lookup (char *name)
 {
@@ -65,13 +67,17 @@ glwrap_lookup (char *name)
        return dlwrap_real_dlsym (libgl_handle, name);
 }
 
-/* Execute a glBegineQuery/glEndQuery pair around an OpenGL call. */
-#define TIMED_DEFER(function,...) do {                 \
-       unsigned counter;                               \
-       counter = metrics_add_counter ();               \
-       glBeginQuery (GL_TIME_ELAPSED, counter);        \
-       GLWRAP_DEFER(function, __VA_ARGS__);            \
-       glEndQuery (GL_TIME_ELAPSED);                   \
+/* Execute a glBeginQuery/glEndQuery pair around an OpenGL call. */
+#define TIMED_DEFER(function,...) do {                                 \
+       if (! inside_new_list) {                                        \
+               unsigned counter;                                       \
+               counter = metrics_add_counter ();                       \
+               glBeginQuery (GL_TIME_ELAPSED, counter);                \
+       }                                                               \
+       GLWRAP_DEFER(function, __VA_ARGS__);                            \
+       if (! inside_new_list) {                                        \
+               glEndQuery (GL_TIME_ELAPSED);                           \
+       }                                                               \
 } while (0);
 
 /* Thanks to apitrace source code for the list of OpenGL draw calls. */
@@ -151,13 +157,12 @@ glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first,
                     first, count, primcount, modestride);
 }
 
-/* FIXME?
 void
-glMultiDrawArraysIndirect (...)
+glMultiDrawArraysIndirect (GLenum mode, const void *indirect,
+                          GLsizei drawcount, GLsizei stride)
 {
-       TIMED_DEFER (glMultiDrawArraysIndirect, ...);
+       TIMED_DEFER (glMultiDrawArraysIndirect, mode, indirect, drawcount, stride);
 }
-*/
 
 void
 glMultiDrawArraysIndirectAMD (GLenum mode, const GLvoid *indirect,
@@ -297,13 +302,13 @@ glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count,
                     type, indices, primcount, modestride);
 }
 
-/* FIXME?
 void
-glMultiDrawElementsIndirect (...)
+glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect,
+                            GLsizei drawcount, GLsizei stride)
 {
-       TIMED_DEFER (glMultiDrawElementsIndirect, ...);
+       TIMED_DEFER (glMultiDrawElementsIndirect, mode, type,
+                    indirect, drawcount, stride);
 }
-*/
 
 void
 glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type,
@@ -358,6 +363,22 @@ glEnd (void)
        }
 }
 
+/* And we need to track display lists to avoid inserting queries
+ * inside the list while it's being constructed. */
+void
+glNewList (GLuint list, GLenum mode)
+{
+       inside_new_list = 1;
+       GLWRAP_DEFER (glNewList, list, mode);
+}
+
+void
+glEndList (void)
+{
+       GLWRAP_DEFER (glEndList);
+       inside_new_list = 0;
+}
+
 void
 glDrawPixels (GLsizei width, GLsizei height, GLenum format,
              GLenum type, const GLvoid *pixels)