1 2/* Copyright (c) Mark J. Kilgard, 1994, 1997. */ 3 4/* This program is freely distributable without licensing fees 5 and is provided without guarantee or warrantee expressed or 6 implied. This program is -not- in the public domain. */ 7 8#include <stdio.h> 9#include "glutint.h" 10 11GLint __glutFPS = 0; 12GLint __glutSwapCount = 0; 13GLint __glutSwapTime = 0; 14 15/* CENTRY */ 16void GLUTAPIENTRY 17glutSwapBuffers(void) 18{ 19 GLUTwindow *window = __glutCurrentWindow; 20 21 if (__glutPPMFile) { 22 __glutWritePPMFile(); 23 } 24 25 if (window->renderWin == window->win) { 26 if (__glutCurrentWindow->treatAsSingle) { 27 /* Pretend the double buffered window is single buffered, 28 so treat glutSwapBuffers as a no-op. */ 29 return; 30 } 31 } else { 32 if (__glutCurrentWindow->overlay->treatAsSingle) { 33 /* Pretend the double buffered overlay is single 34 buffered, so treat glutSwapBuffers as a no-op. */ 35 return; 36 } 37 } 38 39 /* For the MESA_SWAP_HACK. */ 40 window->usedSwapBuffers = 1; 41 42 SWAP_BUFFERS_LAYER(__glutCurrentWindow); 43 44 /* I considered putting the window being swapped on the 45 GLUT_FINISH_WORK work list because you could call 46 glutSwapBuffers from an idle callback which doesn't call 47 __glutSetWindow which normally adds indirect rendering 48 windows to the GLUT_FINISH_WORK work list. Not being put 49 on the list could lead to the buffering up of multiple 50 redisplays and buffer swaps and hamper interactivity. I 51 consider this an application bug due to not using 52 glutPostRedisplay to trigger redraws. If 53 glutPostRedisplay were used, __glutSetWindow would be 54 called and a glFinish to throttle buffering would occur. */ 55 56 if (__glutFPS) { 57 GLint t = glutGet(GLUT_ELAPSED_TIME); 58 __glutSwapCount++; 59 if (__glutSwapTime == 0) 60 __glutSwapTime = t; 61 else if (t - __glutSwapTime > __glutFPS) { 62 float time = 0.001 * (t - __glutSwapTime); 63 float fps = (float) __glutSwapCount / time; 64 fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n", 65 __glutSwapCount, time, fps); 66 __glutSwapTime = t; 67 __glutSwapCount = 0; 68 } 69 } 70} 71/* ENDCENTRY */ 72