[SDL] OpenGL speed under windows
M.A. Oude Kotte
marc at solcon.nl
Thu Feb 19 17:07:22 PST 2004
Use the following code to disable vsync waits in Windows:
typedef void (APIENTRY * WGLSWAPINTERVALEXT) (int);
WGLSWAPINTERVALEXT wglSwapIntervalEXT = (WGLSWAPINTERVALEXT)
wglGetProcAddress("wglSwapIntervalEXT");
if (wglSwapIntervalEXT) {
wglSwapIntervalEXT(0); // disable vertical synchronisation
}
Marc
Gerald wrote:
> Hi all,
>
> I'm new to SDL, and somewhat newish with OpenGL. Heres my question...
>
> I'm getting about 60 fps when rotating a 500 polygon textured object.
> This is on a P4 HT 2.53 GHz with a Geforce 4 MX 440 card.
>
> I should be getting way more than that, shouldn't I?
>
> Also, fsaa doesn't seem to work at all...
>
>
> Thanks in advance for your help!
>
> Here is my core display loop....
>
> int RunGLTest( int argc, char* argv[],
> int logo, int slowly, int bpp, float gamma, int noframe,
> int fsaa )
> {
> int i;
> int rgb_size[3];
> int w = 640;
> int h = 480;
> int done = 0;
> int frames;
> Uint32 start_time, this_time;
>
> Uint32 video_flags;
> int value;
>
>
> if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
> {
> fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError());
> exit( 1 );
> }
>
> /* See if we should detect the display depth */
> if ( bpp == 0 )
> {
> if ( SDL_GetVideoInfo()->vfmt->BitsPerPixel <= 8 )
> {
> bpp = 8;
> } else
> {
> bpp = 16; /* More doesn't seem to work */
> }
> }
>
> bpp = 0 ;
>
> /* Set the flags we want to use for setting the video mode */
> if ( logo && USE_DEPRECATED_OPENGLBLIT )
> {
> video_flags = SDL_OPENGLBLIT;
> } else
> {
> video_flags = SDL_OPENGL;
> }
>
> video_flags |= SDL_OPENGLBLIT ;
>
> for ( i=1; argv[i]; ++i )
> {
> if ( strcmp(argv[1], "-fullscreen") == 0 )
> {
> video_flags |= SDL_FULLSCREEN;
> }
> }
>
> if (noframe)
> {
> video_flags |= SDL_NOFRAME;
> }
>
> video_flags |= SDL_HWSURFACE;
> video_flags |= SDL_HWPALETTE ;
> video_flags |= SDL_HWACCEL ;
>
> /* Initialize the display */
> switch (bpp)
> {
> case 8:
> rgb_size[0] = 3;
> rgb_size[1] = 3;
> rgb_size[2] = 2;
> break;
>
> case 15:
> case 16:
> rgb_size[0] = 5;
> rgb_size[1] = 5;
> rgb_size[2] = 5;
> break;
>
> default:
> rgb_size[0] = 8;
> rgb_size[1] = 8;
> rgb_size[2] = 8;
> break;
> }
>
> SDL_GL_SetAttribute( SDL_GL_RED_SIZE, rgb_size[0] );
> SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, rgb_size[1] );
> SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, rgb_size[2] );
> SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
> SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
>
> if ( fsaa )
> {
> SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
> SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, fsaa );
> }
> if ( SDL_SetVideoMode( w, h, bpp, video_flags ) == NULL )
> {
> fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError());
> SDL_Quit();
> exit(1);
> }
>
>
> printf("Screen BPP: %d\n",
> SDL_GetVideoSurface()->format->BitsPerPixel);
> printf("\n");
> printf( "Vendor : %s\n", glGetString( GL_VENDOR ) );
> printf( "Renderer : %s\n", glGetString( GL_RENDERER ) );
> printf( "Version : %s\n", glGetString( GL_VERSION ) );
> printf( "Extensions : %s\n", glGetString( GL_EXTENSIONS ) );
> printf("\n");
>
> SDL_GL_GetAttribute( SDL_GL_RED_SIZE, &value );
> printf( "SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0],value);
>
> SDL_GL_GetAttribute( SDL_GL_GREEN_SIZE, &value );
> printf( "SDL_GL_GREEN_SIZE: requested %d, got %d\n",
> rgb_size[1],value);
>
> SDL_GL_GetAttribute( SDL_GL_BLUE_SIZE, &value );
> printf( "SDL_GL_BLUE_SIZE: requested %d, got %d\n", rgb_size[2],value);
>
> SDL_GL_GetAttribute( SDL_GL_DEPTH_SIZE, &value );
> printf( "SDL_GL_DEPTH_SIZE: requested %d, got %d\n", bpp, value );
>
> SDL_GL_GetAttribute( SDL_GL_DOUBLEBUFFER, &value );
> printf( "SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value );
>
> if ( fsaa )
> {
> SDL_GL_GetAttribute( SDL_GL_MULTISAMPLEBUFFERS, &value );
> printf( "SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n",
> value );
> SDL_GL_GetAttribute( SDL_GL_MULTISAMPLESAMPLES, &value );
> printf( "SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n",
> fsaa, value );
> }
>
> /* Set the window manager title bar */
> SDL_WM_SetCaption( "SDL GL test", "testgl" );
>
> /* Set the gamma for the window */
> if ( gamma != 0.0 )
> {
> SDL_SetGamma(gamma, gamma, gamma);
> }
>
>
> glEnable( GL_DEPTH_TEST );
> glClearColor(0.0, 0.0, 0.2, 0.0); // This clear the background color
> to dark blue
> glShadeModel(GL_SMOOTH); // Type of shading for the polygons
> glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); // Polygon rasterization
> mode (polygon filled)
> glEnable(GL_TEXTURE_2D); // This Enable the Texture mapping
>
> glViewport(0,0,w,h);
>
> glMatrixMode(GL_PROJECTION);
> glLoadIdentity();
>
> // FOV // Ratio // The farthest distance
> before it stops drawing
> perspectiveGL(45.0f,(GLfloat)w/(GLfloat)h, .5f ,5000.0f);
>
> glMatrixMode(GL_MODELVIEW);
> glLoadIdentity();
>
> unsigned long totalpolys = 0 ;
>
> for(int x = 0; x < MAX_OBJECTS; x++)
> {
> cLoad3DS my3ds(&object[x], "spaceship.3ds",
> "spaceshiptexture.bmp");
> if(object[x].valid == false)
> {
> MessageBox(NULL,"Object not loaded", "Error",MB_OK |
> MB_ICONERROR);
> return 0 ;
> }
>
> totalpolys += object[x].polygons_qty ;
> }
>
> printf("Total polygons: %ld\n", totalpolys) ;
>
> /* Loop until done. */
> start_time = SDL_GetTicks();
> frames = 0;
>
>
> // Absolute rotation values (0-359 degrees) and rotation increments
> for each frame
> // double rotation_x=0, rotation_x_increment=0.1;
> // double rotation_y=0, rotation_y_increment=0.05;
> // double rotation_z=0, rotation_z_increment=0.03;
> double rotation_x=0, rotation_x_increment=0.5;
> double rotation_y=0, rotation_y_increment=0.25;
> double rotation_z=0, rotation_z_increment=0.15;
>
> GLuint displaylist ;
> displaylist = glGenLists(1) ;
>
> glNewList(displaylist, GL_COMPILE) ;
> for(int x = 0; x < MAX_OBJECTS; x++)
> {
> glBindTexture(GL_TEXTURE_2D, object[x].id_texture); // We set
> the active texture
> object[x].Draw(true) ;
> }
> glEndList() ;
>
> glMatrixMode(GL_MODELVIEW); // Modeling transformation
> glLoadIdentity(); // Initialize the model matrix as identity
>
> glTranslatef(0.0,0.0,-600); // We move the object forward (the model
> matrix is multiplied by the translation matrix)
>
> rotation_x = rotation_x + rotation_x_increment;
> rotation_y = rotation_y + rotation_y_increment;
> rotation_z = rotation_z + rotation_z_increment;
>
> while( !done )
> {
> GLenum gl_error;
> char* sdl_error;
> SDL_Event event;
>
> /* Do our drawing, too. */
>
> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // This
> clear the background color to dark blue
> // glMatrixMode(GL_MODELVIEW); // Modeling transformation
> // glLoadIdentity(); // Initialize the model matrix as identity
>
> // glTranslatef(0.0,0.0,-300); // We move the object forward (the
> model matrix is multiplied by the translation matrix)
>
> // rotation_x = rotation_x + rotation_x_increment;
> // rotation_y = rotation_y + rotation_y_increment;
> // rotation_z = rotation_z + rotation_z_increment;
>
> if (rotation_x > 359) rotation_x = 0;
> if (rotation_y > 359) rotation_y = 0;
> if (rotation_z > 359) rotation_z = 0;
>
> glRotatef(rotation_x,1.0,0.0,0.0); // Rotations of the object
> (the model matrix is multiplied by the rotation matrices)
> glRotatef(rotation_y,0.0,1.0,0.0);
> glRotatef(rotation_z,0.0,0.0,1.0);
>
> glCallList(displaylist) ;
>
> SDL_GL_SwapBuffers();
>
>
>
> /* Check if there's a pending event. */
> while( SDL_PollEvent( &event ) )
> {
> done = HandleEvent(&event);
> }
> ++frames;
>
> this_time = SDL_GetTicks();
> if ( this_time >= start_time + 500)
> {
> static char name[1024] ;
> sprintf(name, "SDL GL test [polys: %ld fps: %5.2f]",
> totalpolys,((float)frames/(this_time-start_time))*1000.0);
>
> start_time = this_time ;
> frames = 0 ;
> SDL_WM_SetCaption( name, "testgl" );
> printf("%s\n", name) ;
> }
>
> }
>
>
>
> /* Print out the frames per second */
> this_time = SDL_GetTicks();
> if ( this_time != start_time )
> {
> printf("%2.2f FPS\n",
> ((float)frames/(this_time-start_time))*1000.0);
> }
>
> if ( global_image )
> {
> SDL_FreeSurface(global_image);
> global_image = NULL;
> }
> if ( global_texture )
> {
> glDeleteTextures( 1, &global_texture );
> global_texture = 0;
> }
>
> /* Destroy our GL context, etc. */
> SDL_Quit( );
> return(0);
> }
>
>
> _______________________________________________
> SDL mailing list
> SDL at libsdl.org
> http://www.libsdl.org/mailman/listinfo/sdl
>
>
More information about the SDL
mailing list