Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SDL.h>
- #include <GLES2/gl2.h>
- #include <stdbool.h>
- #ifdef __ANDROID__
- # include <android/log.h>
- # define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "glthreaded", s)
- #else
- # define PRINT(s) fprintf(stderr, s "\n")
- #endif
- struct ThreadData
- {
- SDL_Window *win;
- int winW, winH;
- SDL_mutex *mut;
- bool foreground;
- bool running;
- };
- void *threadFunction(struct ThreadData *d)
- {
- SDL_GLContext glCtx = SDL_GL_CreateContext(d->win);
- glClearColor(0, 1.0, 1.0, 1.0);
- while (d->running)
- {
- SDL_LockMutex(d->mut);
- glViewport(0, 0, d->winW, d->winH);
- glClear(GL_COLOR_BUFFER_BIT);
- SDL_GL_SwapWindow(d->win);
- SDL_UnlockMutex(d->mut);
- SDL_Delay(16);
- }
- SDL_GL_DeleteContext(glCtx);
- }
- int eventFilter(struct ThreadData *d, SDL_Event *e)
- {
- switch (e->type)
- {
- case SDL_APP_WILLENTERBACKGROUND :
- if (d->foreground)
- {
- PRINT("About to enter background, sleeping render thread");
- d->foreground = false;
- SDL_LockMutex(d->mut);
- }
- return 0;
- case SDL_APP_DIDENTERFOREGROUND :
- if (!d->foreground)
- {
- PRINT("Did enter foreground, waking up render thread");
- d->foreground = true;
- SDL_UnlockMutex(d->mut);
- }
- return 0;
- default:
- return 1;
- }
- }
- int main(int argc, char *argv[])
- {
- struct ThreadData d;
- SDL_Init(SDL_INIT_VIDEO);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
- d.win = SDL_CreateWindow("threaded gl",
- SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
- 100, 100, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL);
- SDL_GetWindowSize(d.win, &d.winW, &d.winH);
- d.mut = SDL_CreateMutex();
- d.foreground = true;
- d.running = true;
- SDL_SetEventFilter((SDL_EventFilter) eventFilter, &d);
- SDL_Thread *thread = SDL_CreateThread((SDL_ThreadFunction) threadFunction, "gl", &d);
- while (d.running)
- {
- SDL_Event e;
- while (SDL_PollEvent(&e) > 0)
- {
- switch (e.type)
- {
- case SDL_QUIT :
- d.running = false;
- break;
- case SDL_WINDOWEVENT :
- if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
- {
- d.winW = e.window.data1;
- d.winH = e.window.data2;
- PRINT("Window size changed");
- break;
- }
- /* Just for testing on the desktop */
- case SDL_KEYDOWN :
- if (e.key.keysym.scancode == SDL_SCANCODE_F1)
- {
- e.type = SDL_APP_WILLENTERBACKGROUND;
- SDL_PushEvent(&e);
- break;
- }
- case SDL_KEYUP :
- if (e.key.keysym.scancode == SDL_SCANCODE_F1)
- {
- e.type = SDL_APP_DIDENTERFOREGROUND;
- SDL_PushEvent(&e);
- break;
- }
- default:
- break;
- }
- }
- }
- SDL_WaitThread(thread, 0);
- SDL_DestroyMutex(d.mut);
- SDL_DestroyWindow(d.win);
- SDL_Quit();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement