EvasGL: Add feature to set EvasGL error state 16/53916/4
authorDaeKwang Ryu <dkdk.ryu@samsung.com>
Thu, 10 Dec 2015 07:12:19 +0000 (16:12 +0900)
committerDaeKwang Ryu <dkdk.ryu@samsung.com>
Thu, 10 Dec 2015 08:43:52 +0000 (17:43 +0900)
refered to GL_X11 backend.

Change-Id: I783353163341cb5e1274036a2d89b7f62030b137

src/modules/evas/engines/wayland_egl/evas_engine.c

index 903c52d..8c97c8d 100755 (executable)
@@ -306,7 +306,12 @@ evgl_eng_native_window_create(void *data)
    Render_Engine *re;
    Outbuf *ob;
 
-   if (!(re = (Render_Engine *)data)) return NULL;
+   if (!(re = (Render_Engine *)data))
+     {
+        ERR("Invalid Render Engine Data!");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_NOT_INITIALIZED);
+        return NULL;
+     }
    if (!(ob = eng_get_ob(re))) return NULL;
 
    if (!(surface = calloc(1, sizeof(Evgl_wl_Surface))))
@@ -315,14 +320,17 @@ evgl_eng_native_window_create(void *data)
    if (!surface->wl_surf)
      {
         ERR("Could not create wl_surface: %m");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_DISPLAY);
         return NULL;
      }
    surface->egl_win = wl_egl_window_create(surface->wl_surf, 1, 1);
    if (!surface->egl_win)
      {
         ERR("Could not create wl_egl window: %m");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_DISPLAY);
         return NULL;
      }
+
    return (void *)surface;
 }
 
@@ -331,7 +339,13 @@ evgl_eng_native_window_destroy(void *data, void *win)
 {
    Evgl_wl_Surface* surface;
 
-   if (!win) return 0;
+   if (!win)
+     {
+        ERR("Inavlid native window.");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_NATIVE_WINDOW);
+        return 0;
+     }
+
    surface = (Evgl_wl_Surface*)win;
    if (surface->egl_win)
      wl_egl_window_destroy((struct wl_egl_window *)surface->egl_win);
@@ -350,7 +364,12 @@ evgl_eng_window_surface_create(void *data, void *win)
    EGLSurface surface = EGL_NO_SURFACE;
    Evgl_wl_Surface* evgl_surface;
 
-   if (!(re = (Render_Engine *)data)) return NULL;
+   if (!(re = (Render_Engine *)data))
+     {
+        ERR("Invalid Render Engine Data!");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_NOT_INITIALIZED);
+        return NULL;
+     }
    if (!(ob = eng_get_ob(re))) return NULL;
    if (!(evgl_surface = (Evgl_wl_Surface *)win)) return NULL;
    if (!(evgl_surface->egl_win)) return NULL;
@@ -372,10 +391,20 @@ evgl_eng_window_surface_destroy(void *data, void *surface)
    Render_Engine *re;
    Outbuf *ob;
 
-   if (!(re = (Render_Engine *)data)) return 0;
+   if (!(re = (Render_Engine *)data))
+     {
+        ERR("Invalid Render Engine Data!");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_NOT_INITIALIZED);
+        return 0;
+     }
    if (!(ob = eng_get_ob(re))) return 0;
-   if (!surface) return 0;
 
+   if (!surface)
+     {
+        ERR("Invalid surface.");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_SURFACE);
+        return 0;
+     }
    eglDestroySurface(ob->egl_disp, (EGLSurface)surface);
    return 1;
 }
@@ -473,9 +502,19 @@ evgl_eng_context_destroy(void *data, void *ctxt)
    Render_Engine *re;
    Outbuf *ob;
 
-   if (!(re = (Render_Engine *)data)) return 0;
+   if (!(re = (Render_Engine *)data))
+     {
+        ERR("Invalid Render Input Data. Engine: %p", data);
+        glsym_evas_gl_common_error_set(data, EVAS_GL_NOT_INITIALIZED);
+        return 0;
+     }
    if (!(ob = eng_get_ob(re))) return 0;
-   if (!ctxt) return 0;
+   if (!ctxt)
+     {
+        ERR("Invalid Render Input Data. Context: %p", ctxt);
+        glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_CONTEXT);
+        return 0;
+     }
 
    eglDestroyContext(ob->egl_disp, (EGLContext)ctxt);
    return 1;
