SDL  2.0
testgles.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
3 
4  This software is provided 'as-is', without any express or implied
5  warranty. In no event will the authors be held liable for any damages
6  arising from the use of this software.
7 
8  Permission is granted to anyone to use this software for any purpose,
9  including commercial applications, and to alter it and redistribute it
10  freely.
11 */
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <math.h>
16 
17 #include "SDL_test_common.h"
18 
19 #if defined(__IPHONEOS__) || defined(__ANDROID__)
20 #define HAVE_OPENGLES
21 #endif
22 
23 #ifdef HAVE_OPENGLES
24 
25 #include "SDL_opengles.h"
26 
28 static SDL_GLContext *context = NULL;
29 static int depth = 16;
30 
31 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
32 static void
33 quit(int rc)
34 {
35  int i;
36 
37  if (context != NULL) {
38  for (i = 0; i < state->num_windows; i++) {
39  if (context[i]) {
41  }
42  }
43 
45  }
46 
47  SDLTest_CommonQuit(state);
48  exit(rc);
49 }
50 
51 static void
52 Render()
53 {
54  static GLubyte color[8][4] = { {255, 0, 0, 0},
55  {255, 0, 0, 255},
56  {0, 255, 0, 255},
57  {0, 255, 0, 255},
58  {0, 255, 0, 255},
59  {255, 255, 255, 255},
60  {255, 0, 255, 255},
61  {0, 0, 255, 255}
62  };
63  static GLfloat cube[8][3] = { {0.5, 0.5, -0.5},
64  {0.5f, -0.5f, -0.5f},
65  {-0.5f, -0.5f, -0.5f},
66  {-0.5f, 0.5f, -0.5f},
67  {-0.5f, 0.5f, 0.5f},
68  {0.5f, 0.5f, 0.5f},
69  {0.5f, -0.5f, 0.5f},
70  {-0.5f, -0.5f, 0.5f}
71  };
72  static GLubyte indices[36] = { 0, 3, 4,
73  4, 5, 0,
74  0, 5, 6,
75  6, 1, 0,
76  6, 7, 2,
77  2, 1, 6,
78  7, 4, 3,
79  3, 2, 7,
80  5, 4, 7,
81  7, 6, 5,
82  2, 3, 1,
83  3, 0, 1
84  };
85 
86 
87  /* Do our drawing, too. */
88  glClearColor(0.0, 0.0, 0.0, 1.0);
90 
91  /* Draw the cube */
92  glColorPointer(4, GL_UNSIGNED_BYTE, 0, color);
94  glVertexPointer(3, GL_FLOAT, 0, cube);
97 
99  glRotatef(5.0, 1.0, 1.0, 1.0);
100 }
101 
102 int
103 main(int argc, char *argv[])
104 {
105  int fsaa, accel;
106  int value;
107  int i, done;
110  Uint32 then, now, frames;
111  int status;
112 
113  /* Enable standard application logging */
115 
116  /* Initialize parameters */
117  fsaa = 0;
118  accel = 0;
119 
120  /* Initialize test framework */
122  if (!state) {
123  return 1;
124  }
125  for (i = 1; i < argc;) {
126  int consumed;
127 
128  consumed = SDLTest_CommonArg(state, i);
129  if (consumed == 0) {
130  if (SDL_strcasecmp(argv[i], "--fsaa") == 0) {
131  ++fsaa;
132  consumed = 1;
133  } else if (SDL_strcasecmp(argv[i], "--accel") == 0) {
134  ++accel;
135  consumed = 1;
136  } else if (SDL_strcasecmp(argv[i], "--zdepth") == 0) {
137  i++;
138  if (!argv[i]) {
139  consumed = -1;
140  } else {
141  depth = SDL_atoi(argv[i]);
142  consumed = 1;
143  }
144  } else {
145  consumed = -1;
146  }
147  }
148  if (consumed < 0) {
149  SDL_Log("Usage: %s %s [--fsaa] [--accel] [--zdepth %%d]\n", argv[0],
150  SDLTest_CommonUsage(state));
151  quit(1);
152  }
153  i += consumed;
154  }
155 
156  /* Set OpenGL parameters */
158  state->gl_red_size = 5;
159  state->gl_green_size = 5;
160  state->gl_blue_size = 5;
161  state->gl_depth_size = depth;
162  state->gl_major_version = 1;
163  state->gl_minor_version = 1;
165  if (fsaa) {
166  state->gl_multisamplebuffers=1;
167  state->gl_multisamplesamples=fsaa;
168  }
169  if (accel) {
170  state->gl_accelerated=1;
171  }
172  if (!SDLTest_CommonInit(state)) {
173  quit(2);
174  }
175 
176  context = (SDL_GLContext *)SDL_calloc(state->num_windows, sizeof(context));
177  if (context == NULL) {
178  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!\n");
179  quit(2);
180  }
181 
182  /* Create OpenGL ES contexts */
183  for (i = 0; i < state->num_windows; i++) {
184  context[i] = SDL_GL_CreateContext(state->windows[i]);
185  if (!context[i]) {
186  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_GL_CreateContext(): %s\n", SDL_GetError());
187  quit(2);
188  }
189  }
190 
193  } else {
195  }
196 
197  SDL_GetCurrentDisplayMode(0, &mode);
198  SDL_Log("Screen bpp: %d\n", SDL_BITSPERPIXEL(mode.format));
199  SDL_Log("\n");
200  SDL_Log("Vendor : %s\n", glGetString(GL_VENDOR));
201  SDL_Log("Renderer : %s\n", glGetString(GL_RENDERER));
202  SDL_Log("Version : %s\n", glGetString(GL_VERSION));
203  SDL_Log("Extensions : %s\n", glGetString(GL_EXTENSIONS));
204  SDL_Log("\n");
205 
206  status = SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &value);
207  if (!status) {
208  SDL_Log("SDL_GL_RED_SIZE: requested %d, got %d\n", 5, value);
209  } else {
210  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_RED_SIZE: %s\n",
211  SDL_GetError());
212  }
213  status = SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &value);
214  if (!status) {
215  SDL_Log("SDL_GL_GREEN_SIZE: requested %d, got %d\n", 5, value);
216  } else {
217  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_GREEN_SIZE: %s\n",
218  SDL_GetError());
219  }
220  status = SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &value);
221  if (!status) {
222  SDL_Log("SDL_GL_BLUE_SIZE: requested %d, got %d\n", 5, value);
223  } else {
224  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_BLUE_SIZE: %s\n",
225  SDL_GetError());
226  }
227  status = SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &value);
228  if (!status) {
229  SDL_Log("SDL_GL_DEPTH_SIZE: requested %d, got %d\n", depth, value);
230  } else {
231  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_DEPTH_SIZE: %s\n",
232  SDL_GetError());
233  }
234  if (fsaa) {
236  if (!status) {
237  SDL_Log("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
238  } else {
239  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_MULTISAMPLEBUFFERS: %s\n",
240  SDL_GetError());
241  }
243  if (!status) {
244  SDL_Log("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
245  value);
246  } else {
247  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_MULTISAMPLESAMPLES: %s\n",
248  SDL_GetError());
249  }
250  }
251  if (accel) {
253  if (!status) {
254  SDL_Log("SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value);
255  } else {
256  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_ACCELERATED_VISUAL: %s\n",
257  SDL_GetError());
258  }
259  }
260 
261  /* Set rendering settings for each context */
262  for (i = 0; i < state->num_windows; ++i) {
263  float aspectAdjust;
264 
265  status = SDL_GL_MakeCurrent(state->windows[i], context[i]);
266  if (status) {
267  SDL_Log("SDL_GL_MakeCurrent(): %s\n", SDL_GetError());
268 
269  /* Continue for next window */
270  continue;
271  }
272 
273  aspectAdjust = (4.0f / 3.0f) / ((float)state->window_w / state->window_h);
274  glViewport(0, 0, state->window_w, state->window_h);
276  glLoadIdentity();
277  glOrthof(-2.0, 2.0, -2.0 * aspectAdjust, 2.0 * aspectAdjust, -20.0, 20.0);
279  glLoadIdentity();
283  }
284 
285  /* Main render loop */
286  frames = 0;
287  then = SDL_GetTicks();
288  done = 0;
289  while (!done) {
290  /* Check for events */
291  ++frames;
292  while (SDL_PollEvent(&event)) {
293  switch (event.type) {
294  case SDL_WINDOWEVENT:
295  switch (event.window.event) {
297  for (i = 0; i < state->num_windows; ++i) {
298  if (event.window.windowID == SDL_GetWindowID(state->windows[i])) {
299  status = SDL_GL_MakeCurrent(state->windows[i], context[i]);
300  if (status) {
301  SDL_Log("SDL_GL_MakeCurrent(): %s\n", SDL_GetError());
302  break;
303  }
304  /* Change view port to the new window dimensions */
305  glViewport(0, 0, event.window.data1, event.window.data2);
306  /* Update window content */
307  Render();
308  SDL_GL_SwapWindow(state->windows[i]);
309  break;
310  }
311  }
312  break;
313  }
314  }
315  SDLTest_CommonEvent(state, &event, &done);
316  }
317  for (i = 0; i < state->num_windows; ++i) {
318  if (state->windows[i] == NULL)
319  continue;
320  status = SDL_GL_MakeCurrent(state->windows[i], context[i]);
321  if (status) {
322  SDL_Log("SDL_GL_MakeCurrent(): %s\n", SDL_GetError());
323 
324  /* Continue for next window */
325  continue;
326  }
327  Render();
328  SDL_GL_SwapWindow(state->windows[i]);
329  }
330  }
331 
332  /* Print out some timing information */
333  now = SDL_GetTicks();
334  if (now > then) {
335  SDL_Log("%2.2f frames per second\n",
336  ((double) frames * 1000) / (now - then));
337  }
338 #if !defined(__ANDROID__)
339  quit(0);
340 #endif
341  return 0;
342 }
343 
344 #else /* HAVE_OPENGLES */
345 
346 int
347 main(int argc, char *argv[])
348 {
349  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No OpenGL ES support on this system\n");
350  return 1;
351 }
352 
353 #endif /* HAVE_OPENGLES */
354 
355 /* vi: set ts=4 sw=4 expandtab: */
GLuint GLuint GLsizei GLenum const GLvoid * indices
Definition: SDL_opengl.h:1571
GLAPI void GLAPIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
GLAPI void GLAPIENTRY glShadeModel(GLenum mode)
#define SDL_PollEvent
#define SDL_GetError
#define SDL_GL_CreateContext
#define GL_VENDOR
Definition: SDL_opengl.h:713
#define SDL_GetWindowID
#define GL_PROJECTION
Definition: SDL_opengl.h:272
SDLTest_CommonState * SDLTest_CommonCreateState(char **argv, Uint32 flags)
Parse command line parameters and create common state.
struct xkb_state * state
int SDLTest_CommonArg(SDLTest_CommonState *state, int index)
Process one common argument.
GLAPI void GLAPIENTRY glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
static screen_context_t context
Definition: video.c:25
The structure that defines a display mode.
Definition: SDL_video.h:53
#define GL_DEPTH_BUFFER_BIT
Definition: SDL_opengl.h:736
#define GL_EXTENSIONS
Definition: SDL_opengl.h:716
GLAPI void GLAPIENTRY glEnableClientState(GLenum cap)
uint32_t Uint32
Definition: SDL_stdinc.h:181
#define GL_VERSION
Definition: SDL_opengl.h:715
float GLfloat
Definition: SDL_opengl.h:187
#define SDL_strcasecmp
SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state)
Open test window.
GLAPI void GLAPIENTRY glEnable(GLenum cap)
SDL_Window ** windows
#define SDL_LogError
SDL_WindowEvent window
Definition: SDL_events.h:529
#define SDL_Log
void * SDL_GLContext
An opaque handle to an OpenGL context.
Definition: SDL_video.h:175
#define GL_COLOR_ARRAY
Definition: SDL_opengl.h:230
void SDLTest_CommonEvent(SDLTest_CommonState *state, SDL_Event *event, int *done)
Common event handler for test windows.
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
void quit(int rc)
Definition: teststreaming.c:64
GLAPI void GLAPIENTRY glDepthFunc(GLenum func)
#define SDL_free
struct _cl_event * event
#define SDL_GL_SetSwapInterval
int done
Definition: checkkeys.c:28
#define GL_FLOAT
Definition: SDL_opengl.h:209
GLenum mode
GLsizei const GLfloat * value
#define GL_UNSIGNED_BYTE
Definition: SDL_opengl.h:204
GLAPI void GLAPIENTRY glClear(GLbitfield mask)
#define GL_LESS
Definition: SDL_opengl.h:320
const char * SDLTest_CommonUsage(SDLTest_CommonState *state)
Returns common usage information.
#define GL_COLOR_BUFFER_BIT
Definition: SDL_opengl.h:742
unsigned char GLubyte
Definition: SDL_opengl.h:183
#define SDL_atoi
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_LogSetPriority
#define NULL
Definition: begin_code.h:164
#define GL_MODELVIEW
Definition: SDL_opengl.h:271
GLint GLint GLsizei GLsizei GLsizei depth
Definition: SDL_opengl.h:1572
#define GL_RENDERER
Definition: SDL_opengl.h:714
GLAPI void GLAPIENTRY glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
GLAPI void GLAPIENTRY glLoadIdentity(void)
#define SDL_calloc
#define SDL_GL_MakeCurrent
GLAPI void GLAPIENTRY glMatrixMode(GLenum mode)
#define GL_VERTEX_ARRAY
Definition: SDL_opengl.h:228
GLuint color
GLAPI void GLAPIENTRY glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
General event structure.
Definition: SDL_events.h:525
#define GL_DEPTH_TEST
Definition: SDL_opengl.h:327
#define SDL_GL_GetAttribute
#define GL_SMOOTH
Definition: SDL_opengl.h:365
GLAPI void GLAPIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
Uint32 format
Definition: SDL_video.h:55
#define SDL_GL_DeleteContext
#define SDL_GetCurrentDisplayMode
#define GL_TRIANGLES
Definition: SDL_opengl.h:220
#define SDL_BITSPERPIXEL(X)
Definition: SDL_pixels.h:127
int main(int argc, char *argv[])
Definition: testgles.c:347
#define SDL_GL_SwapWindow
void SDLTest_CommonQuit(SDLTest_CommonState *state)
Close test window.
#define SDL_INIT_VIDEO
Definition: SDL.h:78
Uint32 type
Definition: SDL_events.h:527
GLAPI void GLAPIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
GLAPI const GLubyte *GLAPIENTRY glGetString(GLenum name)