mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-29 20:27:12 +01:00
529664278f
norfanin Some of the tests keep using the pointers of a destroyed SDL_Window when the common event handling handled the close event. The event handler itself does not NULL the pointer after the destruction. The attached patch adds a loop in the handler that will assign NULL to the destroyed window. It also adds checks to some of the tests so they skip those windows by checking for NULL.
373 lines
10 KiB
C
373 lines
10 KiB
C
/*
|
|
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely.
|
|
*/
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
#include "SDL_test_common.h"
|
|
|
|
#ifdef __MACOS__
|
|
#define HAVE_OPENGL
|
|
#endif
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
#include "SDL_opengl.h"
|
|
|
|
/* Undefine this if you want a flat cube instead of a rainbow cube */
|
|
#define SHADED_CUBE
|
|
|
|
static SDLTest_CommonState *state;
|
|
static SDL_GLContext context;
|
|
|
|
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
|
|
static void
|
|
quit(int rc)
|
|
{
|
|
if (context) {
|
|
/* SDL_GL_MakeCurrent(0, NULL); *//* doesn't do anything */
|
|
SDL_GL_DeleteContext(context);
|
|
}
|
|
SDLTest_CommonQuit(state);
|
|
exit(rc);
|
|
}
|
|
|
|
static void
|
|
Render()
|
|
{
|
|
static float color[8][3] = {
|
|
{1.0, 1.0, 0.0},
|
|
{1.0, 0.0, 0.0},
|
|
{0.0, 0.0, 0.0},
|
|
{0.0, 1.0, 0.0},
|
|
{0.0, 1.0, 1.0},
|
|
{1.0, 1.0, 1.0},
|
|
{1.0, 0.0, 1.0},
|
|
{0.0, 0.0, 1.0}
|
|
};
|
|
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},
|
|
{-0.5, -0.5, 0.5}
|
|
};
|
|
|
|
/* Do our drawing, too. */
|
|
glClearColor(0.0, 0.0, 0.0, 1.0);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
#ifdef SHADED_CUBE
|
|
glColor3fv(color[0]);
|
|
glVertex3fv(cube[0]);
|
|
glColor3fv(color[1]);
|
|
glVertex3fv(cube[1]);
|
|
glColor3fv(color[2]);
|
|
glVertex3fv(cube[2]);
|
|
glColor3fv(color[3]);
|
|
glVertex3fv(cube[3]);
|
|
|
|
glColor3fv(color[3]);
|
|
glVertex3fv(cube[3]);
|
|
glColor3fv(color[4]);
|
|
glVertex3fv(cube[4]);
|
|
glColor3fv(color[7]);
|
|
glVertex3fv(cube[7]);
|
|
glColor3fv(color[2]);
|
|
glVertex3fv(cube[2]);
|
|
|
|
glColor3fv(color[0]);
|
|
glVertex3fv(cube[0]);
|
|
glColor3fv(color[5]);
|
|
glVertex3fv(cube[5]);
|
|
glColor3fv(color[6]);
|
|
glVertex3fv(cube[6]);
|
|
glColor3fv(color[1]);
|
|
glVertex3fv(cube[1]);
|
|
|
|
glColor3fv(color[5]);
|
|
glVertex3fv(cube[5]);
|
|
glColor3fv(color[4]);
|
|
glVertex3fv(cube[4]);
|
|
glColor3fv(color[7]);
|
|
glVertex3fv(cube[7]);
|
|
glColor3fv(color[6]);
|
|
glVertex3fv(cube[6]);
|
|
|
|
glColor3fv(color[5]);
|
|
glVertex3fv(cube[5]);
|
|
glColor3fv(color[0]);
|
|
glVertex3fv(cube[0]);
|
|
glColor3fv(color[3]);
|
|
glVertex3fv(cube[3]);
|
|
glColor3fv(color[4]);
|
|
glVertex3fv(cube[4]);
|
|
|
|
glColor3fv(color[6]);
|
|
glVertex3fv(cube[6]);
|
|
glColor3fv(color[1]);
|
|
glVertex3fv(cube[1]);
|
|
glColor3fv(color[2]);
|
|
glVertex3fv(cube[2]);
|
|
glColor3fv(color[7]);
|
|
glVertex3fv(cube[7]);
|
|
#else /* flat cube */
|
|
glColor3f(1.0, 0.0, 0.0);
|
|
glVertex3fv(cube[0]);
|
|
glVertex3fv(cube[1]);
|
|
glVertex3fv(cube[2]);
|
|
glVertex3fv(cube[3]);
|
|
|
|
glColor3f(0.0, 1.0, 0.0);
|
|
glVertex3fv(cube[3]);
|
|
glVertex3fv(cube[4]);
|
|
glVertex3fv(cube[7]);
|
|
glVertex3fv(cube[2]);
|
|
|
|
glColor3f(0.0, 0.0, 1.0);
|
|
glVertex3fv(cube[0]);
|
|
glVertex3fv(cube[5]);
|
|
glVertex3fv(cube[6]);
|
|
glVertex3fv(cube[1]);
|
|
|
|
glColor3f(0.0, 1.0, 1.0);
|
|
glVertex3fv(cube[5]);
|
|
glVertex3fv(cube[4]);
|
|
glVertex3fv(cube[7]);
|
|
glVertex3fv(cube[6]);
|
|
|
|
glColor3f(1.0, 1.0, 0.0);
|
|
glVertex3fv(cube[5]);
|
|
glVertex3fv(cube[0]);
|
|
glVertex3fv(cube[3]);
|
|
glVertex3fv(cube[4]);
|
|
|
|
glColor3f(1.0, 0.0, 1.0);
|
|
glVertex3fv(cube[6]);
|
|
glVertex3fv(cube[1]);
|
|
glVertex3fv(cube[2]);
|
|
glVertex3fv(cube[7]);
|
|
#endif /* SHADED_CUBE */
|
|
|
|
glEnd();
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glRotatef(5.0, 1.0, 1.0, 1.0);
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
int fsaa, accel;
|
|
int value;
|
|
int i, done;
|
|
SDL_DisplayMode mode;
|
|
SDL_Event event;
|
|
Uint32 then, now, frames;
|
|
int status;
|
|
int dw, dh;
|
|
|
|
/* Enable standard application logging */
|
|
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
|
|
|
|
/* Initialize parameters */
|
|
fsaa = 0;
|
|
accel = -1;
|
|
|
|
/* Initialize test framework */
|
|
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
|
|
if (!state) {
|
|
return 1;
|
|
}
|
|
for (i = 1; i < argc;) {
|
|
int consumed;
|
|
|
|
consumed = SDLTest_CommonArg(state, i);
|
|
if (consumed == 0) {
|
|
if (SDL_strcasecmp(argv[i], "--fsaa") == 0 && i+1 < argc) {
|
|
fsaa = atoi(argv[i+1]);
|
|
consumed = 2;
|
|
} else if (SDL_strcasecmp(argv[i], "--accel") == 0 && i+1 < argc) {
|
|
accel = atoi(argv[i+1]);
|
|
consumed = 2;
|
|
} else {
|
|
consumed = -1;
|
|
}
|
|
}
|
|
if (consumed < 0) {
|
|
SDL_Log("Usage: %s %s [--fsaa n] [--accel n]\n", argv[0],
|
|
SDLTest_CommonUsage(state));
|
|
quit(1);
|
|
}
|
|
i += consumed;
|
|
}
|
|
|
|
/* Set OpenGL parameters */
|
|
state->window_flags |= SDL_WINDOW_OPENGL;
|
|
state->gl_red_size = 5;
|
|
state->gl_green_size = 5;
|
|
state->gl_blue_size = 5;
|
|
state->gl_depth_size = 16;
|
|
state->gl_double_buffer = 1;
|
|
if (fsaa) {
|
|
state->gl_multisamplebuffers = 1;
|
|
state->gl_multisamplesamples = fsaa;
|
|
}
|
|
if (accel >= 0) {
|
|
state->gl_accelerated = accel;
|
|
}
|
|
|
|
if (!SDLTest_CommonInit(state)) {
|
|
quit(2);
|
|
}
|
|
|
|
/* Create OpenGL context */
|
|
context = SDL_GL_CreateContext(state->windows[0]);
|
|
if (!context) {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_GL_CreateContext(): %s\n", SDL_GetError());
|
|
quit(2);
|
|
}
|
|
|
|
if (state->render_flags & SDL_RENDERER_PRESENTVSYNC) {
|
|
/* try late-swap-tearing first. If not supported, try normal vsync. */
|
|
if (SDL_GL_SetSwapInterval(-1) == -1) {
|
|
SDL_GL_SetSwapInterval(1);
|
|
}
|
|
} else {
|
|
SDL_GL_SetSwapInterval(0); /* disable vsync. */
|
|
}
|
|
|
|
SDL_GetCurrentDisplayMode(0, &mode);
|
|
SDL_Log("Screen BPP : %d\n", SDL_BITSPERPIXEL(mode.format));
|
|
SDL_Log("Swap Interval : %d\n", SDL_GL_GetSwapInterval());
|
|
SDL_GetWindowSize(state->windows[0], &dw, &dh);
|
|
SDL_Log("Window Size : %d,%d\n", dw, dh);
|
|
SDL_GL_GetDrawableSize(state->windows[0], &dw, &dh);
|
|
SDL_Log("Draw Size : %d,%d\n", dw, dh);
|
|
SDL_Log("\n");
|
|
SDL_Log("Vendor : %s\n", glGetString(GL_VENDOR));
|
|
SDL_Log("Renderer : %s\n", glGetString(GL_RENDERER));
|
|
SDL_Log("Version : %s\n", glGetString(GL_VERSION));
|
|
SDL_Log("Extensions : %s\n", glGetString(GL_EXTENSIONS));
|
|
SDL_Log("\n");
|
|
|
|
status = SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &value);
|
|
if (!status) {
|
|
SDL_Log("SDL_GL_RED_SIZE: requested %d, got %d\n", 5, value);
|
|
} else {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_RED_SIZE: %s\n", SDL_GetError());
|
|
}
|
|
status = SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &value);
|
|
if (!status) {
|
|
SDL_Log("SDL_GL_GREEN_SIZE: requested %d, got %d\n", 5, value);
|
|
} else {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_GREEN_SIZE: %s\n", SDL_GetError());
|
|
}
|
|
status = SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &value);
|
|
if (!status) {
|
|
SDL_Log("SDL_GL_BLUE_SIZE: requested %d, got %d\n", 5, value);
|
|
} else {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_BLUE_SIZE: %s\n", SDL_GetError());
|
|
}
|
|
status = SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &value);
|
|
if (!status) {
|
|
SDL_Log("SDL_GL_DEPTH_SIZE: requested %d, got %d\n", 16, value);
|
|
} else {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_DEPTH_SIZE: %s\n", SDL_GetError());
|
|
}
|
|
if (fsaa) {
|
|
status = SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &value);
|
|
if (!status) {
|
|
SDL_Log("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
|
|
} else {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_MULTISAMPLEBUFFERS: %s\n",
|
|
SDL_GetError());
|
|
}
|
|
status = SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &value);
|
|
if (!status) {
|
|
SDL_Log("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
|
|
value);
|
|
} else {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_MULTISAMPLESAMPLES: %s\n",
|
|
SDL_GetError());
|
|
}
|
|
}
|
|
if (accel >= 0) {
|
|
status = SDL_GL_GetAttribute(SDL_GL_ACCELERATED_VISUAL, &value);
|
|
if (!status) {
|
|
SDL_Log("SDL_GL_ACCELERATED_VISUAL: requested %d, got %d\n", accel,
|
|
value);
|
|
} else {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_ACCELERATED_VISUAL: %s\n",
|
|
SDL_GetError());
|
|
}
|
|
}
|
|
|
|
/* 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)) {
|
|
SDLTest_CommonEvent(state, &event, &done);
|
|
}
|
|
for (i = 0; i < state->num_windows; ++i) {
|
|
int w, h;
|
|
if (state->windows[i] == NULL)
|
|
continue;
|
|
SDL_GL_MakeCurrent(state->windows[i], context);
|
|
SDL_GL_GetDrawableSize(state->windows[i], &w, &h);
|
|
glViewport(0, 0, w, h);
|
|
Render();
|
|
SDL_GL_SwapWindow(state->windows[i]);
|
|
}
|
|
}
|
|
|
|
/* Print out some timing information */
|
|
now = SDL_GetTicks();
|
|
if (now > then) {
|
|
SDL_Log("%2.2f frames per second\n",
|
|
((double) frames * 1000) / (now - then));
|
|
}
|
|
quit(0);
|
|
return 0;
|
|
}
|
|
|
|
#else /* HAVE_OPENGL */
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No OpenGL support on this system\n");
|
|
return 1;
|
|
}
|
|
|
|
#endif /* HAVE_OPENGL */
|