diff options
Diffstat (limited to 'src/egl')
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 28 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.h | 1 | ||||
-rw-r--r-- | src/egl/main/eglapi.c | 2 | ||||
-rw-r--r-- | src/egl/main/eglapi.h | 2 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/wayland-drm.c | 66 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/wayland-drm.h | 13 |
6 files changed, 65 insertions, 47 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 81ae271bb55..04ab5649e52 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -42,6 +42,10 @@ #include "egl_dri2.h" +#ifdef HAVE_WAYLAND_PLATFORM +#include "wayland-drm.h" +#endif + const __DRIuseInvalidateExtension use_invalidate = { { __DRI_USE_INVALIDATE, 1 } }; @@ -1200,7 +1204,7 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx, EGLClientBuffer _buffer, const EGLint *attr_list) { - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer; + struct wl_drm_buffer *buffer; struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); const struct wl_drm_components_descriptor *f; __DRIimage *dri_image; @@ -1208,7 +1212,8 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx, EGLint err; int32_t plane; - if (!wayland_buffer_is_drm(&buffer->buffer)) + buffer = wayland_drm_buffer_get((struct wl_resource *) _buffer); + if (!buffer) return NULL; err = _eglParseImageAttribList(&attrs, disp, attr_list); @@ -1770,8 +1775,8 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name, int fd, if (fd == -1) img = dri2_dpy->image->createImageFromNames(dri2_dpy->dri_screen, - buffer->buffer.width, - buffer->buffer.height, + buffer->width, + buffer->height, buffer->format, (int*)&name, 1, buffer->stride, @@ -1779,8 +1784,8 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name, int fd, NULL); else img = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen, - buffer->buffer.width, - buffer->buffer.height, + buffer->width, + buffer->height, buffer->format, &fd, 1, buffer->stride, @@ -1869,13 +1874,14 @@ dri2_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp, static EGLBoolean dri2_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp, - struct wl_buffer *_buffer, + struct wl_resource *buffer_resource, EGLint attribute, EGLint *value) { - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer; + struct wl_drm_buffer *buffer; const struct wl_drm_components_descriptor *format; - if (!wayland_buffer_is_drm(&buffer->buffer)) + buffer = wayland_drm_buffer_get(buffer_resource); + if (!buffer) return EGL_FALSE; format = buffer->driver_format; @@ -1884,10 +1890,10 @@ dri2_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp, *value = format->components; return EGL_TRUE; case EGL_WIDTH: - *value = buffer->buffer.width; + *value = buffer->width; return EGL_TRUE; case EGL_HEIGHT: - *value = buffer->buffer.height; + *value = buffer->height; return EGL_TRUE; } diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 6dfdf946fc8..fba5f81af8c 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -37,7 +37,6 @@ #ifdef HAVE_WAYLAND_PLATFORM #include <wayland-client.h> -#include "wayland-drm.h" #include "wayland-egl-priv.h" #endif diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 96c9e06c4ab..2d8653f04cb 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -1576,7 +1576,7 @@ eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) } EGLBoolean EGLAPIENTRY -eglQueryWaylandBufferWL(EGLDisplay dpy,struct wl_buffer *buffer, +eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value) { _EGLDisplay *disp = _eglLockDisplay(dpy); diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h index ee382d00e4a..4a4f9765219 100644 --- a/src/egl/main/eglapi.h +++ b/src/egl/main/eglapi.h @@ -123,7 +123,7 @@ typedef EGLBoolean (*ExportDRMImageMESA_t)(_EGLDriver *drv, _EGLDisplay *disp, _ struct wl_display; typedef EGLBoolean (*BindWaylandDisplayWL_t)(_EGLDriver *drv, _EGLDisplay *disp, struct wl_display *display); typedef EGLBoolean (*UnbindWaylandDisplayWL_t)(_EGLDriver *drv, _EGLDisplay *disp, struct wl_display *display); -typedef EGLBoolean (*QueryWaylandBufferWL_t)(_EGLDriver *drv, _EGLDisplay *displ, struct wl_buffer *buffer, EGLint attribute, EGLint *value); +typedef EGLBoolean (*QueryWaylandBufferWL_t)(_EGLDriver *drv, _EGLDisplay *displ, struct wl_resource *buffer, EGLint attribute, EGLint *value); #endif typedef EGLBoolean (*PostSubBufferNV_t)(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surface, EGLint x, EGLint y, EGLint width, EGLint height); diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c index 7e2073a73f3..d317c5e1c46 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.c +++ b/src/egl/wayland/wayland-drm/wayland-drm.c @@ -37,6 +37,8 @@ #include "wayland-drm.h" #include "wayland-drm-server-protocol.h" +#define MIN(x,y) (((x)<(y))?(x):(y)) + struct wl_drm { struct wl_display *display; @@ -86,8 +88,8 @@ create_buffer(struct wl_client *client, struct wl_resource *resource, } buffer->drm = drm; - buffer->buffer.width = width; - buffer->buffer.height = height; + buffer->width = width; + buffer->height = height; buffer->format = format; buffer->offset[0] = offset0; buffer->stride[0] = stride0; @@ -104,16 +106,17 @@ create_buffer(struct wl_client *client, struct wl_resource *resource, return; } - buffer->buffer.resource.object.id = id; - buffer->buffer.resource.object.interface = &wl_buffer_interface; - buffer->buffer.resource.object.implementation = - (void (**)(void)) &drm_buffer_interface; - buffer->buffer.resource.data = buffer; - - buffer->buffer.resource.destroy = destroy_buffer; - buffer->buffer.resource.client = resource->client; + buffer->resource = + wl_resource_create(client, &wl_buffer_interface, 1, id); + if (!buffer->resource) { + wl_resource_post_no_memory(resource); + free(buffer); + return; + } - wl_client_add_resource(resource->client, &buffer->buffer.resource); + wl_resource_set_implementation(buffer->resource, + (void (**)(void)) &drm_buffer_interface, + buffer, destroy_buffer); } static void @@ -208,8 +211,15 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id) struct wl_resource *resource; uint32_t capabilities; - resource = wl_client_add_object(client, &wl_drm_interface, - &drm_interface, id, data); + resource = wl_resource_create(client, &wl_drm_interface, + MIN(version, 2), id); + if (!resource) { + wl_client_post_no_memory(client); + return; + } + + wl_resource_set_implementation(resource, &drm_interface, data, NULL); + wl_resource_post_event(resource, WL_DRM_DEVICE, drm->device_name); wl_resource_post_event(resource, WL_DRM_FORMAT, WL_DRM_FORMAT_ARGB8888); @@ -232,6 +242,19 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id) wl_resource_post_event(resource, WL_DRM_CAPABILITIES, capabilities); } +struct wl_drm_buffer * +wayland_drm_buffer_get(struct wl_resource *resource) +{ + if (resource == NULL) + return NULL; + + if (wl_resource_instance_of(resource, &wl_buffer_interface, + &drm_buffer_interface)) + return wl_resource_get_user_data(resource); + else + return NULL; +} + struct wl_drm * wayland_drm_init(struct wl_display *display, char *device_name, struct wayland_drm_callbacks *callbacks, void *user_data, @@ -247,7 +270,7 @@ wayland_drm_init(struct wl_display *display, char *device_name, drm->user_data = user_data; drm->flags = flags; - wl_display_add_global(display, &wl_drm_interface, drm, bind_drm); + wl_global_create(display, &wl_drm_interface, 2, drm, bind_drm); return drm; } @@ -262,25 +285,14 @@ wayland_drm_uninit(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; -} - uint32_t -wayland_drm_buffer_get_format(struct wl_buffer *buffer_base) +wayland_drm_buffer_get_format(struct wl_drm_buffer *buffer) { - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) buffer_base; - return buffer->format; } void * -wayland_drm_buffer_get_buffer(struct wl_buffer *buffer_base) +wayland_drm_buffer_get_buffer(struct wl_drm_buffer *buffer) { - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) buffer_base; - return buffer->driver_buffer; } diff --git a/src/egl/wayland/wayland-drm/wayland-drm.h b/src/egl/wayland/wayland-drm/wayland-drm.h index 335073a879c..ca0488285bc 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.h +++ b/src/egl/wayland/wayland-drm/wayland-drm.h @@ -70,8 +70,9 @@ enum wl_drm_format { struct wl_drm; struct wl_drm_buffer { - struct wl_buffer buffer; + struct wl_resource *resource; struct wl_drm *drm; + int32_t width, height; uint32_t format; const void *driver_format; int32_t offset[3]; @@ -90,6 +91,9 @@ struct wayland_drm_callbacks { enum { WAYLAND_DRM_PRIME = 0x01 }; +struct wl_drm_buffer * +wayland_drm_buffer_get(struct wl_resource *resource); + struct wl_drm * wayland_drm_init(struct wl_display *display, char *device_name, struct wayland_drm_callbacks *callbacks, void *user_data, @@ -98,13 +102,10 @@ wayland_drm_init(struct wl_display *display, char *device_name, void wayland_drm_uninit(struct wl_drm *drm); -int -wayland_buffer_is_drm(struct wl_buffer *buffer); - uint32_t -wayland_drm_buffer_get_format(struct wl_buffer *buffer_base); +wayland_drm_buffer_get_format(struct wl_drm_buffer *buffer); void * -wayland_drm_buffer_get_buffer(struct wl_buffer *buffer); +wayland_drm_buffer_get_buffer(struct wl_drm_buffer *buffer); #endif |