summaryrefslogtreecommitdiffstats
path: root/src/egl/wayland/wayland-drm/wayland-drm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/egl/wayland/wayland-drm/wayland-drm.c')
-rw-r--r--src/egl/wayland/wayland-drm/wayland-drm.c81
1 files changed, 43 insertions, 38 deletions
diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c
index 3d5cb399e57..050f540ddfa 100644
--- a/src/egl/wayland/wayland-drm/wayland-drm.c
+++ b/src/egl/wayland/wayland-drm/wayland-drm.c
@@ -1,5 +1,6 @@
/*
* Copyright © 2011 Kristian Høgsberg
+ * Copyright © 2011 Benjamin Franzke
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -35,19 +36,21 @@
#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;
-
+ void *user_data;
char *device_name;
- authenticate_t authenticate;
+
+ struct wayland_drm_callbacks *callbacks;
+};
+
+struct wl_drm_buffer {
+ struct wl_buffer buffer;
+ struct wl_drm *drm;
+
+ void *driver_buffer;
};
static void
@@ -60,9 +63,10 @@ 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;
+ struct wl_drm *drm = buffer->drm;
- drv->API.DestroyImageKHR(drv, buffer->drm->edisp, buffer->image);
+ drm->callbacks->release_buffer(drm->user_data,
+ buffer->driver_buffer);
free(buffer);
}
@@ -72,7 +76,7 @@ buffer_destroy(struct wl_client *client, struct wl_buffer *buffer)
wl_resource_destroy(&buffer->resource, client);
}
-const static struct wl_buffer_interface buffer_interface = {
+const static struct wl_buffer_interface drm_buffer_interface = {
buffer_damage,
buffer_destroy
};
@@ -83,14 +87,6 @@ drm_create_buffer(struct wl_client *client, struct wl_drm *drm,
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) {
@@ -114,16 +110,12 @@ drm_create_buffer(struct wl_client *client, struct wl_drm *drm,
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);
+ buffer->driver_buffer =
+ drm->callbacks->reference_buffer(drm->user_data, name,
+ width, height,
+ stride, visual);
- if (buffer->image == NULL) {
+ if (buffer->driver_buffer == NULL) {
/* FIXME: Define a real exception event instead of
* abusing this one */
wl_client_post_event(client,
@@ -136,7 +128,7 @@ drm_create_buffer(struct wl_client *client, struct wl_drm *drm,
buffer->buffer.resource.object.id = id;
buffer->buffer.resource.object.interface = &wl_buffer_interface;
buffer->buffer.resource.object.implementation = (void (**)(void))
- &buffer_interface;
+ &drm_buffer_interface;
buffer->buffer.resource.destroy = destroy_buffer;
@@ -147,7 +139,7 @@ static void
drm_authenticate(struct wl_client *client,
struct wl_drm *drm, uint32_t id)
{
- if (drm->authenticate(drm->edisp, id) < 0)
+ if (drm->callbacks->authenticate(drm->user_data, id) < 0)
wl_client_post_event(client,
(struct wl_object *) drm->display,
WL_DISPLAY_INVALID_OBJECT, 0);
@@ -162,9 +154,7 @@ const static struct wl_drm_interface drm_interface = {
};
static void
-post_drm_device(struct wl_client *client,
- struct wl_object *global,
- uint32_t version)
+post_drm_device(struct wl_client *client, struct wl_object *global)
{
struct wl_drm *drm = (struct wl_drm *) global;
@@ -172,17 +162,17 @@ post_drm_device(struct wl_client *client,
}
struct wl_drm *
-wayland_drm_init(struct wl_display *display, _EGLDisplay *disp,
- authenticate_t authenticate, char *device_name)
+wayland_drm_init(struct wl_display *display, char *device_name,
+ struct wayland_drm_callbacks *callbacks, void *user_data)
{
struct wl_drm *drm;
drm = malloc(sizeof *drm);
drm->display = display;
- drm->edisp = disp;
- drm->authenticate = authenticate;
drm->device_name = strdup(device_name);
+ drm->callbacks = callbacks;
+ drm->user_data = user_data;
drm->object.interface = &wl_drm_interface;
drm->object.implementation = (void (**)(void)) &drm_interface;
@@ -193,7 +183,7 @@ wayland_drm_init(struct wl_display *display, _EGLDisplay *disp,
}
void
-wayland_drm_destroy(struct wl_drm *drm)
+wayland_drm_uninit(struct wl_drm *drm)
{
free(drm->device_name);
@@ -201,3 +191,18 @@ wayland_drm_destroy(struct wl_drm *drm)
free(drm);
}
+
+int
+wayland_buffer_is_drm(struct wl_buffer *buffer)
+{
+ return buffer->resource.object.implementation ==
+ (void (**)(void)) &drm_buffer_interface;
+}
+
+void *
+wayland_drm_buffer_get_buffer(struct wl_buffer *buffer_base)
+{
+ struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) buffer_base;
+
+ return buffer->driver_buffer;
+}