gles - update on t2pixmap
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 29 Jan 2010 05:32:51 +0000 (05:32 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 29 Jan 2010 05:32:51 +0000 (05:32 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@45681 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/modules/engines/gl_x11/evas_engine.c

index fa17fc4..fb0842e 100644 (file)
 #endif
 
 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
-void (*glsym_eglBindTexImage) (EGLDisplay a, EGLSurface b, int c) = NULL;
-void (*glsym_eglReleaseTexImage) (EGLDisplay a, EGLSurface b, int c) = NULL;
+
+#ifndef EGL_NATIVE_PIXMAP_KHR
+# define EGL_NATIVE_PIXMAP_KHR 0x30b0
+#endif
+typedef void (*_eng_fn) (void);
+
+_eng_fn  (*glsym_eglGetProcAddress)            (const char *a) = NULL;
+void     (*glsym_eglBindTexImage)              (EGLDisplay a, EGLSurface b, int c) = NULL;
+void     (*glsym_eglReleaseTexImage)           (EGLDisplay a, EGLSurface b, int c) = NULL;
+void    *(*glsym_eglCreateImage)               (EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e) = NULL;
+void     (*glsym_eglDestroyImage)              (EGLDisplay a, void *b) = NULL;
+void     (*glsym_glEGLImageTargetTexture2DOES) (int a, void *b)  = NULL;
 #else
 typedef void (*_eng_fn) (void);
 
-_eng_fn (*glsym_glXGetProcAddress) (const char *a) = NULL;
-void (*glsym_glXBindTexImage) (Display *a, GLXDrawable b, int c, int *d) = NULL;
-void (*glsym_glXReleaseTexImage) (Display *a, GLXDrawable b, int c) = NULL;
+_eng_fn  (*glsym_glXGetProcAddress)  (const char *a) = NULL;
+void     (*glsym_glXBindTexImage)    (Display *a, GLXDrawable b, int c, int *d) = NULL;
+void     (*glsym_glXReleaseTexImage) (Display *a, GLXDrawable b, int c) = NULL;
 #endif
                 
 static void
@@ -31,14 +41,35 @@ _sym_init(void)
    if (done) return;
    
 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
-#define FINDSYM(dst, sym) if (!dst) dst = dlsym(RTLD_DEFAULT, sym)
+#define FINDSYM(dst, sym) \
+   if ((!dst) && (glsym_eglGetProcAddress)) dst = glsym_eglGetProcAddress(sym); \
+   if (!dst) dst = dlsym(RTLD_DEFAULT, sym)
+   
+   FINDSYM(glsym_eglGetProcAddress, "glXGetProcAddress");
+   FINDSYM(glsym_eglGetProcAddress, "glXGetProcAddressEXT");
+   FINDSYM(glsym_eglGetProcAddress, "glXGetProcAddressARB");
+   
    FINDSYM(glsym_eglBindTexImage, "eglBindTexImage");
    FINDSYM(glsym_eglBindTexImage, "eglBindTexImageEXT");
    FINDSYM(glsym_eglBindTexImage, "eglBindTexImageARB");
+   FINDSYM(glsym_eglBindTexImage, "eglBindTexImageKHR");
    
    FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImage");
    FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageEXT");
    FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageARB");
+   FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageKHR");
+   
+   FINDSYM(glsym_eglCreateImage, "eglCreateImage");
+   FINDSYM(glsym_eglCreateImage, "eglCreateImageEXT");
+   FINDSYM(glsym_eglCreateImage, "eglCreateImageARB");
+   FINDSYM(glsym_eglCreateImage, "eglCreateImageKHR");
+
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImage");
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImageEXT");
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImageARB");
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImageKHR");
+
+   FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES");
 #else
 #define FINDSYM(dst, sym) \
    if ((!dst) && (glsym_glXGetProcAddress)) dst = glsym_glXGetProcAddress(sym); \
@@ -1028,7 +1059,7 @@ struct _Native
    Visual    *visual;
    
 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
-   EGLSurface  egl_surface;
+   void      *egl_surface;
 #else
 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
    GLXFBConfig fbc;
@@ -1054,10 +1085,19 @@ _native_bind_cb(void *data, void *image)
    Native *n = im->native.data;
    
 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
-   if (glsym_eglBindTexImage)
+# if 0 // old texfrompixmap 
+   if (n->egl_surface)
      {
-        glsym_eglBindTexImage(re->win->egl_disp, n->egl_surface, EGL_SINGLE_BUFFER);
+        if (glsym_eglBindTexImage)
+          glsym_eglBindTexImage(re->win->egl_disp, n->egl_surface, EGL_SINGLE_BUFFER);
      }
+# else   
+   if (n->egl_surface)
+     {
+        if (glsym_glEGLImageTargetTexture2DOES)
+          glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface);
+     }
+# endif   
 #else
 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
    if (glsym_glXBindTexImage)
@@ -1068,7 +1108,8 @@ _native_bind_cb(void *data, void *image)
              GLX_TEXTURE_TARGET_EXT, 
                GLX_TEXTURE_2D_EXT,
                GLX_TEXTURE_FORMAT_EXT, 
-               GLX_TEXTURE_FORMAT_RGBA_EXT,
+//               GLX_TEXTURE_FORMAT_RGBA_EXT,
+               GLX_TEXTURE_FORMAT_RGB_EXT,
                0
           };
         
