summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-09 11:38:20 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-18 15:48:45 +0200
commite2fbd94b6d5f92a582925910925f9b94406aa077 (patch)
tree41be62709b197621c82240ece17a4259b9f51f73
parent5ecb943709cc485637ec442028ba8de9930438f1 (diff)
egl: Make use of external wayland-drm shared codewayland-drm-removal-2
-rw-r--r--configure.ac4
-rw-r--r--src/egl/drivers/dri2/Makefile6
-rw-r--r--src/egl/drivers/dri2/egl_dri2.c66
-rw-r--r--src/egl/drivers/dri2/egl_dri2.h4
-rw-r--r--src/egl/main/Makefile3
-rw-r--r--src/egl/wayland/Makefile2
-rw-r--r--src/egl/wayland/wayland-drm/.gitignore3
-rw-r--r--src/egl/wayland/wayland-drm/Makefile46
-rw-r--r--src/egl/wayland/wayland-drm/protocol/wayland-drm.xml38
-rw-r--r--src/egl/wayland/wayland-drm/wayland-drm.c203
-rw-r--r--src/egl/wayland/wayland-drm/wayland-drm.h26
-rw-r--r--src/egl/wayland/wayland-egl/wayland-egl.c4
-rw-r--r--src/gallium/state_trackers/egl/Makefile3
13 files changed, 61 insertions, 347 deletions
diff --git a/configure.ac b/configure.ac
index ddd860813b..1353088a11 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1633,8 +1633,8 @@ yes)
GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS sw/fbdev"
fi
if test "$plat" = "wayland"; then
- PKG_CHECK_MODULES([WAYLAND], [wayland-client wayland-server],, \
- [AC_MSG_ERROR([cannot find libwayland-client])])
+ PKG_CHECK_MODULES([WAYLAND], [wayland-client wayland-server wayland-drm-client wayland-drm-server],, \
+ [AC_MSG_ERROR([cannot find wayland (-drm) libs])])
WAYLAND_EGL_LIB_DEPS="$WAYLAND_LIBS $LIBDRM_LIBS"
fi
done
diff --git a/src/egl/drivers/dri2/Makefile b/src/egl/drivers/dri2/Makefile
index 4783975852..53e92e5d9b 100644
--- a/src/egl/drivers/dri2/Makefile
+++ b/src/egl/drivers/dri2/Makefile
@@ -27,10 +27,8 @@ endif
ifneq ($(findstring wayland, $(EGL_PLATFORMS)),)
EGL_SOURCES += platform_wayland.c
EGL_INCLUDES += -DHAVE_WAYLAND_PLATFORM $(WAYLAND_CFLAGS) \
- -I$(TOP)/src/egl/wayland/wayland-egl \
- -I$(TOP)/src/egl/wayland/wayland-drm
-EGL_LIBS += $(WAYLAND_LIBS) \
- $(TOP)/src/egl/wayland/wayland-drm/libwayland-drm.a
+ -I$(TOP)/src/egl/wayland/wayland-egl
+EGL_LIBS += $(WAYLAND_LIBS)
endif
include ../Makefile.template
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 5e47fbe126..a772cd96bf 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,9 @@ 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;
@@ -957,13 +955,13 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
EGLClientBuffer buffer,
const EGLint *attr_list)
{
- struct wl_drm_buffer *wl_drm_buffer = (struct wl_drm_buffer *) buffer;
+ struct wl_buffer *drm_buffer = buffer;
(void) attr_list;
- 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,
+ wl_drm_buffer_get_buffer(drm_buffer),
+ drm_buffer->width, drm_buffer->height);
}
#endif
@@ -1112,6 +1110,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);
+}
+
+struct wl_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 +1156,11 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
if (dri2_dpy->wl_server_drm)
return EGL_FALSE;
- dri2_dpy->wl_server_drm =
- wayland_drm_init(wl_dpy, disp,
- dri2_dpy->authenticate,
- dri2_dpy->device_name);
+ wl_drm_callbacks.authenticate =
+ (int(*)(void*,uint32_t)) dri2_dpy->authenticate;
+
+ dri2_dpy->wl_server_drm = wl_drm_init(wl_dpy, dri2_dpy->device_name,
+ &wl_drm_callbacks, disp);
if (!dri2_dpy->wl_server_drm)
return EGL_FALSE;
@@ -1145,7 +1179,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);
+ wl_drm_finish(dri2_dpy->wl_server_drm);
dri2_dpy->wl_server_drm = NULL;
return EGL_TRUE;
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index cb1de2681f..fcfc5eace3 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -35,7 +35,9 @@
#ifdef HAVE_WAYLAND_PLATFORM
#include <wayland-client.h>
-#include "wayland-drm.h"
+#include <wayland-server.h>
+#include "wayland-drm-server.h"
+#include "wayland-drm-client-protocol.h"
#include "wayland-egl-priv.h"
#endif
diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile
index 820788d696..a5b9299502 100644
--- a/src/egl/main/Makefile
+++ b/src/egl/main/Makefile
@@ -58,9 +58,6 @@ LOCAL_LIBS =
ifeq ($(filter dri2, $(EGL_DRIVERS_DIRS)),dri2)
LOCAL_CFLAGS += -D_EGL_BUILT_IN_DRIVER_DRI2
LOCAL_LIBS += $(TOP)/src/egl/drivers/dri2/libegl_dri2.a
-ifneq ($(findstring wayland, $(EGL_PLATFORMS)),)
-LOCAL_LIBS += $(TOP)/src/egl/wayland/wayland-drm/libwayland-drm.a
-endif
EGL_LIB_DEPS += $(XCB_DRI2_LIBS) $(LIBUDEV_LIBS) $(DLOPEN_LIBS) $(LIBDRM_LIB) $(WAYLAND_LIBS)
endif
ifeq ($(filter glx, $(EGL_DRIVERS_DIRS)),glx)
diff --git a/src/egl/wayland/Makefile b/src/egl/wayland/Makefile
index c38a1302f1..98ceb9d312 100644
--- a/src/egl/wayland/Makefile
+++ b/src/egl/wayland/Makefile
@@ -3,7 +3,7 @@
TOP = ../../..
include $(TOP)/configs/current
-SUBDIRS = wayland-drm wayland-egl
+SUBDIRS = wayland-egl
default: subdirs
diff --git a/src/egl/wayland/wayland-drm/.gitignore b/src/egl/wayland/wayland-drm/.gitignore
deleted file mode 100644
index f4ed848476..0000000000
--- a/src/egl/wayland/wayland-drm/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-wayland-drm-client-protocol.h
-wayland-drm-server-protocol.h
-wayland-drm-protocol.c
diff --git a/src/egl/wayland/wayland-drm/Makefile b/src/egl/wayland/wayland-drm/Makefile
deleted file mode 100644
index 789b020a59..0000000000
--- a/src/egl/wayland/wayland-drm/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-# src/egl/wayland/wayland-drm/Makefile
-
-TOP = ../../../..
-include $(TOP)/configs/current
-
-GEN_SOURCES = wayland-drm-protocol.c
-
-GEN_HEADERS = wayland-drm-client-protocol.h wayland-drm-server-protocol.h
-
-wayland_drm_SOURCES = wayland-drm.c $(GEN_SOURCES)
-wayland_drm_OBJECTS = $(wayland_drm_SOURCES:.c=.o)
-
-wayland_drm_INCLUDES = \
- $(WAYLAND_CFLAGS) \
- -I$(TOP)/src/egl/main \
- -I$(TOP)/include
-
-# Generate protocol sources
-prefix=$(shell pkg-config --variable=prefix wayland-server)
-exec_prefx=$(shell pkg-config --variable=exec_prefix wayland-server)
-wayland_protocoldir = $(PWD)/protocol
-wayland_scanner=$(exec_prefix)/bin/wayland-scanner
-
-default: depend libwayland-drm.a $(GEN_SOURCES) $(GEN_HEADERS)
-
-libwayland-drm.a: $(wayland_drm_OBJECTS) Makefile
- $(MKLIB) -o wayland-drm -static $(wayland_drm_OBJECTS)
-
-depend:
- rm -f depend
- touch depend
- $(MKDEP) $(MKDEP_OPTIONS) $(wayland_drm_INCLUDES) $(wayland_drm_SOURCES) 2> /dev/null
-
-clean:
- rm -rf libwayland-drm.a $(wayland_drm_OBJECTS) \
- $(GEN_SOURCES) $(GEN_HEADERS)
-
-install:
- @echo -n ""
-
-$(wayland_drm_OBJECTS): %.o: %.c $(GEN_HEADERS)
- $(CC) -c $(wayland_drm_INCLUDES) $(CFLAGS) $< -o $@
-
-include $(prefix)/share/aclocal/wayland-scanner.mk
-
-sinclude depend
diff --git a/src/egl/wayland/wayland-drm/protocol/wayland-drm.xml b/src/egl/wayland/wayland-drm/protocol/wayland-drm.xml
deleted file mode 100644
index 46725d8517..0000000000
--- a/src/egl/wayland/wayland-drm/protocol/wayland-drm.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<protocol name="drm">
- <!-- drm support. This object is created by the server and published
- using the display's global event. -->
- <interface name="drm" version="1">
- <!-- Call this request with the magic received from drmGetMagic().
- It will be passed on to the drmAuthMagic() or
- DRIAuthConnection() call. This authentication must be
- completed before create_buffer could be used. -->
- <request name="authenticate">
- <arg name="id" type="uint"/>
- </request>
-
- <!-- Create a wayland buffer for the named DRM buffer. The DRM
- surface must have a name using the flink ioctl -->
- <request name="create_buffer">
- <arg name="id" type="new_id" interface="buffer"/>
- <arg name="name" type="uint"/>
- <arg name="width" type="int"/>
- <arg name="height" type="int"/>
- <arg name="stride" type="uint"/>
- <arg name="visual" type="object" interface="visual"/>
- </request>
-
- <!-- Notification of the path of the drm device which is used by
- the server. The client should use this device for creating
- local buffers. Only buffers created from this device should
- be be passed to the server using this drm object's
- create_buffer request. -->
- <event name="device">
- <arg name="name" type="string"/>
- </event>
-
- <!-- Raised if the authenticate request succeeded -->
- <event name="authenticated"/>
- </interface>
-
-</protocol>
diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c
deleted file mode 100644
index 6624fbe9d4..0000000000
--- a/src/egl/wayland/wayland-drm/wayland-drm.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright © 2011 Kristian Høgsberg
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Kristian Høgsberg <krh@bitplanet.net>
- * Benjamin Franzke <benjaminfranzke@googlemail.com>
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stddef.h>
-
-#include <wayland-server.h>
-#include "wayland-drm.h"
-#include "wayland-drm-server-protocol.h"
-
-#include "egldisplay.h"
-#include "egldriver.h"
-#include "eglimage.h"
-#include "egltypedefs.h"
-
-struct wl_drm {
- struct wl_object object;
- struct wl_display *display;
-
- _EGLDisplay *edisp;
-
- char *device_name;
- authenticate_t authenticate;
-};
-
-static void
-drm_buffer_damage(struct wl_buffer *buffer_base,
- struct wl_surface *surface,
- int32_t x, int32_t y, int32_t width, int32_t height)
-{
-}
-
-static void
-destroy_buffer(struct wl_resource *resource, struct wl_client *client)
-{
- struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) resource;
- _EGLDriver *drv = buffer->drm->edisp->Driver;
-
- drv->API.DestroyImageKHR(drv, buffer->drm->edisp, buffer->image);
- free(buffer);
-}
-
-static void
-buffer_destroy(struct wl_client *client, struct wl_buffer *buffer)
-{
- wl_resource_destroy(&buffer->resource, client);
-}
-
-const static struct wl_buffer_interface buffer_interface = {
- buffer_destroy
-};
-
-static void
-drm_create_buffer(struct wl_client *client, struct wl_drm *drm,
- uint32_t id, uint32_t name, int32_t width, int32_t height,
- uint32_t stride, struct wl_visual *visual)
-{
- struct wl_drm_buffer *buffer;
- EGLint attribs[] = {
- EGL_WIDTH, 0,
- EGL_HEIGHT, 0,
- EGL_DRM_BUFFER_STRIDE_MESA, 0,
- EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
- EGL_NONE
- };
- _EGLDriver *drv = drm->edisp->Driver;
-
- buffer = malloc(sizeof *buffer);
- if (buffer == NULL) {
- wl_client_post_no_memory(client);
- return;
- }
-
- buffer->drm = drm;
- buffer->buffer.compositor = NULL;
- buffer->buffer.width = width;
- buffer->buffer.height = height;
- buffer->buffer.visual = visual;
- buffer->buffer.attach = NULL;
- buffer->buffer.damage = drm_buffer_damage;
-
- if (visual->object.interface != &wl_visual_interface) {
- /* FIXME: Define a real exception event instead of
- * abusing this one */
- wl_client_post_event(client,
- (struct wl_object *) drm->display,
- WL_DISPLAY_INVALID_OBJECT, 0);
- fprintf(stderr, "invalid visual in create_buffer\n");
- return;
- }
-
- attribs[1] = width;
- attribs[3] = height;
- attribs[5] = stride / 4;
- buffer->image = drv->API.CreateImageKHR(drv, drm->edisp,
- EGL_NO_CONTEXT,
- EGL_DRM_BUFFER_MESA,
- (EGLClientBuffer) (intptr_t) name,
- attribs);
-
- if (buffer->image == NULL) {
- /* FIXME: Define a real exception event instead of
- * abusing this one */
- wl_client_post_event(client,
- (struct wl_object *) drm->display,
- WL_DISPLAY_INVALID_OBJECT, 0);
- fprintf(stderr, "failed to create image for name %d\n", name);
- return;
- }
-
- buffer->buffer.resource.object.id = id;
- buffer->buffer.resource.object.interface = &wl_buffer_interface;
- buffer->buffer.resource.object.implementation = (void (**)(void))
- &buffer_interface;
-
- buffer->buffer.resource.destroy = destroy_buffer;
-
- wl_client_add_resource(client, &buffer->buffer.resource);
-}
-
-static void
-drm_authenticate(struct wl_client *client,
- struct wl_drm *drm, uint32_t id)
-{
- if (drm->authenticate(drm->edisp, id) < 0)
- wl_client_post_event(client,
- (struct wl_object *) drm->display,
- WL_DISPLAY_INVALID_OBJECT, 0);
- else
- wl_client_post_event(client, &drm->object,
- WL_DRM_AUTHENTICATED);
-}
-
-const static struct wl_drm_interface drm_interface = {
- drm_authenticate,
- drm_create_buffer
-};
-
-static void
-post_drm_device(struct wl_client *client, struct wl_object *global)
-{
- struct wl_drm *drm = (struct wl_drm *) global;
-
- wl_client_post_event(client, global, WL_DRM_DEVICE, drm->device_name);
-}
-
-struct wl_drm *
-wayland_drm_init(struct wl_display *display, _EGLDisplay *disp,
- authenticate_t authenticate, char *device_name)
-{
- struct wl_drm *drm;
-
- drm = malloc(sizeof *drm);
-
- drm->display = display;
- drm->edisp = disp;
- drm->authenticate = authenticate;
- drm->device_name = strdup(device_name);
-
- drm->object.interface = &wl_drm_interface;
- drm->object.implementation = (void (**)(void)) &drm_interface;
- wl_display_add_object(display, &drm->object);
- wl_display_add_global(display, &drm->object, post_drm_device);
-
- return drm;
-}
-
-void
-wayland_drm_destroy(struct wl_drm *drm)
-{
- free(drm->device_name);
-
- /* FIXME: need wl_display_del_{object,global} */
-
- free(drm);
-}
diff --git a/src/egl/wayland/wayland-drm/wayland-drm.h b/src/egl/wayland/wayland-drm/wayland-drm.h
deleted file mode 100644
index 675a6a5ce4..0000000000
--- a/src/egl/wayland/wayland-drm/wayland-drm.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef WAYLAND_DRM_H
-#define WAYLAND_DRM_H
-
-#include "egldisplay.h"
-#include "eglimage.h"
-
-#include <wayland-server.h>
-
-struct wl_drm;
-
-typedef int (*authenticate_t) (_EGLDisplay *disp, uint32_t id);
-
-struct wl_drm_buffer {
- struct wl_buffer buffer;
- struct wl_drm *drm;
- _EGLImage *image;
-};
-
-struct wl_drm *
-wayland_drm_init(struct wl_display *display, _EGLDisplay *disp,
- authenticate_t authenticate, char *device_name);
-
-void
-wayland_drm_destroy(struct wl_drm *drm);
-
-#endif
diff --git a/src/egl/wayland/wayland-egl/wayland-egl.c b/src/egl/wayland/wayland-egl/wayland-egl.c
index 2c84bec64a..89b69026fe 100644
--- a/src/egl/wayland/wayland-egl/wayland-egl.c
+++ b/src/egl/wayland/wayland-egl/wayland-egl.c
@@ -12,9 +12,9 @@
#include <dlfcn.h>
#include <wayland-client.h>
-#include "wayland-egl.h"
+#include <wayland-drm-client-protocol.h>
+#include <wayland-egl.h>
#include "wayland-egl-priv.h"
-#include "wayland-drm-client-protocol.h"
#include <xf86drm.h>
static void
diff --git a/src/gallium/state_trackers/egl/Makefile b/src/gallium/state_trackers/egl/Makefile
index 53673a78a9..5e6f84d874 100644
--- a/src/gallium/state_trackers/egl/Makefile
+++ b/src/gallium/state_trackers/egl/Makefile
@@ -26,8 +26,7 @@ x11_OBJECTS = $(x11_SOURCES:.c=.o)
wayland_INCLUDES = \
-I$(TOP)/src/gallium/winsys \
-I$(TOP)/src/egl/wayland/wayland-egl \
- -I$(TOP)/src/egl/wayland/wayland-drm \
- $(shell pkg-config --cflags-only-I libdrm wayland-client)
+ $(WAYLAND_CFLAGS) $(LIBDRM_CFLAGS)
wayland_SOURCES = $(wildcard wayland/*.c)
wayland_OBJECTS = $(wayland_SOURCES:.c=.o)