@@ -490,7 +529,12 @@ evgl_eng_make_current(void *data, void *surface, void *ctxt, int flush)
    EGLSurface surf;
    int ret = 0;
 
-   if (!(re = (Render_Engine *)data)) return 0;
+   if (!(re = (Render_Engine *)data))
+     {
+        ERR("Invalid Render Engine Data!");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_NOT_INITIALIZED);
+        return 0;
+     }
    if (!(ob = eng_get_ob(re))) return 0;
 
    ctx = (EGLContext)ctxt;
@@ -503,7 +547,9 @@ evgl_eng_make_current(void *data, void *surface, void *ctxt, int flush)
                          EGL_NO_SURFACE, EGL_NO_CONTEXT);
         if (!ret)
           {
-             ERR("eglMakeCurrent Failed: %#x", eglGetError());
+             int err = eglGetError();
+             glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
+             ERR("eglMakeCurrent() failed! Error Code=%#x", err);
              return 0;
           }
         return 1;
@@ -518,7 +564,9 @@ evgl_eng_make_current(void *data, void *surface, void *ctxt, int flush)
         ret = eglMakeCurrent(ob->egl_disp, surf, surf, ctx);
         if (!ret)
           {
-             ERR("eglMakeCurrent Failed: %#x", eglGetError());
+             int err = eglGetError();
+             glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
+             ERR("eglMakeCurrent() failed! Error Code=%#x", err);
              return 0;
           }
      }
@@ -539,7 +587,12 @@ evgl_eng_string_get(void *data)
    Render_Engine *re;
    Outbuf *ob;
 
-   if (!(re = (Render_Engine *)data)) return NULL;
+   if (!(re = (Render_Engine *)data))
+     {
+        ERR("Invalid Render Engine Data!");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_NOT_INITIALIZED);
+        return NULL;
+     }
    if (!(ob = eng_get_ob(re))) return NULL;
 
    return eglQueryString(ob->egl_disp, EGL_EXTENSIONS);
@@ -551,13 +604,22 @@ evgl_eng_rotation_angle_get(void *data)
    Render_Engine *re;
    Outbuf *ob;
 
-   if (!(re = (Render_Engine *)data)) return 0;
+   if (!(re = (Render_Engine *)data))
+     {
+        ERR("Invalid Render Engine Data!");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_NOT_INITIALIZED);
+        return 0;
+     }
    if (!(ob = eng_get_ob(re))) return 0;
 
    if (ob->gl_context)
      return ob->gl_context->rot;
-
-   return 0;
+   else
+     {
+        ERR("Unable to retrieve rotation angle.");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_CONTEXT);
+        return 0;
+     }
 }
 
 static void *
@@ -1092,6 +1154,20 @@ eng_gl_current_context_get(void *data EINA_UNUSED)
 #endif
 }
 
+static int
+eng_gl_error_get(void *data)
+{
+   int err;
+
+   if ((err = glsym_evas_gl_common_error_get(data)) != EVAS_GL_SUCCESS)
+     goto end;
+
+   err = eglGetError() - EGL_SUCCESS;
+
+end:
+   glsym_evas_gl_common_error_set(data, EVAS_GL_SUCCESS);
+   return err;
+}
 
 static void
 _native_cb_bind(void *data EINA_UNUSED, void *image)
@@ -1188,11 +1264,15 @@ _native_cb_free(void *data, void *image)
         eina_hash_del(ob->gl_context->shared->native_wl_hash, &wlid, img);
         if (n->egl_surface)
           {
+             int err;
              if (glsym_eglDestroyImage)
                {
                   glsym_eglDestroyImage(ob->egl_disp, n->egl_surface);
-                  if (eglGetError() != EGL_SUCCESS)
-                    ERR("eglDestroyImage() failed.");
+                  if ((err = eglGetError()) != EGL_SUCCESS)
+                    {
+                       ERR("eglDestroyImage() failed.");
+                       glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
+                    }
                }
              else
                ERR("Try eglDestroyImage on EGL with  no support");
@@ -1577,6 +1657,7 @@ module_open(Evas_Module *em)
    ORD(image_native_set);
 
    ORD(gl_current_context_get);
+   ORD(gl_error_get);
 
    gl_symbols();