[SDL_Tizen] Block indicator on multi thread 13/106913/1
authorhuiyu.eun <huiyu.eun@samsung.com>
Fri, 23 Dec 2016 14:29:07 +0000 (23:29 +0900)
committerhuiyu.eun <huiyu.eun@samsung.com>
Fri, 23 Dec 2016 14:43:15 +0000 (23:43 +0900)
occure indicator error on multi thread

Change-Id: I39296fb4aabfdd4ba32dd85561b0b4ebb373546a
Signed-off-by: huiyu.eun <huiyu.eun@samsung.com>
src/video/tizen/SDL_tizenindicator.c
src/video/tizen/SDL_tizenopengles.c
src/video/tizen/SDL_tizenwindow.h

index 2a08f40..c2554a2 100644 (file)
@@ -312,7 +312,7 @@ SDL_bool Tizen_isTouchIndicator(SDL_Window *window, SDL_WindowData *wind, int ro
 int Tizen_Indicator_GLES_Init(SDL_Window* window)
 {
     SDL_WindowData *wind = window->driverdata;
-    if(wind->init_indicator) return 0;
+    if(!wind->need_indicator) return 0;
 
     int screen_w, screen_h;
     ecore_wl_screen_size_get(&screen_w, &screen_h);
@@ -417,17 +417,13 @@ int Tizen_Indicator_GLES_Init(SDL_Window* window)
     ecore_main_loop_iterate();
     Tizen_IndicatorProcessEvent(window, wind->rotation);
 
-    wind->init_indicator = SDL_TRUE;
+    wind->need_indicator = SDL_FALSE;
     return 1;
 }
 
 void Tizen_DrawIndicator(SDL_Window *window)
 {
     SDL_WindowData* wdata = (SDL_WindowData*)window->driverdata;
-    if (wdata->received_rotation == 1) {
-        ecore_wl_window_rotation_change_done_send(wdata->window);
-        wdata->received_rotation = 0;
-    }
     if(!(window->flags & SDL_WINDOW_FULLSCREEN) && !(window->flags & SDL_WINDOW_BORDERLESS) && wdata->indicator_show)
     {
         if(wdata->last_indicator_showtime + 3000 < SDL_GetTicks())
index d2211e8..a1f3264 100755 (executable)
@@ -54,14 +54,22 @@ Tizen_GLES_LoadLibrary(_THIS, const char *path)
 SDL_GLContext
 Tizen_GLES_CreateContext(_THIS, SDL_Window *window)
 {
-    SDL_GLContext context;
+    SDL_GLContext context = SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
+    SDL_VideoData *data = (SDL_VideoData *) (SDL_GetVideoDevice()->driverdata);
+    SDL_WindowData *wind = window->driverdata;
+    wind->need_indicator = SDL_TRUE;//Init
 
-    context = SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
+    if(data->current_thread != SDL_GetThreadID(0))
+    {
+        wind->need_indicator = SDL_FALSE;
+        return context;
+    }
 
     if(!(window->flags & SDL_WINDOW_FULLSCREEN) && !(window->flags & SDL_WINDOW_BORDERLESS))
     {
         if(!Tizen_Indicator_GLES_Init(window))
         {
+            wind->need_indicator = SDL_FALSE;//Fail
             SDL_LogError(SDL_LOG_CATEGORY_ASSERT, "Indicator GLES init error!");
         }
     }
@@ -73,12 +81,22 @@ void
 Tizen_GLES_SwapWindow(_THIS, SDL_Window *window)
 {
     SDL_WindowData* wdata = (SDL_WindowData*)window->driverdata;
-    if(!(window->flags & SDL_WINDOW_FULLSCREEN) && !(window->flags & SDL_WINDOW_BORDERLESS) && !wdata->init_indicator)
+    if(!(window->flags & SDL_WINDOW_FULLSCREEN) && !(window->flags & SDL_WINDOW_BORDERLESS) && wdata->need_indicator)
     {
-        Tizen_Indicator_GLES_Init(window);
+        if(!Tizen_Indicator_GLES_Init(window))
+        {
+            wdata->need_indicator = SDL_FALSE;//Fail
+            SDL_LogError(SDL_LOG_CATEGORY_ASSERT, "Indicator GLES init error!");
+        }
     }
 
     Tizen_DrawIndicator(window);
+
+    if (wdata->received_rotation == 1) {
+        ecore_wl_window_rotation_change_done_send(wdata->window);
+        wdata->received_rotation = 0;
+    }
+
     SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
 }
 
index 249e7cb..d523c34 100755 (executable)
@@ -50,7 +50,7 @@ typedef struct {
     int received_rotation;
     void *indicator_timer;
 
-    SDL_bool init_indicator;
+    SDL_bool need_indicator;
     SDL_bool indicator_show;
     Uint32 last_indicator_showtime;