On Nov 13, 2004, at 2:57 PM, John Stauffer wrote:
SwapBuffers absolutely does an implicit glFlush. It could be that you're running single buffered, which means SwapBuffers does nothing and glFlush pushes the commands to the GPU. I would check if you are double or single buffered.
Yes, we were single-buffered. I just now switched to double-buffered and glutSwapBuffers does manage to cause the drawing to occur as desired. Thanks.
I am still puzzled, but there is no need really to pursue this further. I had raised an eyebrow over the GLUT_SINGLE, but the glutSwapBuffers source seemed to indicate it would not matter. (I should have taken two seconds to experiment!)
Calling glFlush after SwapBuffers on a buffered context will do nothing. This is because there would be no commands to flush.
Calling glFlush before SwapBuffers on a buffered context would be redundant since SwapBuffers has an implicit glFlush.
The code I show in macx_win.m looks like this:
/* CENTRY */ void APIENTRY glutSwapBuffers(void) { if([__glutCurrentView isTreatAsSingle]) { /* Pretend the double buffered window is single buffered, so treat glutSwapBuffers as a no-op. Well, actually flush any graphic commands queued by the hardware accelerator or we won't see anything in the GLUT window... */ glFlush(); return; }
I see from other source that isTreatAsSingle seems to align with GLUT_SINGLE. Makes me wonder if I am looking at the right source. Why would my calling glFlush work better than glutSwapBuffers calling it before returning?
SWAP_BUFFERS_WINDOW(__glutCurrentView);
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;
vLogMsg(__FILE__,__LINE__, "GLUT: %d frames in %.2f seconds = %.2f fps", (int) __glutSwapCount, time, fps);
fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f
FPS\n", (int) __glutSwapCount, time, fps); __glutSwapTime = t; __glutSwapCount = 0; } }
glFlush();
So we get a glFlush here as well. So I am puzzled but happy since I now know how to proceed.
Thanks, kenny