@@ -1091,10 +1132,13 @@ _native_unbind_cb(void *data, void *image)
    Native *n = im->native.data;
 
 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
-   if (glsym_eglReleaseTexImage)
+# if 0 // old texfrompixmap 
+   if (n->egl_surface)
      {
-        glsym_eglReleaseTexImage(re->win->egl_disp, n->egl_surface, EGL_SINGLE_BUFFER);
+        if (glsym_eglReleaseTexImage)
+          glsym_eglReleaseTexImage(re->win->egl_disp, n->egl_surface, EGL_SINGLE_BUFFER);
      }
+# endif   
 #else
 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
    if (glsym_glXReleaseTexImage)
@@ -1119,11 +1163,20 @@ _native_free_cb(void *data, void *image)
    Native *n = im->native.data;
 
 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+# if 0 // old texfrompixmap 
    if (n->egl_surface)
      {
         eglDestroySurface(re->win->egl_disp, n->egl_surface);
         n->egl_surface = 0;
      }
+# else
+   if (n->egl_surface)
+     {
+        if (glsym_eglDestroyImage)
+          n->egl_surface = glsym_eglDestroyImage(re->win->egl_disp,
+                                                 n->egl_surface);
+     }
+# endif
 #else
 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
    if (n->glx_pixmap)
@@ -1223,9 +1276,17 @@ eng_image_native_set(void *data, void *image, void *native)
              im->native.func.bind   = _native_bind_cb;
              im->native.func.unbind = _native_unbind_cb;
              im->native.func.free   = _native_free_cb;
+#if 0 // old texfrompixmap             
              n->egl_surface = eglCreatePixmapSurface(re->win->egl_disp, 
                                                      egl_config, pm, 
                                                      NULL);
+#else
+             if (glsym_eglCreateImage)
+               n->egl_surface = glsym_eglCreateImage(re->win->egl_disp,
+                                                     EGL_NO_CONTEXT,
+                                                     EGL_NATIVE_PIXMAP_KHR,
+                                                     NULL);
+#endif
              if (!n->egl_surface)
                {
                   printf("ERROR: eglCreatePixmapSurface() for 0x%x failed\n", pm);
@@ -1303,7 +1364,8 @@ eng_image_native_set(void *data, void *image, void *native)
                             GLX_TEXTURE_TARGET_EXT, 
                               GLX_TEXTURE_2D_EXT,
                               GLX_TEXTURE_FORMAT_EXT, 
-                              GLX_TEXTURE_FORMAT_RGBA_EXT,
+//                              GLX_TEXTURE_FORMAT_RGBA_EXT,
+                              GLX_TEXTURE_FORMAT_RGB_EXT,
                               0
                          };
 #endif