SDL  2.0
testgles.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 1997-2020 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 
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 */
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  static const char *options[] = { "[--fsaa]", "[--accel]", "[--zdepth %d]", NULL };
150  SDLTest_CommonLogUsage(state, argv[0], options);
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;
164  state->gl_profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
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 
191  if (state->render_flags & SDL_RENDERER_PRESENTVSYNC) {
193  } else {
195  }
196 
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 
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  }
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  }
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  }
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  }
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: */
SDL_BITSPERPIXEL
#define SDL_BITSPERPIXEL(X)
Definition: SDL_pixels.h:127
SDL_GetError
#define SDL_GetError
Definition: SDL_dynapi_overrides.h:113
GL_EXTENSIONS
#define GL_EXTENSIONS
Definition: SDL_opengl.h:716
GL_TRIANGLES
#define GL_TRIANGLES
Definition: SDL_opengl.h:220
SDL_GL_MULTISAMPLESAMPLES
@ SDL_GL_MULTISAMPLESAMPLES
Definition: SDL_video.h:213
SDL_PollEvent
#define SDL_PollEvent
Definition: SDL_dynapi_overrides.h:122
glGetString
GLAPI const GLubyte *GLAPIENTRY glGetString(GLenum name)
NULL
#define NULL
Definition: begin_code.h:167
glDepthFunc
GLAPI void GLAPIENTRY glDepthFunc(GLenum func)
GL_RENDERER
#define GL_RENDERER
Definition: SDL_opengl.h:714
SDL_GL_DEPTH_SIZE
@ SDL_GL_DEPTH_SIZE
Definition: SDL_video.h:205
SDLTest_CommonState
Definition: SDL_test_common.h:52
glClear
GLAPI void GLAPIENTRY glClear(GLbitfield mask)
mode
GLenum mode
Definition: SDL_opengl_glext.h:1125
main
int main(int argc, char *argv[])
Definition: testgles.c:347
glRotatef
GLAPI void GLAPIENTRY glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
SDL_GetWindowID
#define SDL_GetWindowID
Definition: SDL_dynapi_overrides.h:516
GL_VENDOR
#define GL_VENDOR
Definition: SDL_opengl.h:713
SDL_GL_CreateContext
#define SDL_GL_CreateContext
Definition: SDL_dynapi_overrides.h:559
SDL_WINDOW_OPENGL
@ SDL_WINDOW_OPENGL
Definition: SDL_video.h:100
SDL_WINDOWEVENT_RESIZED
@ SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:154
indices
GLuint GLuint GLsizei GLenum const GLvoid * indices
Definition: SDL_opengl.h:1571
GL_COLOR_BUFFER_BIT
#define GL_COLOR_BUFFER_BIT
Definition: SDL_opengl.h:742
GL_LESS
#define GL_LESS
Definition: SDL_opengl.h:320
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:203
glShadeModel
GLAPI void GLAPIENTRY glShadeModel(GLenum mode)
GLubyte
unsigned char GLubyte
Definition: SDL_opengl.h:183
glClearColor
GLAPI void GLAPIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
SDL_opengles.h
SDL_LogError
#define SDL_LogError
Definition: SDL_dynapi_overrides.h:36
SDL_WINDOW_RESIZABLE
@ SDL_WINDOW_RESIZABLE
Definition: SDL_video.h:104
SDLTest_CommonCreateState
SDLTest_CommonState * SDLTest_CommonCreateState(char **argv, Uint32 flags)
Parse command line parameters and create common state.
Definition: SDL_test_common.c:59
SDL_DisplayMode
The structure that defines a display mode.
Definition: SDL_video.h:54
GL_VERSION
#define GL_VERSION
Definition: SDL_opengl.h:715
SDL_strcasecmp
#define SDL_strcasecmp
Definition: SDL_dynapi_overrides.h:419
SDLTest_CommonQuit
void SDLTest_CommonQuit(SDLTest_CommonState *state)
Close test window.
Definition: SDL_test_common.c:1910
SDL_GLContext
void * SDL_GLContext
An opaque handle to an OpenGL context.
Definition: SDL_video.h:192
GL_COLOR_ARRAY
#define GL_COLOR_ARRAY
Definition: SDL_opengl.h:230
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2652
glVertexPointer
GLAPI void GLAPIENTRY glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
GL_PROJECTION
#define GL_PROJECTION
Definition: SDL_opengl.h:272
done
int done
Definition: checkkeys.c:28
GL_DEPTH_BUFFER_BIT
#define GL_DEPTH_BUFFER_BIT
Definition: SDL_opengl.h:736
context
static screen_context_t context
Definition: video.c:25
SDL_GL_GREEN_SIZE
@ SDL_GL_GREEN_SIZE
Definition: SDL_video.h:200
GL_SMOOTH
#define GL_SMOOTH
Definition: SDL_opengl.h:365
quit
void quit(int rc)
Definition: teststreaming.c:64
GL_VERTEX_ARRAY
#define GL_VERTEX_ARRAY
Definition: SDL_opengl.h:228
color
GLuint color
Definition: SDL_opengl_glext.h:1151
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_test_common.h
glLoadIdentity
GLAPI void GLAPIENTRY glLoadIdentity(void)
SDL_LOG_CATEGORY_APPLICATION
@ SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
glViewport
GLAPI void GLAPIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
SDL_RENDERER_PRESENTVSYNC
@ SDL_RENDERER_PRESENTVSYNC
Definition: SDL_render.h:69
SDLTest_CommonArg
int SDLTest_CommonArg(SDLTest_CommonState *state, int index)
Process one common argument.
Definition: SDL_test_common.c:117
SDL_GL_ACCELERATED_VISUAL
@ SDL_GL_ACCELERATED_VISUAL
Definition: SDL_video.h:214
GL_DEPTH_TEST
#define GL_DEPTH_TEST
Definition: SDL_opengl.h:327
SDL_GL_CONTEXT_PROFILE_ES
@ SDL_GL_CONTEXT_PROFILE_ES
Definition: SDL_video.h:232
glColorPointer
GLAPI void GLAPIENTRY glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
SDL_GetTicks
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDLTest_CommonLogUsage
void SDLTest_CommonLogUsage(SDLTest_CommonState *state, const char *argv0, const char **options)
Logs command line usage info.
Definition: SDL_test_common.c:498
SDL_GL_SetSwapInterval
#define SDL_GL_SetSwapInterval
Definition: SDL_dynapi_overrides.h:564
depth
GLint GLint GLsizei GLsizei GLsizei depth
Definition: SDL_opengl.h:1572
SDL_GL_BLUE_SIZE
@ SDL_GL_BLUE_SIZE
Definition: SDL_video.h:201
SDL_calloc
#define SDL_calloc
Definition: SDL_dynapi_overrides.h:375
SDL_atoi
#define SDL_atoi
Definition: SDL_dynapi_overrides.h:410
SDLTest_CommonInit
SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state)
Open test window.
Definition: SDL_test_common.c:835
SDL_INIT_VIDEO
#define SDL_INIT_VIDEO
Definition: SDL.h:80
SDL_LOG_PRIORITY_INFO
@ SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
frames
static Uint32 frames
Definition: testsprite2.c:40
GL_MODELVIEW
#define GL_MODELVIEW
Definition: SDL_opengl.h:271
SDL_LogSetPriority
#define SDL_LogSetPriority
Definition: SDL_dynapi_overrides.h:236
glEnableClientState
GLAPI void GLAPIENTRY glEnableClientState(GLenum cap)
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:701
SDL_GL_MULTISAMPLEBUFFERS
@ SDL_GL_MULTISAMPLEBUFFERS
Definition: SDL_video.h:212
glMatrixMode
GLAPI void GLAPIENTRY glMatrixMode(GLenum mode)
SDL_GL_MakeCurrent
#define SDL_GL_MakeCurrent
Definition: SDL_dynapi_overrides.h:560
SDL_GL_GetAttribute
#define SDL_GL_GetAttribute
Definition: SDL_dynapi_overrides.h:558
SDL_GetCurrentDisplayMode
#define SDL_GetCurrentDisplayMode
Definition: SDL_dynapi_overrides.h:508
SDL_Event
General event structure.
Definition: SDL_events.h:559
SDL_WINDOWEVENT
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
SDL_GL_SwapWindow
#define SDL_GL_SwapWindow
Definition: SDL_dynapi_overrides.h:566
SDL_GL_RED_SIZE
@ SDL_GL_RED_SIZE
Definition: SDL_video.h:199
SDLTest_CommonEvent
void SDLTest_CommonEvent(SDLTest_CommonState *state, SDL_Event *event, int *done)
Common event handler for test windows.
Definition: SDL_test_common.c:1579
glDrawElements
GLAPI void GLAPIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
state
struct xkb_state * state
Definition: SDL_waylandsym.h:114
GL_UNSIGNED_BYTE
#define GL_UNSIGNED_BYTE
Definition: SDL_opengl.h:204
SDL_GL_DeleteContext
#define SDL_GL_DeleteContext
Definition: SDL_dynapi_overrides.h:567
i
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
GLfloat
float GLfloat
Definition: SDL_opengl.h:187
GL_FLOAT
#define GL_FLOAT
Definition: SDL_opengl.h:209
glEnable
GLAPI void GLAPIENTRY glEnable(GLenum cap)
SDL_WINDOW_BORDERLESS
@ SDL_WINDOW_BORDERLESS
Definition: SDL_video.h:103