summaryrefslogtreecommitdiffstats
path: root/src/egl/drivers/dri2/platform_wayland.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-02-02 12:26:12 -0500
committerKristian Høgsberg <krh@bitplanet.net>2013-03-18 21:15:41 -0400
commitde315f76a266ce51ca0638b9ea2ec3ccfd31f03b (patch)
tree2b467ec888d24b2645bbdb0e6c0cad7204d520aa /src/egl/drivers/dri2/platform_wayland.c
parent2356e28452454ed3b584af9b4d28c553c2a80769 (diff)
downloadexternal_mesa3d-de315f76a266ce51ca0638b9ea2ec3ccfd31f03b.zip
external_mesa3d-de315f76a266ce51ca0638b9ea2ec3ccfd31f03b.tar.gz
external_mesa3d-de315f76a266ce51ca0638b9ea2ec3ccfd31f03b.tar.bz2
wayland: Add prime fd passing as a buffer sharing mechanism
Reviewed-by: Ander Conselvan de Oliveira <conselvan2@gmail.com>
Diffstat (limited to 'src/egl/drivers/dri2/platform_wayland.c')
-rw-r--r--src/egl/drivers/dri2/platform_wayland.c69
1 files changed, 54 insertions, 15 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index b5cd04a..740fc7d 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -451,6 +451,46 @@ static const struct wl_callback_listener frame_listener = {
wayland_frame_callback
};
+static void
+create_wl_buffer(struct dri2_egl_surface *dri2_surf)
+{
+ struct dri2_egl_display *dri2_dpy =
+ dri2_egl_display(dri2_surf->base.Resource.Display);
+ int fd;
+
+ if (dri2_surf->current->wl_buffer != NULL)
+ return;
+
+ if (dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) {
+ dri2_dpy->image->queryImage(dri2_surf->current->dri_image,
+ __DRI_IMAGE_ATTRIB_FD, &fd);
+
+ dri2_surf->current->wl_buffer =
+ wl_drm_create_prime_buffer(dri2_dpy->wl_drm,
+ fd,
+ dri2_surf->base.Width,
+ dri2_surf->base.Height,
+ dri2_surf->format,
+ 0, dri2_surf->current->pitch,
+ 0, 0,
+ 0, 0);
+ close(fd);
+ } else {
+ dri2_surf->current->wl_buffer =
+ wl_drm_create_buffer(dri2_dpy->wl_drm,
+ dri2_surf->current->name,
+ dri2_surf->base.Width,
+ dri2_surf->base.Height,
+ dri2_surf->current->pitch,
+ dri2_surf->format);
+ }
+
+ wl_proxy_set_queue((struct wl_proxy *) dri2_surf->current->wl_buffer,
+ dri2_dpy->wl_queue);
+ wl_buffer_add_listener(dri2_surf->current->wl_buffer,
+ &wl_buffer_listener, dri2_surf);
+}
+
/**
* Called via eglSwapBuffers(), drv->API.SwapBuffers().
*/
@@ -488,19 +528,7 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
dri2_surf->current = dri2_surf->back;
dri2_surf->back = NULL;
- if (dri2_surf->current->wl_buffer == NULL) {
- dri2_surf->current->wl_buffer =
- wl_drm_create_buffer(dri2_dpy->wl_drm,
- dri2_surf->current->name,
- dri2_surf->base.Width,
- dri2_surf->base.Height,
- dri2_surf->current->pitch,
- dri2_surf->format);
- wl_proxy_set_queue((struct wl_proxy *) dri2_surf->current->wl_buffer,
- dri2_dpy->wl_queue);
- wl_buffer_add_listener(dri2_surf->current->wl_buffer,
- &wl_buffer_listener, dri2_surf);
- }
+ create_wl_buffer(dri2_surf);
wl_surface_attach(dri2_surf->wl_win->surface,
dri2_surf->current->wl_buffer,
@@ -630,6 +658,14 @@ drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
}
static void
+drm_handle_capabilities(void *data, struct wl_drm *drm, uint32_t value)
+{
+ struct dri2_egl_display *dri2_dpy = data;
+
+ dri2_dpy->capabilities = value;
+}
+
+static void
drm_handle_authenticated(void *data, struct wl_drm *drm)
{
struct dri2_egl_display *dri2_dpy = data;
@@ -640,7 +676,8 @@ drm_handle_authenticated(void *data, struct wl_drm *drm)
static const struct wl_drm_listener drm_listener = {
drm_handle_device,
drm_handle_format,
- drm_handle_authenticated
+ drm_handle_authenticated,
+ drm_handle_capabilities
};
static void
@@ -649,9 +686,11 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t name,
{
struct dri2_egl_display *dri2_dpy = data;
+ if (version > 1)
+ version = 2;
if (strcmp(interface, "wl_drm") == 0) {
dri2_dpy->wl_drm =
- wl_registry_bind(registry, name, &wl_drm_interface, 1);
+ wl_registry_bind(registry, name, &wl_drm_interface, version);
wl_drm_add_listener(dri2_dpy->wl_drm, &drm_listener, dri2_dpy);
}
}