Commit f2c82961 authored by Sam Lantinga's avatar Sam Lantinga

Implemented multi-window OpenGL program with test framework.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401960
parent 3b997f23
...@@ -60,6 +60,8 @@ SDL_SendWindowEvent(SDL_WindowID windowID, Uint8 windowevent, int data1, ...@@ -60,6 +60,8 @@ SDL_SendWindowEvent(SDL_WindowID windowID, Uint8 windowevent, int data1,
if (data1 == window->x && data2 == window->y) { if (data1 == window->x && data2 == window->y) {
return 0; return 0;
} }
window->x = data1;
window->y = data2;
break; break;
case SDL_WINDOWEVENT_RESIZED: case SDL_WINDOWEVENT_RESIZED:
if (window->flags & SDL_WINDOW_FULLSCREEN) { if (window->flags & SDL_WINDOW_FULLSCREEN) {
...@@ -68,6 +70,8 @@ SDL_SendWindowEvent(SDL_WindowID windowID, Uint8 windowevent, int data1, ...@@ -68,6 +70,8 @@ SDL_SendWindowEvent(SDL_WindowID windowID, Uint8 windowevent, int data1,
if (data1 == window->w && data2 == window->h) { if (data1 == window->w && data2 == window->h) {
return 0; return 0;
} }
window->w = data1;
window->h = data2;
break; break;
case SDL_WINDOWEVENT_MINIMIZED: case SDL_WINDOWEVENT_MINIMIZED:
if (window->flags & SDL_WINDOW_MINIMIZED) { if (window->flags & SDL_WINDOW_MINIMIZED) {
......
...@@ -53,8 +53,8 @@ testgamma$(EXE): $(srcdir)/testgamma.c ...@@ -53,8 +53,8 @@ testgamma$(EXE): $(srcdir)/testgamma.c
testgl$(EXE): $(srcdir)/testgl.c testgl$(EXE): $(srcdir)/testgl.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) @GLLIB@ @MATHLIB@ $(CC) -o $@ $? $(CFLAGS) $(LIBS) @GLLIB@ @MATHLIB@
testgl2$(EXE): $(srcdir)/testgl2.c testgl2$(EXE): $(srcdir)/testgl2.c $(srcdir)/common.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) @GLLIB@ @MATHLIB@ $(CC) -o $@ $(srcdir)/testgl2.c $(srcdir)/common.c $(CFLAGS) $(LIBS) @GLLIB@ @MATHLIB@
testhread$(EXE): $(srcdir)/testhread.c testhread$(EXE): $(srcdir)/testhread.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) $(CC) -o $@ $? $(CFLAGS) $(LIBS)
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include "SDL.h" #include "common.h"
#ifdef __MACOS__ #ifdef __MACOS__
#define HAVE_OPENGL #define HAVE_OPENGL
...@@ -16,370 +16,26 @@ ...@@ -16,370 +16,26 @@
/* Undefine this if you want a flat cube instead of a rainbow cube */ /* Undefine this if you want a flat cube instead of a rainbow cube */
#define SHADED_CUBE #define SHADED_CUBE
/* Define this to be the name of the logo image to use with -logo */ static CommonState *state;
#define LOGO_FILE "icon.bmp" static SDL_GLContext context;
static SDL_Surface *global_image = NULL; /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static GLuint global_texture = 0; static void
static GLuint cursor_texture = 0; quit(int rc)
/**********************************************************************/
void
HotKey_ToggleFullScreen(void)
{
SDL_Surface *screen;
screen = SDL_GetVideoSurface();
if (SDL_WM_ToggleFullScreen(screen)) {
printf("Toggled fullscreen mode - now %s\n",
(screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
} else {
printf("Unable to toggle fullscreen mode\n");
}
}
void
HotKey_ToggleGrab(void)
{
SDL_GrabMode mode;
printf("Ctrl-G: toggling input grab!\n");
mode = SDL_WM_GrabInput(SDL_GRAB_QUERY);
if (mode == SDL_GRAB_ON) {
printf("Grab was on\n");
} else {
printf("Grab was off\n");
}
mode = SDL_WM_GrabInput(!mode);
if (mode == SDL_GRAB_ON) {
printf("Grab is now on\n");
} else {
printf("Grab is now off\n");
}
}
void
HotKey_Iconify(void)
{
printf("Ctrl-Z: iconifying window!\n");
SDL_WM_IconifyWindow();
}
int
HandleEvent(SDL_Event * event)
{
int done;
done = 0;
switch (event->type) {
case SDL_ACTIVEEVENT:
/* See what happened */
printf("app %s ", event->active.gain ? "gained" : "lost");
if (event->active.state & SDL_APPACTIVE) {
printf("active ");
} else if (event->active.state & SDL_APPMOUSEFOCUS) {
printf("mouse ");
} else if (event->active.state & SDL_APPINPUTFOCUS) {
printf("input ");
}
printf("focus\n");
break;
case SDL_KEYDOWN:
if (event->key.keysym.sym == SDLK_ESCAPE) {
done = 1;
}
if ((event->key.keysym.sym == SDLK_g) &&
(event->key.keysym.mod & KMOD_CTRL)) {
HotKey_ToggleGrab();
}
if ((event->key.keysym.sym == SDLK_z) &&
(event->key.keysym.mod & KMOD_CTRL)) {
HotKey_Iconify();
}
if ((event->key.keysym.sym == SDLK_RETURN) &&
(event->key.keysym.mod & KMOD_ALT)) {
HotKey_ToggleFullScreen();
}
printf("key '%s' pressed\n", SDL_GetKeyName(event->key.keysym.sym));
break;
case SDL_QUIT:
done = 1;
break;
}
return (done);
}
void
SDL_GL_Enter2DMode()
{
SDL_Surface *screen = SDL_GetVideoSurface();
/* Note, there may be other things you need to change,
depending on how you have your OpenGL state set up.
*/
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);
/* This allows alpha blending of 2D textures with the scene */
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glViewport(0, 0, screen->w, screen->h);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, (GLdouble) screen->w, (GLdouble) screen->h, 0.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}
void
SDL_GL_Leave2DMode()
{ {
glMatrixMode(GL_MODELVIEW); if (context) {
glPopMatrix(); SDL_GL_MakeCurrent(0, NULL);
SDL_GL_DeleteContext(context);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
}
/* Quick utility function for texture creation */
static int
power_of_two(int input)
{
int value = 1;
while (value < input) {
value <<= 1;
} }
return value; CommonQuit(state);
exit(rc);
} }
GLuint static void
SDL_GL_LoadTexture(SDL_Surface * surface, GLfloat * texcoord) Render()
{ {
GLuint texture; static float color[8][3] = {
int w, h; {1.0, 1.0, 0.0},
SDL_Surface *image;
SDL_Rect area;
Uint32 saved_flags;
Uint8 saved_alpha;
/* Use the surface width and height expanded to powers of 2 */
w = power_of_two(surface->w);
h = power_of_two(surface->h);
texcoord[0] = 0.0f; /* Min X */
texcoord[1] = 0.0f; /* Min Y */
texcoord[2] = (GLfloat) surface->w / w; /* Max X */
texcoord[3] = (GLfloat) surface->h / h; /* Max Y */
image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,
#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
0x000000FF,
0x0000FF00, 0x00FF0000, 0xFF000000
#else
0xFF000000,
0x00FF0000, 0x0000FF00, 0x000000FF
#endif
);
if (image == NULL) {
return 0;
}
/* Save the alpha blending attributes */
saved_flags = surface->flags & (SDL_SRCALPHA | SDL_RLEACCELOK);
saved_alpha = surface->format->alpha;
if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) {
SDL_SetAlpha(surface, 0, 0);
}
/* Copy the surface into the GL texture image */
area.x = 0;
area.y = 0;
area.w = surface->w;
area.h = surface->h;
SDL_BlitSurface(surface, &area, image, &area);
/* Restore the alpha blending attributes */
if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) {
SDL_SetAlpha(surface, saved_flags, saved_alpha);
}
/* Create an OpenGL texture for the image */
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
SDL_FreeSurface(image); /* No longer needed */
return texture;
}
void
DrawLogoCursor(void)
{
static GLfloat texMinX, texMinY;
static GLfloat texMaxX, texMaxY;
static int w, h;
int x, y;
if (!cursor_texture) {
SDL_Surface *image;
GLfloat texcoord[4];
/* Load the image (could use SDL_image library here) */
image = SDL_LoadBMP(LOGO_FILE);
if (image == NULL) {
return;
}
w = image->w;
h = image->h;
/* Convert the image into an OpenGL texture */
cursor_texture = SDL_GL_LoadTexture(image, texcoord);
/* Make texture coordinates easy to understand */
texMinX = texcoord[0];
texMinY = texcoord[1];
texMaxX = texcoord[2];
texMaxY = texcoord[3];
/* We don't need the original image anymore */
SDL_FreeSurface(image);
/* Make sure that the texture conversion is okay */
if (!cursor_texture) {
return;
}
}
/* Move the image around */
SDL_GetMouseState(&x, &y);
x -= w / 2;
y -= h / 2;
/* Show the image on the screen */
SDL_GL_Enter2DMode();
glBindTexture(GL_TEXTURE_2D, cursor_texture);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(texMinX, texMinY);
glVertex2i(x, y);
glTexCoord2f(texMaxX, texMinY);
glVertex2i(x + w, y);
glTexCoord2f(texMinX, texMaxY);
glVertex2i(x, y + h);
glTexCoord2f(texMaxX, texMaxY);
glVertex2i(x + w, y + h);
glEnd();
SDL_GL_Leave2DMode();
}
void
DrawLogoTexture(void)
{
static GLfloat texMinX, texMinY;
static GLfloat texMaxX, texMaxY;
static int x = 0;
static int y = 0;
static int w, h;
static int delta_x = 1;
static int delta_y = 1;
SDL_Surface *screen = SDL_GetVideoSurface();
if (!global_texture) {
SDL_Surface *image;
GLfloat texcoord[4];
/* Load the image (could use SDL_image library here) */
image = SDL_LoadBMP(LOGO_FILE);
if (image == NULL) {
return;
}
w = image->w;
h = image->h;
/* Convert the image into an OpenGL texture */
global_texture = SDL_GL_LoadTexture(image, texcoord);
/* Make texture coordinates easy to understand */
texMinX = texcoord[0];
texMinY = texcoord[1];
texMaxX = texcoord[2];
texMaxY = texcoord[3];
/* We don't need the original image anymore */
SDL_FreeSurface(image);
/* Make sure that the texture conversion is okay */
if (!global_texture) {
return;
}
}
/* Move the image around */
x += delta_x;
if (x < 0) {
x = 0;
delta_x = -delta_x;
} else if ((x + w) > screen->w) {
x = screen->w - w;
delta_x = -delta_x;
}
y += delta_y;
if (y < 0) {
y = 0;
delta_y = -delta_y;
} else if ((y + h) > screen->h) {
y = screen->h - h;
delta_y = -delta_y;
}
/* Show the image on the screen */
SDL_GL_Enter2DMode();
glBindTexture(GL_TEXTURE_2D, global_texture);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(texMinX, texMinY);
glVertex2i(x, y);
glTexCoord2f(texMaxX, texMinY);
glVertex2i(x + w, y);
glTexCoord2f(texMinX, texMaxY);
glVertex2i(x, y + h);
glTexCoord2f(texMaxX, texMaxY);
glVertex2i(x + w, y + h);
glEnd();
SDL_GL_Leave2DMode();
}
int
RunGLTest(int argc, char *argv[],
int logo, int logocursor, int slowly, int bpp, float gamma,
int noframe, int fsaa, int sync, int accel)
{
int i;
int rgb_size[3];
int w = 640;
int h = 480;
int done = 0;
int frames;
Uint32 start_time, this_time;
float color[8][3] = { {1.0, 1.0, 0.0},
{1.0, 0.0, 0.0}, {1.0, 0.0, 0.0},
{0.0, 0.0, 0.0}, {0.0, 0.0, 0.0},
{0.0, 1.0, 0.0}, {0.0, 1.0, 0.0},
...@@ -388,7 +44,8 @@ RunGLTest(int argc, char *argv[], ...@@ -388,7 +44,8 @@ RunGLTest(int argc, char *argv[],
{1.0, 0.0, 1.0}, {1.0, 0.0, 1.0},
{0.0, 0.0, 1.0} {0.0, 0.0, 1.0}
}; };
float cube[8][3] = { {0.5, 0.5, -0.5}, static float cube[8][3] = {
{0.5, 0.5, -0.5},
{0.5, -0.5, -0.5}, {0.5, -0.5, -0.5},
{-0.5, -0.5, -0.5}, {-0.5, -0.5, -0.5},
{-0.5, 0.5, -0.5}, {-0.5, 0.5, -0.5},
...@@ -397,141 +54,6 @@ RunGLTest(int argc, char *argv[], ...@@ -397,141 +54,6 @@ RunGLTest(int argc, char *argv[],
{0.5, -0.5, 0.5}, {0.5, -0.5, 0.5},
{-0.5, -0.5, 0.5} {-0.5, -0.5, 0.5}
}; };
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 */
}
}
/* Set the flags we want to use for setting the video mode */
video_flags = SDL_OPENGL;
for (i = 1; argv[i]; ++i) {
if (strcmp(argv[i], "-fullscreen") == 0) {
video_flags |= SDL_FULLSCREEN;
}
}
if (noframe) {
video_flags |= SDL_NOFRAME;
}
/* 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 (accel) {
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
}
if (SDL_SetVideoMode(w, h, bpp, video_flags) == NULL) {
fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError());
SDL_Quit();
exit(1);
}
if (sync) {
SDL_GL_SetSwapInterval(1);
} else {
SDL_GL_SetSwapInterval(0);
}
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);
}
if (accel) {
SDL_GL_GetAttribute(SDL_GL_ACCELERATED_VISUAL, &value);
printf("SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value);
}
if (sync) {
printf("Buffer swap interval: requested 1, got %d\n",
SDL_GL_GetSwapInterval());
}
/* 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);
}
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, -20.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glShadeModel(GL_SMOOTH);
/* Loop until done. */
start_time = SDL_GetTicks();
frames = 0;
while (!done) {
GLenum gl_error;
char *sdl_error;
SDL_Event event;
/* Do our drawing, too. */ /* Do our drawing, too. */
glClearColor(0.0, 0.0, 0.0, 1.0); glClearColor(0.0, 0.0, 0.0, 1.0);
...@@ -635,127 +157,155 @@ RunGLTest(int argc, char *argv[], ...@@ -635,127 +157,155 @@ RunGLTest(int argc, char *argv[],
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glRotatef(5.0, 1.0, 1.0, 1.0); glRotatef(5.0, 1.0, 1.0, 1.0);
}
/* Draw 2D logo onto the 3D display */ int
if (logo) { main(int argc, char *argv[])
DrawLogoTexture(); {
} int fsaa, accel;
if (logocursor) { int value;
DrawLogoCursor(); int i, done;
} SDL_Event event;
Uint32 then, now, frames;
SDL_GL_SwapBuffers();
/* Check for error conditions. */ /* Initialize parameters */
gl_error = glGetError(); fsaa = 0;
accel = 0;
if (gl_error != GL_NO_ERROR) { /* Initialize test framework */
fprintf(stderr, "testgl: OpenGL error: %d\n", gl_error); state = CommonCreateState(argv, SDL_INIT_VIDEO);
if (!state) {
return 1;
} }
for (i = 1; i < argc;) {
int consumed;
sdl_error = SDL_GetError(); consumed = CommonArg(state, i);
if (consumed == 0) {
if (sdl_error[0] != '\0') { if (SDL_strcasecmp(argv[i], "--fsaa") == 0) {
fprintf(stderr, "testgl: SDL error '%s'\n", sdl_error); ++fsaa;
SDL_ClearError(); consumed = 1;
} else if (SDL_strcasecmp(argv[i], "--accel") == 0) {
++accel;
consumed = 1;
} else {
consumed = -1;
} }
/* Allow the user to see what's happening */
if (slowly) {
SDL_Delay(20);
} }
if (consumed < 0) {
/* Check if there's a pending event. */ fprintf(stderr, "Usage: %s [--fsaa] [--accel] %s", argv[0],
while (SDL_PollEvent(&event)) { CommonUsage(state));
done = HandleEvent(&event); quit(1);
}
++frames;
} }
i += consumed;
/* 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) { /* Set OpenGL parameters */
SDL_FreeSurface(global_image); state->window_flags |= SDL_WINDOW_OPENGL;
global_image = NULL; SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
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 (global_texture) { if (accel) {
glDeleteTextures(1, &global_texture); SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
global_texture = 0;
} }
if (cursor_texture) { if (!CommonInit(state)) {
glDeleteTextures(1, &cursor_texture); quit(2);
cursor_texture = 0;
} }
/* Destroy our GL context, etc. */ /* Create OpenGL context */
SDL_Quit(); context = SDL_GL_CreateContext(state->windows[0]);
return (0); if (!context) {
} fprintf(stderr, "SDL_GL_CreateContext(): %s\n", SDL_GetError());
quit(2);
int
main(int argc, char *argv[])
{
int i, logo, logocursor = 0;
int numtests;
int bpp = 0;
int slowly;
float gamma = 0.0;
int noframe = 0;
int fsaa = 0;
int accel = 0;
int sync = 0;
logo = 0;
slowly = 0;
numtests = 1;
for (i = 1; argv[i]; ++i) {
if (strcmp(argv[i], "-twice") == 0) {
++numtests;
}
if (strcmp(argv[i], "-logo") == 0) {
logo = 1;
}
if (strcmp(argv[i], "-logocursor") == 0) {
logocursor = 1;
}
if (strcmp(argv[i], "-slow") == 0) {
slowly = 1;
} }
if (strcmp(argv[i], "-bpp") == 0) { if (SDL_GL_MakeCurrent(state->windows[0], context) < 0) {
bpp = atoi(argv[++i]); fprintf(stderr, "SDL_GL_MakeCurrent(): %s\n", SDL_GetError());
quit(2);
} }
if (strcmp(argv[i], "-gamma") == 0) {
gamma = (float) atof(argv[++i]); if (state->render_flags & SDL_Renderer_PresentVSync) {
} SDL_GL_SetSwapInterval(1);
if (strcmp(argv[i], "-noframe") == 0) { } else {
noframe = 1; SDL_GL_SetSwapInterval(0);
} }
if (strcmp(argv[i], "-fsaa") == 0) {
++fsaa; printf("Screen BPP: %d\n",
SDL_BITSPERPIXEL(SDL_GetCurrentDisplayMode()->format));
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_GetWindowAttribute(state->windows[0], SDL_GL_RED_SIZE, &value);
printf("SDL_GL_RED_SIZE: requested %d, got %d\n", 5, value);
SDL_GL_GetWindowAttribute(state->windows[0], SDL_GL_GREEN_SIZE, &value);
printf("SDL_GL_GREEN_SIZE: requested %d, got %d\n", 5, value);
SDL_GL_GetWindowAttribute(state->windows[0], SDL_GL_BLUE_SIZE, &value);
printf("SDL_GL_BLUE_SIZE: requested %d, got %d\n", 5, value);
SDL_GL_GetWindowAttribute(state->windows[0], SDL_GL_DEPTH_SIZE, &value);
printf("SDL_GL_DEPTH_SIZE: requested %d, got %d\n", 16, value);
SDL_GL_GetWindowAttribute(state->windows[0], SDL_GL_DOUBLEBUFFER, &value);
printf("SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value);
if (fsaa) {
SDL_GL_GetWindowAttribute(state->windows[0],
SDL_GL_MULTISAMPLEBUFFERS, &value);
printf("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
SDL_GL_GetWindowAttribute(state->windows[0],
SDL_GL_MULTISAMPLESAMPLES, &value);
printf("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
value);
} }
if (strcmp(argv[i], "-accel") == 0) { if (accel) {
++accel; SDL_GL_GetWindowAttribute(state->windows[0],
SDL_GL_ACCELERATED_VISUAL, &value);
printf("SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value);
} }
if (strcmp(argv[i], "-sync") == 0) {
++sync; /* Set rendering settings */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, -20.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glShadeModel(GL_SMOOTH);
/* Main render loop */
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
CommonEvent(state, &event, &done);
} }
if (strncmp(argv[i], "-h", 2) == 0) { for (i = 0; i < state->num_windows; ++i) {
printf int w, h;
("Usage: %s [-twice] [-logo] [-logocursor] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa] [-accel] [-sync] [-fullscreen]\n", SDL_GL_MakeCurrent(state->windows[i], context);
argv[0]); SDL_GetWindowSize(state->windows[i], &w, &h);
exit(0); glViewport(0, 0, w, h);
Render();
SDL_GL_SwapWindow(state->windows[i]);
} }
} }
for (i = 0; i < numtests; ++i) {
RunGLTest(argc, argv, logo, logocursor, slowly, bpp, gamma, /* Print out some timing information */
noframe, fsaa, sync, accel); now = SDL_GetTicks();
if (now > then) {
printf("%2.2f frames per second\n",
((double) frames * 1000) / (now - then));
} }
return 0; quit(0);
} }
#else /* HAVE_OPENGL */ #else /* HAVE_OPENGL */
......
...@@ -134,14 +134,14 @@ main(int argc, char *argv[]) ...@@ -134,14 +134,14 @@ main(int argc, char *argv[])
int consumed; int consumed;
consumed = CommonArg(state, i); consumed = CommonArg(state, i);
if (consumed < 0) {
fprintf(stderr, "Usage: %s %s", argv[0], CommonUsage(state));
quit(1);
}
if (consumed == 0) { if (consumed == 0) {
num_sprites = SDL_atoi(argv[i]); num_sprites = SDL_atoi(argv[i]);
consumed = 1; consumed = 1;
} }
if (consumed < 0) {
fprintf(stderr, "Usage: %s %s", argv[0], CommonUsage(state));
quit(1);
}
i += consumed; i += consumed;
} }
if (!CommonInit(state)) { if (!CommonInit(state)) {
...@@ -184,7 +184,7 @@ main(int argc, char *argv[]) ...@@ -184,7 +184,7 @@ main(int argc, char *argv[])
} }
} }
/* Loop, blitting sprites and waiting for a keystroke */ /* Main render loop */
frames = 0; frames = 0;
then = SDL_GetTicks(); then = SDL_GetTicks();
done = 0; done = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment