summaryrefslogtreecommitdiffstats
path: root/src/egl/drivers/dri2/egl_dri2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/egl/drivers/dri2/egl_dri2.c')
-rw-r--r--src/egl/drivers/dri2/egl_dri2.c71
1 files changed, 54 insertions, 17 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 5e47fbe126a..b03ffc3cf9b 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -922,14 +922,11 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
return &dri2_img->base;
}
-static EGLBoolean
-dri2_export_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img,
- EGLint *name, EGLint *handle, EGLint *stride);
-
static _EGLImage *
dri2_reference_drm_image(_EGLDisplay *disp, _EGLContext *ctx,
- _EGLImage *image, EGLint width, EGLint height)
+ __DRIimage *dri_image, EGLint width, EGLint height)
{
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
EGLint attr_list[] = {
EGL_WIDTH, 0,
EGL_HEIGHT, 0,
@@ -939,8 +936,8 @@ dri2_reference_drm_image(_EGLDisplay *disp, _EGLContext *ctx,
};
EGLint name, stride;
- dri2_export_drm_image_mesa(disp->Driver, disp, image,
- &name, NULL, &stride);
+ dri2_dpy->image->queryImage(dri_image, __DRI_IMAGE_ATTRIB_NAME, &name);
+ dri2_dpy->image->queryImage(dri_image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
attr_list[1] = width;
attr_list[3] = height;
@@ -954,16 +951,19 @@ dri2_reference_drm_image(_EGLDisplay *disp, _EGLContext *ctx,
#ifdef HAVE_WAYLAND_PLATFORM
static _EGLImage *
dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
- EGLClientBuffer buffer,
+ EGLClientBuffer _buffer,
const EGLint *attr_list)
{
- struct wl_drm_buffer *wl_drm_buffer = (struct wl_drm_buffer *) buffer;
+ struct wl_buffer *buffer = (struct wl_buffer *) _buffer;
+ (void) attr_list;
- (void) attr_list;
+ if (!wayland_buffer_is_drm(buffer))
+ return NULL;
- return dri2_reference_drm_image(disp, ctx, wl_drm_buffer->image,
- wl_drm_buffer->buffer.width,
- wl_drm_buffer->buffer.height);
+ return dri2_reference_drm_image(disp, ctx,
+ wayland_drm_buffer_get_buffer(buffer),
+ buffer->width,
+ buffer->height);
}
#endif
@@ -1112,6 +1112,41 @@ dri2_export_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img,
}
#ifdef HAVE_WAYLAND_PLATFORM
+
+static void *
+dri2_wl_reference_buffer(void *user_data, uint32_t name,
+ int32_t width, int32_t height,
+ uint32_t stride, struct wl_visual *visual)
+{
+ _EGLDisplay *disp = user_data;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ __DRIimage *image;
+
+ image = dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
+ width, height,
+ __DRI_IMAGE_FORMAT_ARGB8888,
+ name, stride / 4,
+ NULL);
+
+ return image;
+}
+
+static void
+dri2_wl_release_buffer(void *user_data, void *buffer)
+{
+ _EGLDisplay *disp = user_data;
+ __DRIimage *image = buffer;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+
+ dri2_dpy->image->destroyImage(image);
+}
+
+static struct wayland_drm_callbacks wl_drm_callbacks = {
+ .authenticate = NULL,
+ .reference_buffer = dri2_wl_reference_buffer,
+ .release_buffer = dri2_wl_release_buffer
+};
+
static EGLBoolean
dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
struct wl_display *wl_dpy)
@@ -1123,10 +1158,12 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
if (dri2_dpy->wl_server_drm)
return EGL_FALSE;
+ wl_drm_callbacks.authenticate =
+ (int(*)(void *, uint32_t)) dri2_dpy->authenticate;
+
dri2_dpy->wl_server_drm =
- wayland_drm_init(wl_dpy, disp,
- dri2_dpy->authenticate,
- dri2_dpy->device_name);
+ wayland_drm_init(wl_dpy, dri2_dpy->device_name,
+ &wl_drm_callbacks, disp);
if (!dri2_dpy->wl_server_drm)
return EGL_FALSE;
@@ -1145,7 +1182,7 @@ dri2_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
if (!dri2_dpy->wl_server_drm)
return EGL_FALSE;
- wayland_drm_destroy(dri2_dpy->wl_server_drm);
+ wayland_drm_uninit(dri2_dpy->wl_server_drm);
dri2_dpy->wl_server_drm = NULL;
return EGL_TRUE;