summaryrefslogtreecommitdiffstats
path: root/src/glut/glx/glut_swap.c
blob: cb3f653c72cfb39ded8b1b291c6ed577b6b6fd65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

/* Copyright (c) Mark J. Kilgard, 1994, 1997.  */

/* This program is freely distributable without licensing fees
   and is provided without guarantee or warrantee expressed or
   implied. This program is -not- in the public domain. */

#include <stdio.h>
#include "glutint.h"

GLint __glutFPS = 0;
GLint __glutSwapCount = 0;
GLint __glutSwapTime = 0;

/* CENTRY */
void APIENTRY
glutSwapBuffers(void)
{
  GLUTwindow *window = __glutCurrentWindow;

  if (window->renderWin == window->win) {
    if (__glutCurrentWindow->treatAsSingle) {
      /* Pretend the double buffered window is single buffered,
         so treat glutSwapBuffers as a no-op. */
      return;
    }
  } else {
    if (__glutCurrentWindow->overlay->treatAsSingle) {
      /* Pretend the double buffered overlay is single
         buffered, so treat glutSwapBuffers as a no-op. */
      return;
    }
  }

  /* For the MESA_SWAP_HACK. */
  window->usedSwapBuffers = 1;

  SWAP_BUFFERS_LAYER(__glutCurrentWindow);

  /* I considered putting the window being swapped on the
     GLUT_FINISH_WORK work list because you could call
     glutSwapBuffers from an idle callback which doesn't call
     __glutSetWindow which normally adds indirect rendering
     windows to the GLUT_FINISH_WORK work list.  Not being put
     on the list could lead to the buffering up of multiple
     redisplays and buffer swaps and hamper interactivity.  I
     consider this an application bug due to not using
     glutPostRedisplay to trigger redraws.  If
     glutPostRedisplay were used, __glutSetWindow would be
     called and a glFinish to throttle buffering would occur. */

  if (__glutFPS) {
     GLint t = glutGet(GLUT_ELAPSED_TIME);
     __glutSwapCount++;
     if (__glutSwapTime == 0)
        __glutSwapTime = t;
     else if (t - __glutSwapTime > __glutFPS) {
        float time = 0.001 * (t - __glutSwapTime);
        float fps = (float) __glutSwapCount / time;
        fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n",
                __glutSwapCount, time, fps);
        __glutSwapTime = t;
        __glutSwapCount = 0;
     }
  }
}
/* ENDCENTRY */