Am Freitag, den 16.06.2017, 18:14 +0100 schrieb Daniel Stone: > Now create_wl_buffer is generic enough, we can use it for the > EGL_WL_create_wayland_buffer_from_image extension. > > Signed-off-by: Daniel Stone <dani...@collabora.com> > --- > src/egl/drivers/dri2/platform_wayland.c | 71 > +++++---------------------------- > 1 file changed, 11 insertions(+), 60 deletions(-) > > diff --git a/src/egl/drivers/dri2/platform_wayland.c > b/src/egl/drivers/dri2/platform_wayland.c > index b7197d0a75..96ce31c0ae 100644 > --- a/src/egl/drivers/dri2/platform_wayland.c > +++ b/src/egl/drivers/dri2/platform_wayland.c > @@ -655,21 +655,23 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, > dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FOURCC, &fourcc); > > if (dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) { > + struct wl_drm *wl_drm = > + dri2_surf ? dri2_surf->wl_drm_wrapper : dri2_dpy->wl_drm;
This and... > int stride, fd; > > dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride); > dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD, &fd); > - ret = wl_drm_create_prime_buffer(dri2_surf->wl_drm_wrapper, > - fd, width, height, fourcc, 0, stride, > - 0, 0, 0, 0); > + ret = wl_drm_create_prime_buffer(wl_drm, fd, width, height, fourcc, 0, > + stride, 0, 0, 0, 0); > close(fd); > } else { > + struct wl_drm *wl_drm = > + dri2_surf ? dri2_surf->wl_drm_wrapper : dri2_dpy->wl_drm; .. this can be moved out of the if/else path to get rid of even more duplication. > int stride, name; > > dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride); > dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_NAME, &name); > - ret = wl_drm_create_buffer(dri2_surf->wl_drm_wrapper, > - name, width, height, stride, fourcc); > + ret = wl_drm_create_buffer(wl_drm, name, width, height, stride, > fourcc); > } > > return ret; > @@ -829,70 +831,19 @@ dri2_wl_create_wayland_buffer_from_image(_EGLDriver > *drv, > struct dri2_egl_image *dri2_img = dri2_egl_image(img); > __DRIimage *image = dri2_img->dri_image; > struct wl_buffer *buffer; > - int width, height, format, pitch; > - enum wl_drm_format wl_format; > > - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &format); > - > - switch (format) { > - case __DRI_IMAGE_FORMAT_ARGB8888: > - if (!(dri2_dpy->formats & HAS_ARGB8888)) > - goto bad_format; > - wl_format = WL_DRM_FORMAT_ARGB8888; > - break; > - case __DRI_IMAGE_FORMAT_XRGB8888: > - if (!(dri2_dpy->formats & HAS_XRGB8888)) > - goto bad_format; > - wl_format = WL_DRM_FORMAT_XRGB8888; > - break; > - default: > - goto bad_format; > - } > - > - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width); > - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT, &height); > - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &pitch); > - > - if (dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) { > - int fd; > - > - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD, &fd); > - > - buffer = > - wl_drm_create_prime_buffer(dri2_dpy->wl_drm, > - fd, > - width, height, > - wl_format, > - 0, pitch, > - 0, 0, > - 0, 0); > - > - close(fd); > - } else { > - int name; > - > - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_NAME, &name); > - > - buffer = > - wl_drm_create_buffer(dri2_dpy->wl_drm, > - name, > - width, height, > - pitch, > - wl_format); > - } > + buffer = create_wl_buffer(dri2_dpy, NULL, image); > > /* The buffer object will have been created with our internal event queue > * because it is using the wl_drm object as a proxy factory. We want the > * buffer to be used by the application so we'll reset it to the display's > - * default event queue */ > + * default event queue. This isn't actually racy, as the only event the > + * buffer can get is a buffer release, which doesn't happen with an > explicit > + * attach. */ > if (buffer) > wl_proxy_set_queue((struct wl_proxy *) buffer, NULL); > > return buffer; > - > -bad_format: > - _eglError(EGL_BAD_MATCH, "unsupported image format"); > - return NULL; > } > > static int _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev