-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Kristian Høgsberg wrote:
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 5d36c49..1590190 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -42,7 +42,6 @@
>  #include <X11/Xlib-xcb.h>
>  
>  #include <glapi/glapi.h>
> -#include "eglconfigutil.h"
>  #include "eglconfig.h"
>  #include "eglcontext.h"
>  #include "egldisplay.h"
> @@ -50,6 +49,7 @@
>  #include "eglcurrent.h"
>  #include "egllog.h"
>  #include "eglsurface.h"
> +#include "eglimage.h"
>  
>  struct dri2_egl_driver
>  {
> @@ -67,10 +67,12 @@ struct dri2_egl_display
>     __DRIdri2Extension       *dri2;
>     __DRI2flushExtension     *flush;
>     __DRItexBufferExtension  *tex_buffer;
> +   __DRIimageExtension      *image;
>     int                       fd;
>  
>     __DRIdri2LoaderExtension  loader_extension;
> -   const __DRIextension     *extensions[2];
> +   __DRIimageLookupExtension image_lookup_extension;
> +   const __DRIextension     *extensions[3];
>  };
>  
>  struct dri2_egl_context
> @@ -93,12 +95,24 @@ struct dri2_egl_surface
>  
>  struct dri2_egl_config
>  {
> -   _EGLConfig base;
> +   _EGLConfig         base;
>     const __DRIconfig *dri_config;
>  };
>  
> +struct dri2_egl_image
> +{
> +   _EGLImage   base;
> +   __DRIimage *dri_image;
> +   int         width;
> +   int         height;
> +   int         name;
> +   int         pitch;
> +   int         cpp;
> +};
> +
>  /* standard typecasts */
>  _EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl)
> +_EGL_DRIVER_TYPECAST(dri2_egl_image, _EGLImage, obj)
>  
>  EGLint dri2_to_egl_attribute_map[] = {
>     0,
> @@ -346,6 +360,25 @@ dri2_flush_front_buffer(__DRIdrawable * driDrawable, 
> void *loaderPrivate)
>  #endif
>  }
>  
> +static __DRIimage *
> +dri2_lookup_image(__DRIcontext *context, void *image, void *data)
> +{
> +   struct dri2_egl_context *dri2_ctx = data;
> +   _EGLDisplay *disp = dri2_ctx->base.Resource.Display;
> +   struct dri2_egl_image *dri2_img;
> +   _EGLImage *img;
> +
> +   img = _eglLookupImage(image, disp);
> +   if (img == NULL) {
> +      _eglError(EGL_BAD_PARAMETER, "dri2_lookup_image");
> +      return NULL;
> +   }
> +
> +   dri2_img = dri2_egl_image(image);
> +
> +   return dri2_img->dri_image;
> +}
> +

If this function can only be called by a driver, I don't think it should
log error messages.

