18 #include <emscripten/emscripten.h> 23 #if defined(__IPHONEOS__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__NACL__) 24 #define HAVE_OPENGLES2 31 typedef struct GLES2_Context
33 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params; 34 #include "../src/render/opengles2/SDL_gles2funcs.h" 41 static int depth = 16;
42 static GLES2_Context ctx;
44 static int LoadContext(GLES2_Context *
data)
46 #if SDL_VIDEO_DRIVER_UIKIT 47 #define __SDL_NOGETPROCADDR__ 48 #elif SDL_VIDEO_DRIVER_ANDROID 49 #define __SDL_NOGETPROCADDR__ 50 #elif SDL_VIDEO_DRIVER_PANDORA 51 #define __SDL_NOGETPROCADDR__ 54 #if defined __SDL_NOGETPROCADDR__ 55 #define SDL_PROC(ret,func,params) data->func=func; 57 #define SDL_PROC(ret,func,params) \ 59 data->func = SDL_GL_GetProcAddress(#func); \ 60 if ( ! data->func ) { \ 61 return SDL_SetError("Couldn't load GLES2 function %s: %s\n", #func, SDL_GetError()); \ 66 #include "../src/render/opengles2/SDL_gles2funcs.h" 77 if (context !=
NULL) {
94 GLenum glError = ctx.glGetError(); \ 95 if(glError != GL_NO_ERROR) { \ 96 SDL_Log("glGetError() = %i (0x%.8x) at line %i\n", glError, glError, __LINE__); \ 106 rotate_matrix(
float angle,
float x,
float y,
float z,
float *
r)
108 float radians,
c,
s, c1, u[3],
length;
111 radians = (float)(angle * M_PI) / 180.0f;
118 length = (float)
SDL_sqrt(x * x + y * y + z * z);
124 for (i = 0; i < 16; i++) {
130 for (i = 0; i < 3; i++) {
131 r[i * 4 + (i + 1) % 3] = u[(i + 2) % 3] *
s;
132 r[i * 4 + (i + 2) % 3] = -u[(i + 1) % 3] *
s;
135 for (i = 0; i < 3; i++) {
136 for (j = 0; j < 3; j++) {
137 r[i * 4 +
j] += c1 * u[
i] * u[
j] + (i == j ? c : 0.0f);
146 perspective_matrix(
float fovy,
float aspect,
float znear,
float zfar,
float *r)
153 for (i = 0; i < 16; i++) {
159 r[10] = (znear + zfar) / (znear - zfar);
161 r[14] = (2.0f * znear * zfar) / (znear - zfar);
170 multiply_matrix(
float *lhs,
float *rhs,
float *r)
175 for (i = 0; i < 4; i++) {
176 for (j = 0; j < 4; j++) {
177 tmp[j * 4 +
i] = 0.0;
179 for (k = 0; k < 4; k++) {
180 tmp[j * 4 +
i] += lhs[k * 4 +
i] * rhs[j * 4 +
k];
185 for (i = 0; i < 16; i++) {
206 *shader = GL_CHECK(ctx.glCreateShader(shader_type));
210 GL_CHECK(ctx.glShaderSource(*shader, 1, shaders,
NULL));
216 GL_CHECK(ctx.glCompileShader(*shader));
221 ctx.glGetProgramInfoLog(*shader,
sizeof(buffer), &length, &buffer[0]);
223 SDL_Log(
"Shader compilation failed: %s", buffer);fflush(stderr);
230 const float _vertices[] =
288 const float _colors[] =
346 const char* _shader_vert_src =
347 " attribute vec4 av4position; " 348 " attribute vec3 av3color; " 349 " uniform mat4 mvp; " 350 " varying vec3 vv3color; " 352 " vv3color = av3color; " 353 " gl_Position = mvp * av4position; " 356 const char* _shader_frag_src =
357 " precision lowp float; " 358 " varying vec3 vv3color; " 360 " gl_FragColor = vec4(vv3color, 1.0); " 363 typedef struct shader_data
365 GLuint shader_program, shader_frag, shader_vert;
368 GLint attr_color, attr_mvp;
370 int angle_x, angle_y, angle_z;
377 float matrix_rotate[16], matrix_modelview[16], matrix_perspective[16], matrix_mvp[16];
383 rotate_matrix((
float)data->angle_x, 1.0f, 0.0f, 0.0f, matrix_modelview);
384 rotate_matrix((
float)data->angle_y, 0.0f, 1.0f, 0.0f, matrix_rotate);
386 multiply_matrix(matrix_rotate, matrix_modelview, matrix_modelview);
388 rotate_matrix((
float)data->angle_z, 0.0f, 1.0f, 0.0f, matrix_rotate);
390 multiply_matrix(matrix_rotate, matrix_modelview, matrix_modelview);
393 matrix_modelview[14] -= 2.5;
395 perspective_matrix(45.0f, (
float)width/height, 0.01f, 100.0f, matrix_perspective);
396 multiply_matrix(matrix_perspective, matrix_modelview, matrix_mvp);
398 GL_CHECK(ctx.glUniformMatrix4fv(data->attr_mvp, 1,
GL_FALSE, matrix_mvp));
404 if(data->angle_x >= 360) data->angle_x -= 360;
405 if(data->angle_x < 0) data->angle_x += 360;
406 if(data->angle_y >= 360) data->angle_y -= 360;
407 if(data->angle_y < 0) data->angle_y += 360;
408 if(data->angle_z >= 360) data->angle_z -= 360;
409 if(data->angle_z < 0) data->angle_z += 360;
428 switch (event.
type) {
442 ctx.glViewport(0, 0, w, h);
443 state->
window_w =
event.window.data1;
444 state->
window_h =
event.window.data2;
469 #ifdef __EMSCRIPTEN__ 471 emscripten_cancel_main_loop();
477 main(
int argc,
char *argv[])
496 for (i = 1; i < argc;) {
520 SDL_Log (
"Usage: %s %s [--fsaa] [--accel] [--zdepth %%d]\n", argv[0],
550 if (context ==
NULL) {
565 if (LoadContext(&ctx) < 0) {
566 SDL_Log(
"Could not load GLES2 functions\n");
590 SDL_Log(
"SDL_GL_RED_SIZE: requested %d, got %d\n", 5, value);
592 SDL_Log(
"Failed to get SDL_GL_RED_SIZE: %s\n",
597 SDL_Log(
"SDL_GL_GREEN_SIZE: requested %d, got %d\n", 5, value);
599 SDL_Log(
"Failed to get SDL_GL_GREEN_SIZE: %s\n",
604 SDL_Log(
"SDL_GL_BLUE_SIZE: requested %d, got %d\n", 5, value);
606 SDL_Log(
"Failed to get SDL_GL_BLUE_SIZE: %s\n",
611 SDL_Log(
"SDL_GL_DEPTH_SIZE: requested %d, got %d\n",
depth, value);
613 SDL_Log(
"Failed to get SDL_GL_DEPTH_SIZE: %s\n",
619 SDL_Log(
"SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
621 SDL_Log(
"Failed to get SDL_GL_MULTISAMPLEBUFFERS: %s\n",
626 SDL_Log(
"SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
629 SDL_Log(
"Failed to get SDL_GL_MULTISAMPLESAMPLES: %s\n",
636 SDL_Log(
"SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value);
638 SDL_Log(
"Failed to get SDL_GL_ACCELERATED_VISUAL: %s\n",
657 ctx.glViewport(0, 0, w, h);
660 data->angle_x = 0; data->angle_y = 0; data->angle_z = 0;
667 data->shader_program = GL_CHECK(ctx.glCreateProgram());
670 GL_CHECK(ctx.glAttachShader(data->shader_program, data->shader_vert));
671 GL_CHECK(ctx.glAttachShader(data->shader_program, data->shader_frag));
672 GL_CHECK(ctx.glLinkProgram(data->shader_program));
675 data->attr_position = GL_CHECK(ctx.glGetAttribLocation(data->shader_program,
"av4position"));
676 data->attr_color = GL_CHECK(ctx.glGetAttribLocation(data->shader_program,
"av3color"));
679 data->attr_mvp = GL_CHECK(ctx.glGetUniformLocation(data->shader_program,
"mvp"));
681 GL_CHECK(ctx.glUseProgram(data->shader_program));
684 GL_CHECK(ctx.glEnableVertexAttribArray(data->attr_position));
685 GL_CHECK(ctx.glEnableVertexAttribArray(data->attr_color));
688 GL_CHECK(ctx.glVertexAttribPointer(data->attr_position, 3,
GL_FLOAT,
GL_FALSE, 0, _vertices));
689 GL_CHECK(ctx.glVertexAttribPointer(data->attr_color, 3,
GL_FLOAT,
GL_FALSE, 0, _colors));
700 #ifdef __EMSCRIPTEN__ 701 emscripten_set_main_loop(
loop, 0, 1);
711 SDL_Log(
"%2.2f frames per second\n",
712 ((
double) frames * 1000) / (now - then));
714 #if !defined(__ANDROID__) && !defined(__NACL__) 725 SDL_Log(
"No OpenGL ES support on this system\n");
GLdouble GLdouble GLdouble r
GLint GLint GLsizei width
#define SDL_GL_CreateContext
#define GL_STENCIL_BUFFER_BIT
GLint GLint GLint GLint GLint x
#define GL_COMPILE_STATUS
SDLTest_CommonState * SDLTest_CommonCreateState(char **argv, Uint32 flags)
Parse command line parameters and create common state.
int SDLTest_CommonArg(SDLTest_CommonState *state, int index)
Process one common argument.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
The structure that defines a display mode.
#define GL_DEPTH_BUFFER_BIT
GLsizei GLsizei GLuint * shaders
uint32_t Uint32
An unsigned 32-bit integer type.
GLint GLint GLsizei GLsizei height
SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state)
Open test window.
#define SDL_GL_GetDrawableSize
void * SDL_calloc(size_t nmemb, size_t size)
void * SDL_GLContext
An opaque handle to an OpenGL context.
void SDLTest_CommonEvent(SDLTest_CommonState *state, SDL_Event *event, int *done)
Common event handler for test windows.
int gl_multisamplebuffers
GLint GLint GLint GLint GLint GLint y
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
GLsizei const GLfloat * value
#define SDL_GL_SetSwapInterval
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 int in j)
#define GL_FRAGMENT_SHADER
int gl_multisamplesamples
GLsizei GLsizei GLchar * source
const char * SDLTest_CommonUsage(SDLTest_CommonState *state)
Returns common usage information.
#define GL_COLOR_BUFFER_BIT
int main(int argc, char *argv[])
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)
GLint GLint GLsizei GLsizei GLsizei depth
#define SDL_GL_MakeCurrent
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 int int return Display Window Cursor return Display Window return Display Drawable GC int int unsigned int unsigned int return Display Drawable GC int int _Xconst char int return Display Drawable GC int int unsigned int unsigned int return Display return Display Cursor return Display GC return XModifierKeymap return char Display Window int return Display return Display Atom return Display Window XWindowAttributes return Display Window return Display XEvent Bool(*) XPointer return Display Window Bool unsigned int int int Window Cursor Time return Display Window int return KeySym return Display _Xconst char Bool return Display _Xconst char return XKeyEvent char int KeySym XComposeStatus return Display int int int XVisualInfo return Display Window int int return _Xconst char return Display XEvent return Display Drawable GC XImage int int int int unsigned int unsigned int return Display Window Window Window int int int int unsigned int return Display Window Window int int return Display Window unsigned int unsigned int return Display Window Bool long XEvent return Display GC unsigned long return Display Window int Time return Display Window Window return Display Window unsigned long return Display Window XSizeHints Display Colormap XColor int return char int XTextProperty return XFontStruct _Xconst char int int int int XCharStruct return Display Window return Display Time return Display Colormap return Display Window Window int int unsigned int unsigned int int int return Display Window int return XExtensionInfo Display char XExtensionHooks int XPointer return XExtensionInfo XExtensionInfo Display return Display return Display unsigned long Display GC Display char long Display xReply int Bool return Display Bool return Display int SDL_X11_XESetEventToWireRetType return Display Window Window Window Window unsigned int return Display XShmSegmentInfo return Display Drawable GC XImage int int int int unsigned int unsigned int Boo k)
#define SDL_GL_GetAttribute
GLubyte GLubyte GLubyte GLubyte w
#define SDL_GL_DeleteContext
GLuint GLsizei GLsizei * length
#define SDL_GetCurrentDisplayMode
#define SDL_BITSPERPIXEL(X)
#define SDL_GL_SwapWindow
void SDLTest_CommonQuit(SDLTest_CommonState *state)
Close test window.
GLfloat GLfloat GLfloat GLfloat h