diff options
Diffstat (limited to 'progs')
| -rw-r--r-- | progs/egl/xeglgears.c | 95 | 
1 files changed, 72 insertions, 23 deletions
| diff --git a/progs/egl/xeglgears.c b/progs/egl/xeglgears.c index efb63ef3c9..342d509a72 100644 --- a/progs/egl/xeglgears.c +++ b/progs/egl/xeglgears.c @@ -42,6 +42,9 @@  #include <GL/gl.h>  #include <EGL/egl.h> +#define EGL_EGLEXT_PROTOTYPES +#include <EGL/eglext.h> +  #define BENCHMARK @@ -335,6 +338,7 @@ struct egl_manager {     EGLSurface win;     EGLSurface pix;     EGLSurface pbuf; +   EGLImageKHR image;     EGLBoolean verbose;     EGLint major, minor; @@ -528,17 +532,26 @@ egl_manager_destroy(struct egl_manager *eman)     free(eman);  } -enum { GEARS_WINDOW, GEARS_PIXMAP, GEARS_PBUFFER_COPY, GEARS_PBUFFER_TEXTURE }; +enum { +   GEARS_WINDOW, +   GEARS_PIXMAP, +   GEARS_PIXMAP_TEXTURE, +   GEARS_PBUFFER, +   GEARS_PBUFFER_TEXTURE +}; + +typedef void* GLeglImageOES; +GLAPI void GLAPIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GLAPI void GLAPIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);  static void -texture_gears(struct egl_manager *eman) +texture_gears(struct egl_manager *eman, int surface_type)  {     static const GLint verts[12] =        { -5, -6, -10,  5, -6, -10,  -5, 4, 10,  5, 4, 10 };     static const GLint tex_coords[8] = { 0, 0,  1, 0,  0, 1,  1, 1 }; -   static const GLuint indices[4] = { 0, 1, 2, 3 }; -   eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx); +   eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);     glClearColor(0, 0, 0, 0);     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -554,15 +567,19 @@ texture_gears(struct egl_manager *eman)     glVertexPointer(3, GL_INT, 0, verts);     glTexCoordPointer(2, GL_INT, 0, tex_coords); -   eglBindTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER); +   if (surface_type == GEARS_PBUFFER_TEXTURE) +      eglBindTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER); -   glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, indices); +   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);     glDisableClientState(GL_VERTEX_ARRAY);     glDisableClientState(GL_COLOR_ARRAY);     glDisable(GL_TEXTURE_2D); -   eglReleaseTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER); +   if (surface_type == GEARS_PBUFFER_TEXTURE) +      eglReleaseTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER); + +   eglSwapBuffers(eman->dpy, eman->win);   }  static void @@ -633,8 +650,17 @@ event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)           if (angle > 3600.0)               angle -= 3600.0; -	 if (surface_type == GEARS_PBUFFER_TEXTURE) +         switch (surface_type) { +	 case GEARS_PBUFFER: +	 case GEARS_PBUFFER_TEXTURE:              eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx); +	    break; + +	 case GEARS_PIXMAP: +	 case GEARS_PIXMAP_TEXTURE: +            eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx); +	    break; +	 }           draw();           switch (surface_type) { @@ -642,13 +668,12 @@ event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)              eglSwapBuffers(eman->dpy, eman->win);              break;           case GEARS_PBUFFER_TEXTURE: -         case GEARS_PBUFFER_COPY: -	    if (surface_type == GEARS_PBUFFER_TEXTURE) { -	       texture_gears(eman); -	    } else { -	       if (!eglCopyBuffers(eman->dpy, eman->pbuf, eman->xpix)) -		  break; -	    } +	 case GEARS_PIXMAP_TEXTURE: +	    texture_gears(eman, surface_type); +	    break; +         case GEARS_PBUFFER: +	    if (!eglCopyBuffers(eman->dpy, eman->pbuf, eman->xpix)) +	       break;  	    eglWaitClient();              /* fall through */           case GEARS_PIXMAP: @@ -693,6 +718,9 @@ usage(void)     printf("  -pbuffer-texture        use pbuffer surface and eglBindTexImage\n");  } +static const char *names[] = { +   "window", "pixmap", "pixmap_texture", "pbuffer", "pbuffer_texture" +};  int  main(int argc, char *argv[]) @@ -715,6 +743,7 @@ main(int argc, char *argv[])     GLboolean printInfo = GL_FALSE;     GLboolean fullscreen = GL_FALSE;     EGLBoolean ret; +   GLuint texture;     int i;     for (i = 1; i < argc; i++) { @@ -732,8 +761,12 @@ main(int argc, char *argv[])           surface_type = GEARS_PIXMAP;  	 attribs[1] = EGL_PIXMAP_BIT;        } -      else if (strcmp(argv[i], "-pbuffer-copy") == 0) { -         surface_type = GEARS_PBUFFER_COPY; +      else if (strcmp(argv[i], "-pixmap-texture") == 0) { +         surface_type = GEARS_PIXMAP_TEXTURE; +	 attribs[1] = EGL_PIXMAP_BIT; +      } +      else if (strcmp(argv[i], "-pbuffer") == 0) { +         surface_type = GEARS_PBUFFER;  	 attribs[1] = EGL_PBUFFER_BIT;        }        else if (strcmp(argv[i], "-pbuffer-texture") == 0) { @@ -761,9 +794,8 @@ main(int argc, char *argv[])        return -1;     } -   snprintf(win_title, sizeof(win_title), "xeglgears (%s)", -            (surface_type == GEARS_WINDOW) ? "window" : -            (surface_type == GEARS_PIXMAP) ? "pixmap" : "pbuffer"); +   snprintf(win_title, sizeof(win_title), +	    "xeglgears (%s)", names[surface_type]);     /* create surface(s) */     switch (surface_type) { @@ -774,15 +806,20 @@ main(int argc, char *argv[])           ret = eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);        break;     case GEARS_PIXMAP: +   case GEARS_PIXMAP_TEXTURE:        ret = (egl_manager_create_window(eman, win_title, winWidth, winHeight, -                                       EGL_FALSE, fullscreen, NULL) && +                                       EGL_TRUE, fullscreen, NULL) &&               egl_manager_create_pixmap(eman, eman->xwin,                                         EGL_TRUE, NULL)); +      if (surface_type == GEARS_PIXMAP_TEXTURE) +	 eman->image = eglCreateImageKHR (eman->dpy, eman->ctx, +					  EGL_NATIVE_PIXMAP_KHR, +					  (EGLClientBuffer) eman->xpix, NULL);        if (ret)           ret = eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);        break; +   case GEARS_PBUFFER:     case GEARS_PBUFFER_TEXTURE: -   case GEARS_PBUFFER_COPY:        {           EGLint pbuf_attribs[] = {              EGL_WIDTH, winWidth, @@ -792,7 +829,7 @@ main(int argc, char *argv[])              EGL_NONE           };           ret = (egl_manager_create_window(eman, win_title, winWidth, winHeight, -					  EGL_FALSE, fullscreen, NULL) && +					  EGL_TRUE, fullscreen, NULL) &&                  egl_manager_create_pixmap(eman, eman->xwin,  					  EGL_TRUE, NULL) &&                  egl_manager_create_pbuffer(eman, pbuf_attribs)); @@ -805,6 +842,18 @@ main(int argc, char *argv[])        break;     } +   switch (surface_type) { +   case GEARS_PIXMAP_TEXTURE: +	   glGenTextures(1, &texture); +   	   glBindTexture(GL_TEXTURE_2D, texture); +	   glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eman->image); +	   break; +   case GEARS_PBUFFER_TEXTURE: +	   glGenTextures(1, &texture); +   	   glBindTexture(GL_TEXTURE_2D, texture); +	   break; +   } +     if (!ret) {        egl_manager_destroy(eman);        XCloseDisplay(x_dpy); | 