>  static __DRIbuffer *
>  dri2_get_buffers_with_format(__DRIdrawable * driDrawable,
>                            int *width, int *height,
> @@ -405,6 +438,7 @@ static struct dri2_extension_match 
> dri2_driver_extensions[] = {
>  static struct dri2_extension_match dri2_core_extensions[] = {
>     { __DRI2_FLUSH, 1, offsetof(struct dri2_egl_display, flush) },
>     { __DRI_TEX_BUFFER, 2, offsetof(struct dri2_egl_display, tex_buffer) },
> +   { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) },
>     { NULL }
>  };
>  
> @@ -609,8 +643,13 @@ dri2_initialize(_EGLDriver *drv, _EGLDisplay *disp,
>        dri2_dpy->loader_extension.getBuffersWithFormat = NULL;
>     }
>        
> +   dri2_dpy->image_lookup_extension.base.name = __DRI_IMAGE_LOOKUP;
> +   dri2_dpy->image_lookup_extension.base.version = 1;
> +   dri2_dpy->image_lookup_extension.lookupImage = dri2_lookup_image;
> +
>     dri2_dpy->extensions[0] = &dri2_dpy->loader_extension.base;
> -   dri2_dpy->extensions[1] = NULL;
> +   dri2_dpy->extensions[1] = &dri2_dpy->image_lookup_extension.base;
> +   dri2_dpy->extensions[2] = NULL;
>  
>     dri2_dpy->dri_screen =
>        dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, dri2_dpy->extensions,
> @@ -1064,6 +1103,80 @@ dri2_release_tex_image(_EGLDriver *drv,
>     return EGL_TRUE;
>  }
>  
> +static _EGLImage *
> +dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
> +                   _EGLContext *ctx, EGLenum target,
> +                   EGLClientBuffer buffer, const EGLint *attr_list)
> +{
> +   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> +   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
> +   struct dri2_egl_image *dri2_img;
> +   unsigned int attachments[1];
> +   xcb_drawable_t drawable;
> +   xcb_dri2_get_buffers_cookie_t cookie;
> +   xcb_dri2_dri2_buffer_t *buffers;
> +   xcb_dri2_get_buffers_reply_t *reply;
> +
> +   dri2_img = malloc(sizeof *dri2_img);
> +   if (!dri2_img) {
> +      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
> +      return EGL_NO_IMAGE_KHR;
> +   }
> +
> +   if (!_eglInitImage(&dri2_img->base, disp, attr_list))
> +      return EGL_NO_IMAGE_KHR;
> +
> +   switch (target) {
> +   case EGL_NATIVE_PIXMAP_KHR:
> +      drawable = (xcb_drawable_t) buffer;
> +      xcb_dri2_create_drawable (dri2_dpy->conn, drawable);
> +      attachments[0] = XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT;
> +      cookie = xcb_dri2_get_buffers_unchecked (dri2_dpy->conn,
> +                                            drawable, 1, 1, attachments);
> +      reply = xcb_dri2_get_buffers_reply (dri2_dpy->conn, cookie, NULL);
> +      buffers = xcb_dri2_get_buffers_buffers (reply);
> +      if (buffers == NULL) {
> +      free(dri2_img);
> +      return NULL;
> +      }
> +
> +      dri2_img->width = reply->width;
> +      dri2_img->height = reply->height;
> +      dri2_img->name = buffers[0].name;
> +      dri2_img->pitch = buffers[0].pitch / buffers[0].cpp;
> +      dri2_img->cpp = buffers[0].cpp;
> +      free(reply);
> +      break;
> +
> +   default:
> +      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr");
> +      free(dri2_img);
> +      return EGL_NO_IMAGE_KHR;
> +   }
> +
> +   dri2_img->dri_image =
> +      dri2_dpy->image->createImageFromName(dri2_ctx->dri_context,
> +                                        dri2_img->width,
> +                                        dri2_img->height,
> +                                        GL_RGBA,
> +                                        dri2_img->name,
> +                                        dri2_img->pitch,
> +                                        dri2_img);
> +

Since applications call this function directly, should this give an
error if dri2_dpy->image is NULL, or is it okay to just segfault?

> +   return &dri2_img->base;
> +}
> +
> +static EGLBoolean
> +dri2_destroy_image_khr(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *image)
> +{
> +   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> +   struct dri2_egl_image *dri2_img = dri2_egl_image(image);
> +
> +   dri2_dpy->image->destroyImage(dri2_img->dri_image);
> +   free(dri2_img);
> +
> +   return EGL_TRUE;
> +}

Ditto.

>  
>  /**
>   * This is the main entrypoint into the driver, called by libEGL.
> @@ -1094,6 +1207,8 @@ _eglMain(const char *args)
>     dri2_drv->base.API.CopyBuffers = dri2_copy_buffers;
>     dri2_drv->base.API.BindTexImage = dri2_bind_tex_image;
>     dri2_drv->base.API.ReleaseTexImage = dri2_release_tex_image;
> +   dri2_drv->base.API.CreateImageKHR = dri2_create_image_khr;
> +   dri2_drv->base.API.DestroyImageKHR = dri2_destroy_image_khr;
>  
>     dri2_drv->base.Name = "DRI2";
>     dri2_drv->base.Unload = dri2_unload;

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkt1+TMACgkQX1gOwKyEAw8l0ACfYbuK1Oo+8x9rgnOfkfdtIIFy
kNkAn0sOoggph3XPB2+7qWqkllZZiTCk
=XEkO
-----END PGP SIGNATURE-----

------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to