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
uint32_t Uint32
An unsigned 32-bit integer type.
#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
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
#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
#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
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)