mesa/st: short-circuit glFinish calls on WIN32 only
authorKeith Whitwell <keithw@vmware.com>
Wed, 29 Jul 2009 11:47:23 +0000 (12:47 +0100)
committerKeith Whitwell <keithw@vmware.com>
Wed, 29 Jul 2009 11:48:05 +0000 (12:48 +0100)
Windows opengl32.dll calls glFinish prior to every swapbuffers, which
makes it pretty hard to get decent performance...

Work around by mapping finish to flush on PIPE_OS_WINDOWS.  This is
conformant, though it might confuse poorly-written benchmarks which
attempt to measure a single event rather than figuring out the rate of
continuous processing.

src/mesa/state_tracker/st_cb_flush.c

index fbaffd154f981df17f89f2644ebe90f7a1ce6e1a..f7de4e7a4d620beaa5655abedf5ca7a7ff8e4136 100644 (file)
@@ -152,4 +152,16 @@ void st_init_flush_functions(struct dd_function_table *functions)
 {
    functions->Flush = st_glFlush;
    functions->Finish = st_glFinish;
+
+   /* Windows opengl32.dll calls glFinish prior to every swapbuffers.
+    * This is unnecessary and degrades performance.  Luckily we have some
+    * scope to work around this, as the externally-visible behaviour of
+    * Finish() is identical to Flush() in all cases - no differences in
+    * rendering or ReadPixels are visible if we opt not to wait here.
+    *
+    * Only set this up on windows to avoid suprise elsewhere.
+    */
+#ifdef PIPE_OS_WINDOWS
+   functions->Finish = st_glFlush;
+#endif
 }