From 0e792427d933f393cd4a2e5a554ff13a60daa055 Mon Sep 17 00:00:00 2001 From: Mike Gorchak Date: Tue, 28 Apr 2009 04:38:51 +0000 Subject: [PATCH] Added OpenGL ES context creation for the each window which has been created (for --windows=N option). --- test/testgles.c | 90 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 26 deletions(-) diff --git a/test/testgles.c b/test/testgles.c index fb33afcb2..c6a3a610a 100644 --- a/test/testgles.c +++ b/test/testgles.c @@ -14,16 +14,26 @@ #include "SDL_opengles.h" static CommonState *state; -static SDL_GLContext context; +static SDL_GLContext *context=NULL; /* 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); + int i; + + if (context!=NULL) + { + for (i=0; inum_windows; i++) + { + if (context[i]) { + SDL_GL_DeleteContext(context[i]); + } + } + + SDL_free(context); } + CommonQuit(state); exit(rc); } @@ -139,11 +149,21 @@ main(int argc, char *argv[]) quit(2); } - /* Create OpenGL context */ - context = SDL_GL_CreateContext(state->windows[0]); - if (!context) { - fprintf(stderr, "SDL_GL_CreateContext(): %s\n", SDL_GetError()); - quit(2); + context=SDL_calloc(state->num_windows, sizeof(SDL_GLContext)); + if (context==NULL) + { + fprintf(stderr, "Out of memory!\n"); + quit(2); + } + + /* Create OpenGL ES contexts */ + for (i=0; inum_windows; i++) + { + context[i] = SDL_GL_CreateContext(state->windows[i]); + if (!context[i]) { + fprintf(stderr, "SDL_GL_CreateContext(): %s\n", SDL_GetError()); + quit(2); + } } if (state->render_flags & SDL_RENDERER_PRESENTVSYNC) { @@ -165,38 +185,38 @@ main(int argc, char *argv[]) if (!status) { printf("SDL_GL_RED_SIZE: requested %d, got %d\n", 5, value); } else { - printf("Failed to get SDL_GL_RED_SIZE: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to get SDL_GL_RED_SIZE: %s\n", SDL_GetError()); } status=SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &value); if (!status) { printf("SDL_GL_GREEN_SIZE: requested %d, got %d\n", 5, value); } else { - printf("Failed to get SDL_GL_GREEN_SIZE: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to get SDL_GL_GREEN_SIZE: %s\n", SDL_GetError()); } status=SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &value); if (!status) { printf("SDL_GL_BLUE_SIZE: requested %d, got %d\n", 5, value); } else { - printf("Failed to get SDL_GL_BLUE_SIZE: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to get SDL_GL_BLUE_SIZE: %s\n", SDL_GetError()); } status=SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &value); if (!status) { printf("SDL_GL_DEPTH_SIZE: requested %d, got %d\n", 16, value); } else { - printf("Failed to get SDL_GL_DEPTH_SIZE: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to get SDL_GL_DEPTH_SIZE: %s\n", SDL_GetError()); } if (fsaa) { status=SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &value); if (!status) { printf("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value); } else { - printf("Failed to get SDL_GL_MULTISAMPLEBUFFERS: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to get SDL_GL_MULTISAMPLEBUFFERS: %s\n", SDL_GetError()); } status=SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &value); if (!status) { printf("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa, value); } else { - printf("Failed to get SDL_GL_MULTISAMPLESAMPLES: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to get SDL_GL_MULTISAMPLESAMPLES: %s\n", SDL_GetError()); } } if (accel) { @@ -205,19 +225,30 @@ main(int argc, char *argv[]) { printf("SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value); } else { - printf("Failed to get SDL_GL_ACCELERATED_VISUAL: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to get SDL_GL_ACCELERATED_VISUAL: %s\n", SDL_GetError()); } } - /* Set rendering settings */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrthof(-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); + /* Set rendering settings for each context */ + for (i = 0; i < state->num_windows; ++i) { + status=SDL_GL_MakeCurrent(state->windows[i], context[i]); + if (status) + { + printf("SDL_GL_MakeCurrent(): %s\n", SDL_GetError()); + + /* Continue for next window */ + continue; + } + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrthof(-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; @@ -231,7 +262,14 @@ main(int argc, char *argv[]) } for (i = 0; i < state->num_windows; ++i) { int w, h; - SDL_GL_MakeCurrent(state->windows[i], context); + status=SDL_GL_MakeCurrent(state->windows[i], context[i]); + if (status) + { + printf("SDL_GL_MakeCurrent(): %s\n", SDL_GetError()); + + /* Continue for next window */ + continue; + } SDL_GetWindowSize(state->windows[i], &w, &h); glViewport(0, 0, w, h); Render();