diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-09 11:38:20 +0200 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-18 15:48:45 +0200 |
commit | e2fbd94b6d5f92a582925910925f9b94406aa077 (patch) | |
tree | 41be62709b197621c82240ece17a4259b9f51f73 | |
parent | 5ecb943709cc485637ec442028ba8de9930438f1 (diff) |
egl: Make use of external wayland-drm shared codewayland-drm-removal-2
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | src/egl/drivers/dri2/Makefile | 6 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 66 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.h | 4 | ||||
-rw-r--r-- | src/egl/main/Makefile | 3 | ||||
-rw-r--r-- | src/egl/wayland/Makefile | 2 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/.gitignore | 3 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/Makefile | 46 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/protocol/wayland-drm.xml | 38 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/wayland-drm.c | 203 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/wayland-drm.h | 26 | ||||
-rw-r--r-- | src/egl/wayland/wayland-egl/wayland-egl.c | 4 | ||||
-rw-r--r-- | src/gallium/state_trackers/egl/Makefile | 3 |
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) |