1 From 29c760d8bb6338679abaf8a30549341bd181cc51 Mon Sep 17 00:00:00 2001
2 From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
3 Date: Thu, 18 Jul 2013 15:11:25 +0300
4 Subject: [PATCH 3/4] egl: Update to Wayland 1.2 server API
6 Since Wayland 1.2, struct wl_buffer and a few functions are deprecated.
8 References to wl_buffer are replaced with wl_resource and some getter
9 functions and calls to deprecated functions are replaced with the proper
10 new API. The latter changes are related to resource versioning.
12 Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
14 docs/specs/WL_bind_wayland_display.spec | 8 ++-
15 include/EGL/eglmesaext.h | 6 +-
16 src/egl/drivers/dri2/egl_dri2.c | 28 +++++----
17 src/egl/drivers/dri2/egl_dri2.h | 1 -
18 src/egl/main/eglapi.c | 2 +-
19 src/egl/main/eglapi.h | 2 +-
20 src/egl/wayland/wayland-drm/wayland-drm.c | 66 +++++++++++++---------
21 src/egl/wayland/wayland-drm/wayland-drm.h | 13 +++--
22 .../state_trackers/egl/common/egl_g3d_api.c | 2 +-
23 .../state_trackers/egl/common/egl_g3d_image.c | 4 +-
24 .../egl/common/native_wayland_bufmgr.h | 6 +-
25 .../egl/common/native_wayland_drm_bufmgr.c | 25 +++++---
26 src/gbm/backends/dri/gbm_dri.c | 5 +-
27 13 files changed, 99 insertions(+), 69 deletions(-)
29 diff --git a/docs/specs/WL_bind_wayland_display.spec b/docs/specs/WL_bind_wayland_display.spec
30 index 02bd6ea..8f0083c 100644
31 --- a/docs/specs/WL_bind_wayland_display.spec
32 +++ b/docs/specs/WL_bind_wayland_display.spec
33 @@ -17,7 +17,7 @@ Status
37 - Version 1, March 1, 2011
38 + Version 5, July 16, 2013
42 @@ -57,7 +57,7 @@ New Procedures and Functions
43 struct wl_display *display);
45 EGLBoolean eglQueryWaylandBufferWL(EGLDisplay dpy,
46 - struct wl_buffer *buffer,
47 + struct wl_resource *buffer,
48 EGLint attribute, EGLint *value);
51 @@ -173,3 +173,7 @@ Revision History
52 Use EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB, and EGL_TEXTURE_RGBA,
53 and just define the new YUV texture formats. Add support for
54 EGL_WIDTH and EGL_HEIGHT in the query attributes (Kristian Høgsberg)
55 + Version 5, July 16, 2013
56 + Change eglQueryWaylandBufferWL to take a resource pointer to the
57 + buffer instead of a pointer to a struct wl_buffer, as the latter has
58 + been deprecated. (Ander Conselvan de Oliveira)
59 diff --git a/include/EGL/eglmesaext.h b/include/EGL/eglmesaext.h
60 index d476d18..e0eae28 100644
61 --- a/include/EGL/eglmesaext.h
62 +++ b/include/EGL/eglmesaext.h
63 @@ -120,15 +120,15 @@ typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDRMDISPLAYMESA) (int fd);
64 #define EGL_TEXTURE_Y_XUXV_WL 0x31D9
69 #ifdef EGL_EGLEXT_PROTOTYPES
70 EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
71 EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
72 -EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_buffer *buffer, EGLint attribute, EGLint *value);
73 +EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
75 typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
76 typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
77 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_buffer *buffer, EGLint attribute, EGLint *value);
78 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
82 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
83 index 52fcb3f..bdbb450 100644
84 --- a/src/egl/drivers/dri2/egl_dri2.c
85 +++ b/src/egl/drivers/dri2/egl_dri2.c
90 +#ifdef HAVE_WAYLAND_PLATFORM
91 +#include "wayland-drm.h"
94 const __DRIuseInvalidateExtension use_invalidate = {
95 { __DRI_USE_INVALIDATE, 1 }
97 @@ -1195,7 +1199,7 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
98 EGLClientBuffer _buffer,
99 const EGLint *attr_list)
101 - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
102 + struct wl_drm_buffer *buffer;
103 struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
104 const struct wl_drm_components_descriptor *f;
105 __DRIimage *dri_image;
106 @@ -1203,7 +1207,8 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
110 - if (!wayland_buffer_is_drm(&buffer->buffer))
111 + buffer = wayland_drm_buffer_get((struct wl_resource *) _buffer);
115 err = _eglParseImageAttribList(&attrs, disp, attr_list);
116 @@ -1508,8 +1513,8 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name, int fd,
119 img = dri2_dpy->image->createImageFromNames(dri2_dpy->dri_screen,
120 - buffer->buffer.width,
121 - buffer->buffer.height,
127 @@ -1517,8 +1522,8 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name, int fd,
130 img = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
131 - buffer->buffer.width,
132 - buffer->buffer.height,
138 @@ -1607,13 +1612,14 @@ dri2_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
141 dri2_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp,
142 - struct wl_buffer *_buffer,
143 + struct wl_resource *buffer_resource,
144 EGLint attribute, EGLint *value)
146 - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
147 + struct wl_drm_buffer *buffer;
148 const struct wl_drm_components_descriptor *format;
150 - if (!wayland_buffer_is_drm(&buffer->buffer))
151 + buffer = wayland_drm_buffer_get(buffer_resource);
155 format = buffer->driver_format;
156 @@ -1622,10 +1628,10 @@ dri2_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp,
157 *value = format->components;
160 - *value = buffer->buffer.width;
161 + *value = buffer->width;
164 - *value = buffer->buffer.height;
165 + *value = buffer->height;
169 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
170 index 6dfdf94..fba5f81 100644
171 --- a/src/egl/drivers/dri2/egl_dri2.h
172 +++ b/src/egl/drivers/dri2/egl_dri2.h
175 #ifdef HAVE_WAYLAND_PLATFORM
176 #include <wayland-client.h>
177 -#include "wayland-drm.h"
178 #include "wayland-egl-priv.h"
181 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
182 index 4a9831b..a788295 100644
183 --- a/src/egl/main/eglapi.c
184 +++ b/src/egl/main/eglapi.c
185 @@ -1571,7 +1571,7 @@ eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
188 EGLBoolean EGLAPIENTRY
189 -eglQueryWaylandBufferWL(EGLDisplay dpy,struct wl_buffer *buffer,
190 +eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer,
191 EGLint attribute, EGLint *value)
193 _EGLDisplay *disp = _eglLockDisplay(dpy);
194 diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h
195 index ee382d0..4a4f976 100644
196 --- a/src/egl/main/eglapi.h
197 +++ b/src/egl/main/eglapi.h
198 @@ -123,7 +123,7 @@ typedef EGLBoolean (*ExportDRMImageMESA_t)(_EGLDriver *drv, _EGLDisplay *disp, _
200 typedef EGLBoolean (*BindWaylandDisplayWL_t)(_EGLDriver *drv, _EGLDisplay *disp, struct wl_display *display);
201 typedef EGLBoolean (*UnbindWaylandDisplayWL_t)(_EGLDriver *drv, _EGLDisplay *disp, struct wl_display *display);
202 -typedef EGLBoolean (*QueryWaylandBufferWL_t)(_EGLDriver *drv, _EGLDisplay *displ, struct wl_buffer *buffer, EGLint attribute, EGLint *value);
203 +typedef EGLBoolean (*QueryWaylandBufferWL_t)(_EGLDriver *drv, _EGLDisplay *displ, struct wl_resource *buffer, EGLint attribute, EGLint *value);
206 typedef EGLBoolean (*PostSubBufferNV_t)(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surface, EGLint x, EGLint y, EGLint width, EGLint height);
207 diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c
208 index 7e2073a..d317c5e 100644
209 --- a/src/egl/wayland/wayland-drm/wayland-drm.c
210 +++ b/src/egl/wayland/wayland-drm/wayland-drm.c
212 #include "wayland-drm.h"
213 #include "wayland-drm-server-protocol.h"
215 +#define MIN(x,y) (((x)<(y))?(x):(y))
218 struct wl_display *display;
220 @@ -86,8 +88,8 @@ create_buffer(struct wl_client *client, struct wl_resource *resource,
224 - buffer->buffer.width = width;
225 - buffer->buffer.height = height;
226 + buffer->width = width;
227 + buffer->height = height;
228 buffer->format = format;
229 buffer->offset[0] = offset0;
230 buffer->stride[0] = stride0;
231 @@ -104,16 +106,17 @@ create_buffer(struct wl_client *client, struct wl_resource *resource,
235 - buffer->buffer.resource.object.id = id;
236 - buffer->buffer.resource.object.interface = &wl_buffer_interface;
237 - buffer->buffer.resource.object.implementation =
238 - (void (**)(void)) &drm_buffer_interface;
239 - buffer->buffer.resource.data = buffer;
241 - buffer->buffer.resource.destroy = destroy_buffer;
242 - buffer->buffer.resource.client = resource->client;
244 + wl_resource_create(client, &wl_buffer_interface, 1, id);
245 + if (!buffer->resource) {
246 + wl_resource_post_no_memory(resource);
251 - wl_client_add_resource(resource->client, &buffer->buffer.resource);
252 + wl_resource_set_implementation(buffer->resource,
253 + (void (**)(void)) &drm_buffer_interface,
254 + buffer, destroy_buffer);
258 @@ -208,8 +211,15 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id)
259 struct wl_resource *resource;
260 uint32_t capabilities;
262 - resource = wl_client_add_object(client, &wl_drm_interface,
263 - &drm_interface, id, data);
264 + resource = wl_resource_create(client, &wl_drm_interface,
265 + MIN(version, 2), id);
267 + wl_client_post_no_memory(client);
271 + wl_resource_set_implementation(resource, &drm_interface, data, NULL);
273 wl_resource_post_event(resource, WL_DRM_DEVICE, drm->device_name);
274 wl_resource_post_event(resource, WL_DRM_FORMAT,
275 WL_DRM_FORMAT_ARGB8888);
276 @@ -232,6 +242,19 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id)
277 wl_resource_post_event(resource, WL_DRM_CAPABILITIES, capabilities);
280 +struct wl_drm_buffer *
281 +wayland_drm_buffer_get(struct wl_resource *resource)
283 + if (resource == NULL)
286 + if (wl_resource_instance_of(resource, &wl_buffer_interface,
287 + &drm_buffer_interface))
288 + return wl_resource_get_user_data(resource);
294 wayland_drm_init(struct wl_display *display, char *device_name,
295 struct wayland_drm_callbacks *callbacks, void *user_data,
296 @@ -247,7 +270,7 @@ wayland_drm_init(struct wl_display *display, char *device_name,
297 drm->user_data = user_data;
300 - wl_display_add_global(display, &wl_drm_interface, drm, bind_drm);
301 + wl_global_create(display, &wl_drm_interface, 2, drm, bind_drm);
305 @@ -262,25 +285,14 @@ wayland_drm_uninit(struct wl_drm *drm)
310 -wayland_buffer_is_drm(struct wl_buffer *buffer)
312 - return buffer->resource.object.implementation ==
313 - (void (**)(void)) &drm_buffer_interface;
317 -wayland_drm_buffer_get_format(struct wl_buffer *buffer_base)
318 +wayland_drm_buffer_get_format(struct wl_drm_buffer *buffer)
320 - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) buffer_base;
322 return buffer->format;
326 -wayland_drm_buffer_get_buffer(struct wl_buffer *buffer_base)
327 +wayland_drm_buffer_get_buffer(struct wl_drm_buffer *buffer)
329 - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) buffer_base;
331 return buffer->driver_buffer;
333 diff --git a/src/egl/wayland/wayland-drm/wayland-drm.h b/src/egl/wayland/wayland-drm/wayland-drm.h
334 index 335073a..ca04882 100644
335 --- a/src/egl/wayland/wayland-drm/wayland-drm.h
336 +++ b/src/egl/wayland/wayland-drm/wayland-drm.h
337 @@ -70,8 +70,9 @@ enum wl_drm_format {
340 struct wl_drm_buffer {
341 - struct wl_buffer buffer;
342 + struct wl_resource *resource;
344 + int32_t width, height;
346 const void *driver_format;
348 @@ -90,6 +91,9 @@ struct wayland_drm_callbacks {
350 enum { WAYLAND_DRM_PRIME = 0x01 };
352 +struct wl_drm_buffer *
353 +wayland_drm_buffer_get(struct wl_resource *resource);
356 wayland_drm_init(struct wl_display *display, char *device_name,
357 struct wayland_drm_callbacks *callbacks, void *user_data,
358 @@ -98,13 +102,10 @@ wayland_drm_init(struct wl_display *display, char *device_name,
360 wayland_drm_uninit(struct wl_drm *drm);
363 -wayland_buffer_is_drm(struct wl_buffer *buffer);
366 -wayland_drm_buffer_get_format(struct wl_buffer *buffer_base);
367 +wayland_drm_buffer_get_format(struct wl_drm_buffer *buffer);
370 -wayland_drm_buffer_get_buffer(struct wl_buffer *buffer);
371 +wayland_drm_buffer_get_buffer(struct wl_drm_buffer *buffer);
374 diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_api.c b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
375 index 59187a9..46a3245 100644
376 --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c
377 +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
378 @@ -874,7 +874,7 @@ egl_g3d_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *dpy,
381 egl_g3d_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *dpy,
382 - struct wl_buffer *buffer,
383 + struct wl_resource *buffer,
384 EGLint attribute, EGLint *value)
386 struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
387 diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_image.c b/src/gallium/state_trackers/egl/common/egl_g3d_image.c
388 index aa1980b..c459dc3 100644
389 --- a/src/gallium/state_trackers/egl/common/egl_g3d_image.c
390 +++ b/src/gallium/state_trackers/egl/common/egl_g3d_image.c
391 @@ -183,7 +183,7 @@ egl_g3d_reference_drm_buffer(_EGLDisplay *dpy, EGLint name,
392 #ifdef EGL_WL_bind_wayland_display
394 static struct pipe_resource *
395 -egl_g3d_reference_wl_buffer(_EGLDisplay *dpy, struct wl_buffer *buffer,
396 +egl_g3d_reference_wl_buffer(_EGLDisplay *dpy, struct wl_resource *buffer,
397 _EGLImage *img, const EGLint *attribs)
399 struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
400 @@ -253,7 +253,7 @@ egl_g3d_create_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx,
401 #ifdef EGL_WL_bind_wayland_display
402 case EGL_WAYLAND_BUFFER_WL:
403 ptex = egl_g3d_reference_wl_buffer(dpy,
404 - (struct wl_buffer *) buffer, &gimg->base, attribs);
405 + (struct wl_resource *) buffer, &gimg->base, attribs);
408 #ifdef EGL_ANDROID_image_native_buffer
409 diff --git a/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h b/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h
410 index dd27828..eb324bf 100644
411 --- a/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h
412 +++ b/src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h
415 struct native_display;
419 struct pipe_resource;
421 struct native_display_wayland_bufmgr {
422 @@ -38,11 +38,11 @@ struct native_display_wayland_bufmgr {
423 struct wl_display *wl_dpy);
425 struct pipe_resource *(*buffer_get_resource)(struct native_display *ndpy,
426 - struct wl_buffer *buffer);
427 + struct wl_resource *buffer);
430 boolean (*query_buffer)(struct native_display *ndpy,
431 - struct wl_buffer *buffer,
432 + struct wl_resource *buffer,
433 int attribute, int *value);
436 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
437 index 1603a3a..9b69cb9 100644
438 --- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
439 +++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
440 @@ -70,8 +70,8 @@ wayland_drm_bufmgr_reference_buffer(void *user_data, uint32_t name, int fd,
441 templ.target = PIPE_TEXTURE_2D;
443 templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
444 - templ.width0 = buffer->buffer.width;
445 - templ.height0 = buffer->buffer.height;
446 + templ.width0 = buffer->width;
447 + templ.height0 = buffer->height;
449 templ.array_size = 1;
451 @@ -137,22 +137,29 @@ wayland_drm_bufmgr_unbind_display(struct native_display *ndpy,
453 static struct pipe_resource *
454 wayland_drm_bufmgr_wl_buffer_get_resource(struct native_display *ndpy,
455 - struct wl_buffer *buffer)
456 + struct wl_resource *buffer_resource)
458 + struct wl_drm_buffer *buffer = wayland_drm_buffer_get(buffer_resource);
463 return wayland_drm_buffer_get_buffer(buffer);
467 wayland_drm_bufmgr_query_buffer(struct native_display *ndpy,
468 - struct wl_buffer *_buffer,
469 + struct wl_resource *buffer_resource,
470 EGLint attribute, EGLint *value)
472 - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
473 - struct pipe_resource *resource = buffer->driver_buffer;
474 + struct wl_drm_buffer *buffer = wayland_drm_buffer_get(buffer_resource);
475 + struct pipe_resource *resource;
477 - if (!wayland_buffer_is_drm(&buffer->buffer))
481 + resource = buffer->driver_buffer;
484 case EGL_TEXTURE_FORMAT:
485 switch (resource->format) {
486 @@ -166,10 +173,10 @@ wayland_drm_bufmgr_query_buffer(struct native_display *ndpy,
490 - *value = buffer->buffer.width;
491 + *value = buffer->width;
494 - *value = buffer->buffer.height;
495 + *value = buffer->height;
499 diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
500 index a3a0530..f7da79c 100644
501 --- a/src/gbm/backends/dri/gbm_dri.c
502 +++ b/src/gbm/backends/dri/gbm_dri.c
503 @@ -374,9 +374,10 @@ gbm_dri_bo_import(struct gbm_device *gbm,
504 #if HAVE_WAYLAND_PLATFORM
505 case GBM_BO_IMPORT_WL_BUFFER:
507 - struct wl_drm_buffer *wb = (struct wl_drm_buffer *) buffer;
508 + struct wl_drm_buffer *wb;
510 - if (!wayland_buffer_is_drm(buffer))
511 + wb = wayland_drm_buffer_get((struct wl_resource *) buffer);
515 image = wb->driver_buffer;