18 #include <emscripten/emscripten.h> 23 #if defined(__IPHONEOS__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__NACL__) \ 24 || defined(__WINDOWS__) || defined(__LINUX__) 25 #define HAVE_OPENGLES2 32 typedef struct GLES2_Context
34 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params; 35 #include "../src/render/opengles2/SDL_gles2funcs.h" 42 static int depth = 16;
43 static GLES2_Context
ctx;
45 static int LoadContext(GLES2_Context *
data)
47 #if SDL_VIDEO_DRIVER_UIKIT 48 #define __SDL_NOGETPROCADDR__ 49 #elif SDL_VIDEO_DRIVER_ANDROID 50 #define __SDL_NOGETPROCADDR__ 51 #elif SDL_VIDEO_DRIVER_PANDORA 52 #define __SDL_NOGETPROCADDR__ 55 #if defined __SDL_NOGETPROCADDR__ 56 #define SDL_PROC(ret,func,params) data->func=func; 58 #define SDL_PROC(ret,func,params) \ 60 data->func = SDL_GL_GetProcAddress(#func); \ 61 if ( ! data->func ) { \ 62 return SDL_SetError("Couldn't load GLES2 function %s: %s", #func, SDL_GetError()); \ 67 #include "../src/render/opengles2/SDL_gles2funcs.h" 95 GLenum glError = ctx.glGetError(); \ 96 if(glError != GL_NO_ERROR) { \ 97 SDL_Log("glGetError() = %i (0x%.8x) at line %i\n", glError, glError, __LINE__); \ 107 rotate_matrix(
float angle,
float x,
float y,
float z,
float *
r)
109 float radians,
c,
s, c1, u[3],
length;
112 radians = (float)(angle * M_PI) / 180.0f;
119 length = (float)
SDL_sqrt(x * x + y * y + z * z);
125 for (i = 0; i < 16; i++) {
131 for (i = 0; i < 3; i++) {
132 r[i * 4 + (i + 1) % 3] = u[(i + 2) % 3] *
s;
133 r[i * 4 + (i + 2) % 3] = -u[(i + 1) % 3] *
s;
136 for (i = 0; i < 3; i++) {
137 for (j = 0; j < 3; j++) {
138 r[i * 4 +
j] += c1 * u[
i] * u[
j] + (i == j ?
c : 0.0f);
147 perspective_matrix(
float fovy,
float aspect,
float znear,
float zfar,
float *r)
154 for (i = 0; i < 16; i++) {
160 r[10] = (znear + zfar) / (znear - zfar);
162 r[14] = (2.0f * znear * zfar) / (znear - zfar);
171 multiply_matrix(
float *lhs,
float *rhs,
float *r)
176 for (i = 0; i < 4; i++) {
177 for (j = 0; j < 4; j++) {
178 tmp[j * 4 +
i] = 0.0;
180 for (k = 0; k < 4; k++) {
181 tmp[j * 4 +
i] += lhs[k * 4 +
i] * rhs[j * 4 +
k];
186 for (i = 0; i < 16; i++) {
207 *shader = GL_CHECK(ctx.glCreateShader(shader_type));
211 GL_CHECK(ctx.glShaderSource(*shader, 1, shaders,
NULL));
217 GL_CHECK(ctx.glCompileShader(*shader));
222 ctx.glGetProgramInfoLog(*shader,
sizeof(buffer), &length, &buffer[0]);
224 SDL_Log(
"Shader compilation failed: %s", buffer);fflush(stderr);
231 const float _vertices[] =
289 const float _colors[] =
347 const char* _shader_vert_src =
348 " attribute vec4 av4position; " 349 " attribute vec3 av3color; " 350 " uniform mat4 mvp; " 351 " varying vec3 vv3color; " 353 " vv3color = av3color; " 354 " gl_Position = mvp * av4position; " 357 const char* _shader_frag_src =
358 " precision lowp float; " 359 " varying vec3 vv3color; " 361 " gl_FragColor = vec4(vv3color, 1.0); " 364 typedef struct shader_data
366 GLuint shader_program, shader_frag, shader_vert;
369 GLint attr_color, attr_mvp;
371 int angle_x, angle_y, angle_z;
378 float matrix_rotate[16], matrix_modelview[16], matrix_perspective[16], matrix_mvp[16];
384 rotate_matrix((
float)data->angle_x, 1.0f, 0.0f, 0.0f, matrix_modelview);
385 rotate_matrix((
float)data->angle_y, 0.0f, 1.0f, 0.0f, matrix_rotate);
387 multiply_matrix(matrix_rotate, matrix_modelview, matrix_modelview);
389 rotate_matrix((
float)data->angle_z, 0.0f, 1.0f, 0.0f, matrix_rotate);
391 multiply_matrix(matrix_rotate, matrix_modelview, matrix_modelview);
394 matrix_modelview[14] -= 2.5;
396 perspective_matrix(45.0f, (
float)width/height, 0.01f, 100.0f, matrix_perspective);
397 multiply_matrix(matrix_perspective, matrix_modelview, matrix_mvp);
399 GL_CHECK(ctx.glUniformMatrix4fv(data->attr_mvp, 1,
GL_FALSE, matrix_mvp));
405 if(data->angle_x >= 360) data->angle_x -= 360;
406 if(data->angle_x < 0) data->angle_x += 360;
407 if(data->angle_y >= 360) data->angle_y -= 360;
408 if(data->angle_y < 0) data->angle_y += 360;
409 if(data->angle_z >= 360) data->angle_z -= 360;
410 if(data->angle_z < 0) data->angle_z += 360;
429 switch (event.
type) {
443 ctx.glViewport(0, 0, w, h);
444 state->
window_w =
event.window.data1;
445 state->
window_h =
event.window.data2;
470 #ifdef __EMSCRIPTEN__ 472 emscripten_cancel_main_loop();
478 main(
int argc,
char *argv[])
497 for (i = 1; i < argc;) {
521 SDL_Log (
"Usage: %s %s [--fsaa] [--accel] [--zdepth %%d]\n", argv[0],
566 if (LoadContext(&ctx) < 0) {
567 SDL_Log(
"Could not load GLES2 functions\n");
591 SDL_Log(
"SDL_GL_RED_SIZE: requested %d, got %d\n", 5, value);
593 SDL_Log(
"Failed to get SDL_GL_RED_SIZE: %s\n",
598 SDL_Log(
"SDL_GL_GREEN_SIZE: requested %d, got %d\n", 5, value);
600 SDL_Log(
"Failed to get SDL_GL_GREEN_SIZE: %s\n",
605 SDL_Log(
"SDL_GL_BLUE_SIZE: requested %d, got %d\n", 5, value);
607 SDL_Log(
"Failed to get SDL_GL_BLUE_SIZE: %s\n",
612 SDL_Log(
"SDL_GL_DEPTH_SIZE: requested %d, got %d\n",
depth, value);
614 SDL_Log(
"Failed to get SDL_GL_DEPTH_SIZE: %s\n",
620 SDL_Log(
"SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
622 SDL_Log(
"Failed to get SDL_GL_MULTISAMPLEBUFFERS: %s\n",
627 SDL_Log(
"SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
630 SDL_Log(
"Failed to get SDL_GL_MULTISAMPLESAMPLES: %s\n",
637 SDL_Log(
"SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value);
639 SDL_Log(
"Failed to get SDL_GL_ACCELERATED_VISUAL: %s\n",
658 ctx.glViewport(0, 0, w, h);
661 data->angle_x = 0; data->angle_y = 0; data->angle_z = 0;
668 data->shader_program = GL_CHECK(ctx.glCreateProgram());
671 GL_CHECK(ctx.glAttachShader(data->shader_program, data->shader_vert));
672 GL_CHECK(ctx.glAttachShader(data->shader_program, data->shader_frag));
673 GL_CHECK(ctx.glLinkProgram(data->shader_program));
676 data->attr_position = GL_CHECK(ctx.glGetAttribLocation(data->shader_program,
"av4position"));
677 data->attr_color = GL_CHECK(ctx.glGetAttribLocation(data->shader_program,
"av3color"));
680 data->attr_mvp = GL_CHECK(ctx.glGetUniformLocation(data->shader_program,
"mvp"));
682 GL_CHECK(ctx.glUseProgram(data->shader_program));
685 GL_CHECK(ctx.glEnableVertexAttribArray(data->attr_position));
686 GL_CHECK(ctx.glEnableVertexAttribArray(data->attr_color));
689 GL_CHECK(ctx.glVertexAttribPointer(data->attr_position, 3,
GL_FLOAT,
GL_FALSE, 0, _vertices));
690 GL_CHECK(ctx.glVertexAttribPointer(data->attr_color, 3,
GL_FLOAT,
GL_FALSE, 0, _colors));
701 #ifdef __EMSCRIPTEN__ 702 emscripten_set_main_loop(
loop, 0, 1);
712 SDL_Log(
"%2.2f frames per second\n",
713 ((
double) frames * 1000) / (now - then));
715 #if !defined(__ANDROID__) && !defined(__NACL__) 726 SDL_Log(
"No OpenGL ES support on this system\n");
GLdouble GLdouble GLdouble r
#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.
GLfloat GLfloat GLfloat GLfloat h
int SDLTest_CommonArg(SDLTest_CommonState *state, int index)
Process one common argument.
static screen_context_t context
The structure that defines a display mode.
#define GL_DEPTH_BUFFER_BIT
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei GLsizei GLuint * shaders
SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state)
Open test window.
GLint GLint GLsizei width
#define SDL_GL_GetDrawableSize
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
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#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
GLubyte GLubyte GLubyte GLubyte w
GLsizei const GLfloat * value
int gl_multisamplesamples
GLsizei GLsizei GLchar * source
GLint GLint GLint GLint GLint GLint y
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
GLint GLint GLsizei GLsizei height
#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
#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.