[gtk+/gdk-backend-wayland] wayland: Use wayland-egl
- From: Kristian Høgsberg <krh src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gdk-backend-wayland] wayland: Use wayland-egl
- Date: Tue, 8 Feb 2011 21:04:10 +0000 (UTC)
commit 546069f434f18966f2a82c856519ef938dfd5aa6
Author: Kristian Høgsberg <krh bitplanet net>
Date: Tue Feb 8 16:02:22 2011 -0500
wayland: Use wayland-egl
gdk/wayland/gdkdisplay-wayland.c | 65 +++++++------------------------------
gdk/wayland/gdkdisplay-wayland.h | 10 ++---
gdk/wayland/gdkwindow-wayland.c | 40 ++++++++---------------
3 files changed, 31 insertions(+), 84 deletions(-)
---
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index cb99a38..1b74068 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -40,7 +40,7 @@
#include "gdkdevicemanager-wayland.h"
#include "gdkkeysprivate.h"
-#include <xf86drm.h>
+#include <wayland-egl.h>
typedef struct _GdkEventTypeWayland GdkEventTypeWayland;
@@ -121,28 +121,6 @@ gdk_input_init (GdkDisplay *display)
}
static void
-drm_handle_device(void *data, struct wl_drm *compositor, const char *device)
-{
- GdkDisplayWayland *display_wayland = data;
-
- fprintf(stderr, "display name: %s\n", device);
-
- display_wayland->device_name = g_strdup (device);
-}
-
-static void drm_handle_authenticated(void *data, struct wl_drm *drm)
-{
- GdkDisplayWayland *display_wayland = data;
-
- display_wayland->authenticated = TRUE;
-}
-
-static const struct wl_drm_listener drm_listener = {
- drm_handle_device,
- drm_handle_authenticated
-};
-
-static void
shell_handle_configure(void *data, struct wl_shell *shell,
uint32_t time, uint32_t edges,
struct wl_surface *surface,
@@ -205,10 +183,6 @@ gdk_display_handle_global(struct wl_display *display, uint32_t id,
if (strcmp(interface, "compositor") == 0) {
display_wayland->compositor = wl_compositor_create(display, id);
- } else if (strcmp(interface, "drm") == 0) {
- display_wayland->drm = wl_drm_create(display, id);
- wl_drm_add_listener(display_wayland->drm,
- &drm_listener, display_wayland);
} else if (strcmp(interface, "shell") == 0) {
display_wayland->shell = wl_shell_create(display, id);
wl_shell_add_listener(display_wayland->shell,
@@ -228,36 +202,17 @@ gdk_display_init_egl(GdkDisplay *display)
{
GdkDisplayWayland *display_wayland = GDK_DISPLAY_WAYLAND (display);
EGLint major, minor, i;
- drm_magic_t magic;
void *p;
static const struct { const char *f; unsigned int offset; }
extension_functions[] = {
- { "eglCreateDRMImageMESA", offsetof(GdkDisplayWayland, create_drm_image) },
{ "glEGLImageTargetTexture2DOES", offsetof(GdkDisplayWayland, image_target_texture_2d) },
- { "eglExportDRMImageMESA", offsetof(GdkDisplayWayland, export_drm_image) },
+ { "eglCreateImageKHR", offsetof(GdkDisplayWayland, create_image) },
{ "eglDestroyImageKHR", offsetof(GdkDisplayWayland, destroy_image) }
};
- display_wayland->fd = open(display_wayland->device_name, O_RDWR);
- if (display_wayland->fd < 0) {
- fprintf(stderr, "drm open failed: %m\n");
- return FALSE;
- }
-
- if (drmGetMagic(display_wayland->fd, &magic))
- {
- fprintf(stderr, "DRI2: failed to get drm magic");
- return FALSE;
- }
-
- /* Authenticate and wait for authenticated event */
- wl_drm_authenticate(display_wayland->drm, magic);
- wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_WRITABLE);
- while (!display_wayland->authenticated)
- wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_READABLE);
-
- display_wayland->egl_display = eglGetDRMDisplayMESA(display_wayland->fd);
+ display_wayland->egl_display =
+ eglGetDisplay((EGLNativeDisplayType) display_wayland->native_display);
if (!eglInitialize(display_wayland->egl_display, &major, &minor)) {
fprintf(stderr, "failed to initialize display\n");
return FALSE;
@@ -318,6 +273,12 @@ _gdk_wayland_display_open (const gchar *display_name)
display_wayland->wl_display = wl_display;
+ display_wayland->native_display = wl_egl_display_create(wl_display);
+ if (display_wayland->native_display == NULL) {
+ wl_display_destroy(wl_display);
+ return NULL;
+ }
+
/* initialize the display's screens */
display_wayland->screens = g_new (GdkScreen *, 1);
for (i = 0; i < 1; i++)
@@ -332,9 +293,6 @@ _gdk_wayland_display_open (const gchar *display_name)
wl_display_add_global_listener(display_wayland->wl_display,
gdk_display_handle_global, display_wayland);
- /* Process connection events. */
- wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_READABLE);
-
gdk_display_init_egl(display);
display_wayland->event_source = _gdk_wayland_display_event_source_new (display);
@@ -369,6 +327,9 @@ gdk_wayland_display_dispose (GObject *object)
display_wayland->event_source = NULL;
}
+ eglTerminate(display_wayland->egl_display);
+ wl_egl_display_destroy(display_wayland->native_display);
+
G_OBJECT_CLASS (_gdk_display_wayland_parent_class)->dispose (object);
}
diff --git a/gdk/wayland/gdkdisplay-wayland.h b/gdk/wayland/gdkdisplay-wayland.h
index d9dceaa..d7de0f0 100644
--- a/gdk/wayland/gdkdisplay-wayland.h
+++ b/gdk/wayland/gdkdisplay-wayland.h
@@ -28,6 +28,8 @@
#include <wayland-client.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
+#include <GL/gl.h>
+#include <GL/glext.h>
#include <cairo-gl.h>
#include <glib.h>
#include <gdk/gdkkeys.h>
@@ -139,23 +141,19 @@ struct _GdkDisplayWayland
GdkWindow *active_offscreen_window;
/* Wayland fields below */
- char *device_name;
struct wl_display *wl_display;
- struct wl_drm *drm;
+ struct wl_egl_display *native_display;
struct wl_compositor *compositor;
struct wl_shell *shell;
struct wl_output *output;
struct wl_input_device *input_device;
GSource *event_source;
- int fd;
EGLDisplay egl_display;
EGLContext egl_context;
cairo_device_t *cairo_device;
- int authenticated;
- PFNEGLCREATEDRMIMAGEMESA create_drm_image;
- PFNEGLEXPORTDRMIMAGEMESA export_drm_image;
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d;
+ PFNEGLCREATEIMAGEKHRPROC create_image;
PFNEGLDESTROYIMAGEKHRPROC destroy_image;
};
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 7859e3f..419ba04 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -40,6 +40,8 @@
#include <stdio.h>
#include <string.h>
+#include <wayland-egl.h>
+
#define WINDOW_IS_TOPLEVEL_OR_FOREIGN(window) \
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
@@ -295,6 +297,7 @@ static const cairo_user_data_key_t gdk_wayland_cairo_key;
typedef struct _GdkWaylandCairoSurfaceData {
EGLImageKHR image;
GLuint texture;
+ struct wl_egl_pixmap *pixmap;
struct wl_buffer *buffer;
GdkDisplayWayland *display;
} GdkWaylandCairoSurfaceData;
@@ -304,24 +307,12 @@ _gdk_wayland_surface_get_buffer (GdkDisplayWayland *display,
cairo_surface_t *surface)
{
GdkWaylandCairoSurfaceData *data;
- EGLint name, stride;
- struct wl_visual *visual;
- int width, height;
data = cairo_surface_get_user_data (surface, &gdk_wayland_cairo_key);
- if (data->buffer)
- return data->buffer;
-
- visual =
- wl_display_get_premultiplied_argb_visual(display->wl_display);
-
- width = cairo_gl_surface_get_width (surface);
- height = cairo_gl_surface_get_height (surface);
- display->export_drm_image (display->egl_display,
- data->image, &name, NULL, &stride);
- data->buffer = wl_drm_create_buffer(display->drm,
- name, width, height, stride, visual);
+ if (!data->buffer)
+ data->buffer =
+ wl_egl_pixmap_create_buffer(display->native_display, data->pixmap);
return data->buffer;
}
@@ -387,21 +378,18 @@ gdk_wayland_create_cairo_surface (GdkDisplayWayland *display,
{
GdkWaylandCairoSurfaceData *data;
cairo_surface_t *surface;
-
- EGLint image_attribs[] = {
- EGL_WIDTH, 0,
- EGL_HEIGHT, 0,
- EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
- EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA,
- EGL_NONE
- };
+ struct wl_visual *visual;
data = g_new (GdkWaylandCairoSurfaceData, 1);
data->display = display;
data->buffer = NULL;
- image_attribs[1] = width;
- image_attribs[3] = height;
- data->image = display->create_drm_image(display->egl_display, image_attribs);
+ visual = wl_display_get_premultiplied_argb_visual(display->wl_display);
+ data->pixmap =
+ wl_egl_pixmap_create(display->native_display, width, height, visual, 0);
+ data->image =
+ display->create_image(display->egl_display, NULL, EGL_NATIVE_PIXMAP_KHR,
+ (EGLClientBuffer) data->pixmap, NULL);
+
glGenTextures(1, &data->texture);
glBindTexture(GL_TEXTURE_2D, data->texture);
display->image_target_texture_2d(GL_TEXTURE_2D, data->image);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]