Since Wayland 1.2, struct wl_buffer and a few functions are deprecated.
References to wl_buffer are replaced with wl_resource and some getter
functions and calls to deprecated functions are replaced with the proper
new API. The latter changes are related to resource versioning.
Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Version
- Version 1, March 1, 2011
+ Version 5, July 16, 2013
Number
struct wl_display *display);
EGLBoolean eglQueryWaylandBufferWL(EGLDisplay dpy,
- struct wl_buffer *buffer,
+ struct wl_resource *buffer,
EGLint attribute, EGLint *value);
New Tokens
Use EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB, and EGL_TEXTURE_RGBA,
and just define the new YUV texture formats. Add support for
EGL_WIDTH and EGL_HEIGHT in the query attributes (Kristian Høgsberg)
+ Version 5, July 16, 2013
+ Change eglQueryWaylandBufferWL to take a resource pointer to the
+ buffer instead of a pointer to a struct wl_buffer, as the latter has
+ been deprecated. (Ander Conselvan de Oliveira)
#define EGL_TEXTURE_Y_XUXV_WL 0x31D9
struct wl_display;
-struct wl_buffer;
+struct wl_resource;
#ifdef EGL_EGLEXT_PROTOTYPES
EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
-EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_buffer *buffer, EGLint attribute, EGLint *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
#endif
typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
-typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_buffer *buffer, EGLint attribute, EGLint *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
#endif
#include "egl_dri2.h"
+#ifdef HAVE_WAYLAND_PLATFORM
+#include "wayland-drm.h"
+#endif
+
const __DRIuseInvalidateExtension use_invalidate = {
{ __DRI_USE_INVALIDATE, 1 }
};
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;
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);
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,
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,
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;
*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;
}
#ifdef HAVE_WAYLAND_PLATFORM
#include <wayland-client.h>
-#include "wayland-drm.h"
#include "wayland-egl-priv.h"
#endif
}
EGLBoolean EGLAPIENTRY
-eglQueryWaylandBufferWL(EGLDisplay dpy,struct wl_buffer *buffer,
+eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer,
EGLint attribute, EGLint *value)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
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);
#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;
}
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;
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
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);
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,
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;
}
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;
}
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];
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,
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
static EGLBoolean
egl_g3d_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *dpy,
- struct wl_buffer *buffer,
+ struct wl_resource *buffer,
EGLint attribute, EGLint *value)
{
struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
#ifdef EGL_WL_bind_wayland_display
static struct pipe_resource *
-egl_g3d_reference_wl_buffer(_EGLDisplay *dpy, struct wl_buffer *buffer,
+egl_g3d_reference_wl_buffer(_EGLDisplay *dpy, struct wl_resource *buffer,
_EGLImage *img, const EGLint *attribs)
{
struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
#ifdef EGL_WL_bind_wayland_display
case EGL_WAYLAND_BUFFER_WL:
ptex = egl_g3d_reference_wl_buffer(dpy,
- (struct wl_buffer *) buffer, &gimg->base, attribs);
+ (struct wl_resource *) buffer, &gimg->base, attribs);
break;
#endif
#ifdef EGL_ANDROID_image_native_buffer
struct native_display;
struct wl_display;
-struct wl_buffer;
+struct wl_resource;
struct pipe_resource;
struct native_display_wayland_bufmgr {
struct wl_display *wl_dpy);
struct pipe_resource *(*buffer_get_resource)(struct native_display *ndpy,
- struct wl_buffer *buffer);
+ struct wl_resource *buffer);
boolean (*query_buffer)(struct native_display *ndpy,
- struct wl_buffer *buffer,
+ struct wl_resource *buffer,
int attribute, int *value);
};
templ.target = PIPE_TEXTURE_2D;
templ.format = pf;
templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
- templ.width0 = buffer->buffer.width;
- templ.height0 = buffer->buffer.height;
+ templ.width0 = buffer->width;
+ templ.height0 = buffer->height;
templ.depth0 = 1;
templ.array_size = 1;
static struct pipe_resource *
wayland_drm_bufmgr_wl_buffer_get_resource(struct native_display *ndpy,
- struct wl_buffer *buffer)
+ struct wl_resource *buffer_resource)
{
+ struct wl_drm_buffer *buffer = wayland_drm_buffer_get(buffer_resource);
+
+ if (!buffer)
+ return NULL;
+
return wayland_drm_buffer_get_buffer(buffer);
}
static EGLBoolean
wayland_drm_bufmgr_query_buffer(struct native_display *ndpy,
- struct wl_buffer *_buffer,
+ struct wl_resource *buffer_resource,
EGLint attribute, EGLint *value)
{
- struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
- struct pipe_resource *resource = buffer->driver_buffer;
+ struct wl_drm_buffer *buffer = wayland_drm_buffer_get(buffer_resource);
+ struct pipe_resource *resource;
- if (!wayland_buffer_is_drm(&buffer->buffer))
+ if (!buffer)
return EGL_FALSE;
+ resource = buffer->driver_buffer;
+
switch (attribute) {
case EGL_TEXTURE_FORMAT:
switch (resource->format) {
return EGL_FALSE;
}
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;
default:
return EGL_FALSE;
#if HAVE_WAYLAND_PLATFORM
case GBM_BO_IMPORT_WL_BUFFER:
{
- struct wl_drm_buffer *wb = (struct wl_drm_buffer *) buffer;
+ struct wl_drm_buffer *wb;
- if (!wayland_buffer_is_drm(buffer))
+ wb = wayland_drm_buffer_get((struct wl_resource *) buffer);
+ if (!wb)
return NULL;
image = wb->driver_buffer;