[Mesa-dev] [PATCH mesa 3/3] egl: Update to Wayland 1.2 server API

Ian Romanick idr at freedesktop.org
Wed Aug 7 13:27:07 PDT 2013


On 08/07/2013 10:39 AM, Kristian Høgsberg wrote:
> On Thu, Jul 18, 2013 at 03:11:25PM +0300, Ander Conselvan de Oliveira wrote:
>> 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 at intel.com>
>
> Thanks Ander, this and the two previous patches pushed.

If any patches need to be picked back to the 9.2 branch (or 9.1 branch), 
please send them to mesa-stable.  I don't follow the Wayland work very 
closely, so I defer to Kristian's guidance.

> Kristian
>
>> ---
>>   docs/specs/WL_bind_wayland_display.spec            |  8 ++-
>>   include/EGL/eglmesaext.h                           |  6 +-
>>   src/egl/drivers/dri2/egl_dri2.c                    | 28 +++++----
>>   src/egl/drivers/dri2/egl_dri2.h                    |  1 -
>>   src/egl/main/eglapi.c                              |  2 +-
>>   src/egl/main/eglapi.h                              |  2 +-
>>   src/egl/wayland/wayland-drm/wayland-drm.c          | 66 +++++++++++++---------
>>   src/egl/wayland/wayland-drm/wayland-drm.h          | 13 +++--
>>   .../state_trackers/egl/common/egl_g3d_api.c        |  2 +-
>>   .../state_trackers/egl/common/egl_g3d_image.c      |  4 +-
>>   .../egl/common/native_wayland_bufmgr.h             |  6 +-
>>   .../egl/common/native_wayland_drm_bufmgr.c         | 25 +++++---
>>   src/gbm/backends/dri/gbm_dri.c                     |  5 +-
>>   13 files changed, 99 insertions(+), 69 deletions(-)
>>
>> diff --git a/docs/specs/WL_bind_wayland_display.spec b/docs/specs/WL_bind_wayland_display.spec
>> index 02bd6ea..8f0083c 100644
>> --- a/docs/specs/WL_bind_wayland_display.spec
>> +++ b/docs/specs/WL_bind_wayland_display.spec
>> @@ -17,7 +17,7 @@ Status
>>
>>   Version
>>
>> -    Version 1, March 1, 2011
>> +    Version 5, July 16, 2013
>>
>>   Number
>>
>> @@ -57,7 +57,7 @@ New Procedures and Functions
>>                                            struct wl_display *display);
>>
>>       EGLBoolean eglQueryWaylandBufferWL(EGLDisplay dpy,
>> -                                       struct wl_buffer *buffer,
>> +                                       struct wl_resource *buffer,
>>                                          EGLint attribute, EGLint *value);
>>
>>   New Tokens
>> @@ -173,3 +173,7 @@ Revision History
>>           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)
>> diff --git a/include/EGL/eglmesaext.h b/include/EGL/eglmesaext.h
>> index d476d18..e0eae28 100644
>> --- a/include/EGL/eglmesaext.h
>> +++ b/include/EGL/eglmesaext.h
>> @@ -120,15 +120,15 @@ typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDRMDISPLAYMESA) (int fd);
>>   #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
>>
>> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
>> index 1bce314..44fd8a8 100644
>> --- a/src/egl/drivers/dri2/egl_dri2.c
>> +++ b/src/egl/drivers/dri2/egl_dri2.c
>> @@ -41,6 +41,10 @@
>>
>>   #include "egl_dri2.h"
>>
>> +#ifdef HAVE_WAYLAND_PLATFORM
>> +#include "wayland-drm.h"
>> +#endif
>> +
>>   const __DRIuseInvalidateExtension use_invalidate = {
>>      { __DRI_USE_INVALIDATE, 1 }
>>   };
>> @@ -1195,7 +1199,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;
>> @@ -1203,7 +1207,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);
>> @@ -1508,8 +1513,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,
>> @@ -1517,8 +1522,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,
>> @@ -1607,13 +1612,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;
>> @@ -1622,10 +1628,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 6dfdf94..fba5f81 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 4a9831b..a788295 100644
>> --- a/src/egl/main/eglapi.c
>> +++ b/src/egl/main/eglapi.c
>> @@ -1571,7 +1571,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 ee382d0..4a4f976 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 7e2073a..d317c5e 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 335073a..ca04882 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
>> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_api.c b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
>> index 2e5424e..3ee0d67 100644
>> --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c
>> +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
>> @@ -874,7 +874,7 @@ egl_g3d_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *dpy,
>>
>>   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);
>> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_image.c b/src/gallium/state_trackers/egl/common/egl_g3d_image.c
>> index aa1980b..c459dc3 100644
>> --- a/src/gallium/state_trackers/egl/common/egl_g3d_image.c
>> +++ b/src/gallium/state_trackers/egl/common/egl_g3d_image.c
>> @@ -183,7 +183,7 @@ egl_g3d_reference_drm_buffer(_EGLDisplay *dpy, EGLint name,
>>   #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);
>> @@ -253,7 +253,7 @@ egl_g3d_create_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx,
>>   #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
>> diff --git a/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h b/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h
>> index dd27828..eb324bf 100644
>> --- a/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h
>> +++ b/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h
>> @@ -27,7 +27,7 @@
>>
>>   struct native_display;
>>   struct wl_display;
>> -struct wl_buffer;
>> +struct wl_resource;
>>   struct pipe_resource;
>>
>>   struct native_display_wayland_bufmgr {
>> @@ -38,11 +38,11 @@ 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);
>>   };
>>
>> diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
>> index 1603a3a..9b69cb9 100644
>> --- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
>> +++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
>> @@ -70,8 +70,8 @@ wayland_drm_bufmgr_reference_buffer(void *user_data, uint32_t name, int fd,
>>      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;
>>
>> @@ -137,22 +137,29 @@ wayland_drm_bufmgr_unbind_display(struct native_display *ndpy,
>>
>>   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) {
>> @@ -166,10 +173,10 @@ wayland_drm_bufmgr_query_buffer(struct native_display *ndpy,
>>            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;
>> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
>> index a3a0530..f7da79c 100644
>> --- a/src/gbm/backends/dri/gbm_dri.c
>> +++ b/src/gbm/backends/dri/gbm_dri.c
>> @@ -374,9 +374,10 @@ gbm_dri_bo_import(struct gbm_device *gbm,
>>   #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;
>> --
>> 1.8.1.2
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>



More information about the mesa-dev mailing list