-----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