Advertisement
Ancurio

threaded GL, fails at restoring EGL context

Dec 4th, 2014
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.86 KB | None | 0 0
  1.  
  2. #include <SDL.h>
  3. #include <GLES2/gl2.h>
  4.  
  5. #include <stdbool.h>
  6.  
  7. #ifdef __ANDROID__
  8. #  include <android/log.h>
  9. #  define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "glthreaded", s)
  10. #else
  11. #  define PRINT(s) fprintf(stderr, s "\n")
  12. #endif
  13.  
  14. struct ThreadData
  15. {
  16.     SDL_Window *win;
  17.     int winW, winH;
  18.     SDL_mutex *mut;
  19.     bool foreground;
  20.     bool running;
  21. };
  22.  
  23. void *threadFunction(struct ThreadData *d)
  24. {
  25.     SDL_GLContext glCtx = SDL_GL_CreateContext(d->win);
  26.  
  27.     glClearColor(0, 1.0, 1.0, 1.0);
  28.  
  29.     while (d->running)
  30.     {
  31.         SDL_LockMutex(d->mut);
  32.         glViewport(0, 0, d->winW, d->winH);
  33.         glClear(GL_COLOR_BUFFER_BIT);
  34.         SDL_GL_SwapWindow(d->win);
  35.         SDL_UnlockMutex(d->mut);
  36.  
  37.         SDL_Delay(16);
  38.     }
  39.  
  40.     SDL_GL_DeleteContext(glCtx);
  41. }
  42.  
  43. int eventFilter(struct ThreadData *d, SDL_Event *e)
  44. {
  45.     switch (e->type)
  46.     {
  47.     case SDL_APP_WILLENTERBACKGROUND :
  48.         if (d->foreground)
  49.         {
  50.             PRINT("About to enter background, sleeping render thread");
  51.             d->foreground = false;
  52.             SDL_LockMutex(d->mut);
  53.         }
  54.  
  55.         return 0;
  56.  
  57.     case SDL_APP_DIDENTERFOREGROUND :
  58.         if (!d->foreground)
  59.         {
  60.             PRINT("Did enter foreground,  waking up render thread");
  61.             d->foreground = true;
  62.             SDL_UnlockMutex(d->mut);
  63.         }
  64.  
  65.         return 0;
  66.  
  67.     default:
  68.         return 1;
  69.     }
  70. }
  71.  
  72. int main(int argc, char *argv[])
  73. {
  74.     struct ThreadData d;
  75.  
  76.     SDL_Init(SDL_INIT_VIDEO);
  77.  
  78.     SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
  79.     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
  80.     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
  81.  
  82.     d.win = SDL_CreateWindow("threaded gl",
  83.                              SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
  84.                              100, 100, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL);
  85.     SDL_GetWindowSize(d.win, &d.winW, &d.winH);
  86.  
  87.     d.mut = SDL_CreateMutex();
  88.     d.foreground = true;
  89.     d.running = true;
  90.  
  91.     SDL_SetEventFilter((SDL_EventFilter) eventFilter, &d);
  92.  
  93.     SDL_Thread *thread = SDL_CreateThread((SDL_ThreadFunction) threadFunction, "gl", &d);
  94.  
  95.     while (d.running)
  96.     {
  97.         SDL_Event e;
  98.         while (SDL_PollEvent(&e) > 0)
  99.         {
  100.             switch (e.type)
  101.             {
  102.             case SDL_QUIT :
  103.                 d.running = false;
  104.                 break;
  105.  
  106.             case SDL_WINDOWEVENT :
  107.                 if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
  108.                 {
  109.                     d.winW = e.window.data1;
  110.                     d.winH = e.window.data2;
  111.                     PRINT("Window size changed");
  112.                     break;
  113.                 }
  114.  
  115.             /* Just for testing on the desktop */
  116.             case SDL_KEYDOWN :
  117.                 if (e.key.keysym.scancode == SDL_SCANCODE_F1)
  118.                 {
  119.                     e.type = SDL_APP_WILLENTERBACKGROUND;
  120.                     SDL_PushEvent(&e);
  121.                     break;
  122.                 }
  123.  
  124.             case SDL_KEYUP :
  125.                 if (e.key.keysym.scancode == SDL_SCANCODE_F1)
  126.                 {
  127.                     e.type = SDL_APP_DIDENTERFOREGROUND;
  128.                     SDL_PushEvent(&e);
  129.                     break;
  130.                 }
  131.  
  132.             default:
  133.                 break;
  134.             }
  135.         }
  136.     }
  137.  
  138.     SDL_WaitThread(thread, 0);
  139.  
  140.     SDL_DestroyMutex(d.mut);
  141.     SDL_DestroyWindow(d.win);
  142.  
  143.     SDL_Quit();
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement