actuallyu free gl context//terminate on last gl window gone.
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 22 Mar 2010 05:33:20 +0000 (05:33 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 22 Mar 2010 05:33:20 +0000 (05:33 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@47361 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/modules/engines/gl_x11/evas_engine.c
src/modules/engines/gl_x11/evas_x_main.c

index 6fbcbe3..ad61126 100644 (file)
@@ -308,7 +308,6 @@ eng_output_free(void *data)
    re = (Render_Engine *)data;
    
 //   if (re->xrdb) XrmDestroyDatabase(re->xrdb);
-   
    eng_window_free(re->win);
    free(re);
 
index 09b28e4..63e63be 100644 (file)
@@ -20,6 +20,8 @@ static XVisualInfo *_evas_gl_x11_rgba_vi = NULL;
 static Colormap     _evas_gl_x11_cmap = 0;
 static Colormap     _evas_gl_x11_rgba_cmap = 0;
 
+static int win_count = 0;
+
 Evas_GL_X11_Window *
 eng_window_new(Display *disp,
               Window   win,
@@ -260,14 +262,14 @@ eng_window_new(Display *disp,
              if (!glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, 
                                         gw->context))
                {
-                  printf("Error: glXMakeContextCurrent(%p, %p, %p, %p)\n", gw->disp, gw->win, gw->win, gw->context);
+                  printf("Error: glXMakeContextCurrent(%p, %p, %p, %p)\n", (void *)gw->disp, (void *)gw->win, (void *)gw->win, (void *)gw->context);
                }
           }
         else
           {
              if (!glXMakeCurrent(gw->disp, gw->win, gw->context))
                {
-                  printf("Error: glXMakeCurrent(%p, 0x%x, %p) failed\n", gw->disp, gw->win, gw->context);
+                  printf("Error: glXMakeCurrent(%p, 0x%x, %p) failed\n", (void *)gw->disp, (unsigned int)gw->win, (void *)gw->context);
                }
           }
         
@@ -381,21 +383,36 @@ eng_window_new(Display *disp,
      }
    evas_gl_common_context_use(gw->gl_context);
    evas_gl_common_context_resize(gw->gl_context, w, h);
+   win_count++;
    return gw;
 }
 
 void
 eng_window_free(Evas_GL_X11_Window *gw)
 {
+   win_count--;
    if (gw == _evas_gl_x11_window) _evas_gl_x11_window = NULL;
    evas_gl_common_context_free(gw->gl_context);
 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
    if (gw->egl_surface[0] != EGL_NO_SURFACE)
      eglDestroySurface(gw->egl_disp, gw->egl_surface[0]);
+   if (win_count == 0)
+     {
+        if (context) eglDestroyContext(gw->disp, context);
+        eglTerminate(gw->disp);
+        context = EGL_NO_CONTEXT;
+     }
 #else
    if (gw->glxwin) glXDestroyWindow(gw->disp, gw->glxwin);
-   // FIXME: refcount context   
-   //   glXDestroyContext(gw->disp, gw->context);
+   if (win_count == 0)
+     {
+        if (context) glXDestroyContext(gw->disp, context);
+        if (rgba_context) glXDestroyContext(gw->disp, rgba_context);
+        context = 0;
+        rgba_context = 0;
+        fbconf = 0;
+        rgba_fbconf = 0;
+     }
 #endif
    free(gw);
 }
@@ -424,14 +441,14 @@ eng_window_use(Evas_GL_X11_Window *gw)
              if (!glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, 
                                         gw->context))
                {
-                  printf("Error: glXMakeContextCurrent(%p, %p, %p, %p)\n", gw->disp, gw->win, gw->win, gw->context);
+                  printf("Error: glXMakeContextCurrent(%p, %p, %p, %p)\n", (void *)gw->disp, (void *)gw->win, (void *)gw->win, (void *)gw->context);
                }
           }
         else
           {
              if (!glXMakeCurrent(gw->disp, gw->win, gw->context))
                {
-                  printf("Error: glXMakeCurrent(%p, 0x%x, %p) failed\n", gw->disp, gw->win, gw->context);
+                  printf("Error: glXMakeCurrent(%p, 0x%x, %p) failed\n", gw->disp, (unsigned int)gw->win, (void *)gw->context);
                }
           }
 #endif