diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 4a02838..3337e4a 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1094,10 +1094,10 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
    attrs.Height = buffer->height;
 
    switch (wayland_drm_buffer_get_format(buffer)) {
-   case WL_DRM_FORMAT_ARGB8888:
+   case WL_BUFFER_FORMAT_ARGB8888:
       format = __DRI_IMAGE_FORMAT_ARGB8888;
       break;
-   case WL_DRM_FORMAT_XRGB8888:
+   case WL_BUFFER_FORMAT_XRGB8888:
       format = __DRI_IMAGE_FORMAT_XRGB8888;
       break;
    default:
@@ -1272,10 +1272,10 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name,
    int dri_format;
 
    switch (format) {
-   case WL_DRM_FORMAT_ARGB8888:
+   case WL_BUFFER_FORMAT_ARGB8888:
       dri_format =__DRI_IMAGE_FORMAT_ARGB8888;
       break;
-   case WL_DRM_FORMAT_XRGB8888:
+   case WL_BUFFER_FORMAT_XRGB8888:
       dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
       break;
    default:
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index d291f0f..372da41 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -107,9 +107,9 @@ dri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
    dri2_surf->block_swap_buffers = EGL_FALSE;
 
    if (conf->AlphaSize == 0)
-      dri2_surf->format = WL_DRM_FORMAT_XRGB8888;
+      dri2_surf->format = WL_BUFFER_FORMAT_XRGB8888;
    else
-      dri2_surf->format = WL_DRM_FORMAT_ARGB8888;
+      dri2_surf->format = WL_BUFFER_FORMAT_ARGB8888;
 
    switch (type) {
    case EGL_WINDOW_BIT:
@@ -666,7 +666,7 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
 			   wl_egl_pixmap->width,
 			   wl_egl_pixmap->height,
 			   dri2_buf->dri_buffer->pitch,
-			   WL_DRM_FORMAT_ARGB8888);
+			   WL_BUFFER_FORMAT_ARGB8888);
 
    wl_attr_list[1] = wl_egl_pixmap->width;
    wl_attr_list[3] = wl_egl_pixmap->height;
@@ -767,15 +767,16 @@ drm_handle_device(void *data, struct wl_drm *drm, const char *device)
 }
 
 static void
-drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
+drm_handle_format(void *data, struct wl_drm *drm,
+		  uint32_t format, uint32_t flags)
 {
    struct dri2_egl_display *dri2_dpy = data;
 
    switch (format) {
-   case WL_DRM_FORMAT_ARGB8888:
+   case WL_BUFFER_FORMAT_ARGB8888:
       dri2_dpy->formats |= HAS_ARGB8888;
       break;
-   case WL_DRM_FORMAT_XRGB8888:
+   case WL_BUFFER_FORMAT_XRGB8888:
       dri2_dpy->formats |= HAS_XRGB8888;
       break;
    }
diff --git a/src/egl/wayland/wayland-drm/protocol/wayland-drm.xml b/src/egl/wayland/wayland-drm/protocol/wayland-drm.xml
index 89fd8f0..306f13a 100644
--- a/src/egl/wayland/wayland-drm/protocol/wayland-drm.xml
+++ b/src/egl/wayland/wayland-drm/protocol/wayland-drm.xml
@@ -36,70 +36,6 @@
       <entry name="invalid_name" value="2"/>
     </enum>
 
-    <enum name="format">
-      <!-- The drm format codes match the #defines in drm_fourcc.h.
-           The formats actually supported by the compositor will be
-           reported by the format event. -->
-      <entry name="c8" value="0x20203843"/>
-      <entry name="rgb332" value="0x38424752"/>
-      <entry name="bgr233" value="0x38524742"/>
-      <entry name="xrgb4444" value="0x32315258"/>
-      <entry name="xbgr4444" value="0x32314258"/>
-      <entry name="rgbx4444" value="0x32315852"/>
-      <entry name="bgrx4444" value="0x32315842"/>
-      <entry name="argb4444" value="0x32315241"/>
-      <entry name="abgr4444" value="0x32314241"/>
-      <entry name="rgba4444" value="0x32314152"/>
-      <entry name="bgra4444" value="0x32314142"/>
-      <entry name="xrgb1555" value="0x35315258"/>
-      <entry name="xbgr1555" value="0x35314258"/>
-      <entry name="rgbx5551" value="0x35315852"/>
-      <entry name="bgrx5551" value="0x35315842"/>
-      <entry name="argb1555" value="0x35315241"/>
-      <entry name="abgr1555" value="0x35314241"/>
-      <entry name="rgba5551" value="0x35314152"/>
-      <entry name="bgra5551" value="0x35314142"/>
-      <entry name="rgb565" value="0x36314752"/>
-      <entry name="bgr565" value="0x36314742"/>
-      <entry name="rgb888" value="0x34324752"/>
-      <entry name="bgr888" value="0x34324742"/>
-      <entry name="xrgb8888" value="0x34325258"/>
-      <entry name="xbgr8888" value="0x34324258"/>
-      <entry name="rgbx8888" value="0x34325852"/>
-      <entry name="bgrx8888" value="0x34325842"/>
-      <entry name="argb8888" value="0x34325241"/>
-      <entry name="abgr8888" value="0x34324241"/>
-      <entry name="rgba8888" value="0x34324152"/>
-      <entry name="bgra8888" value="0x34324142"/>
-      <entry name="xrgb2101010" value="0x30335258"/>
-      <entry name="xbgr2101010" value="0x30334258"/>
-      <entry name="rgbx1010102" value="0x30335852"/>
-      <entry name="bgrx1010102" value="0x30335842"/>
-      <entry name="argb2101010" value="0x30335241"/>
-      <entry name="abgr2101010" value="0x30334241"/>
-      <entry name="rgba1010102" value="0x30334152"/>
-      <entry name="bgra1010102" value="0x30334142"/>
-      <entry name="yuyv" value="0x56595559"/>
-      <entry name="yvyu" value="0x55595659"/>
-      <entry name="uyvy" value="0x59565955"/>
-      <entry name="vyuy" value="0x59555956"/>
-      <entry name="ayuv" value="0x56555941"/>
-      <entry name="nv12" value="0x3231564e"/>
-      <entry name="nv21" value="0x3132564e"/>
-      <entry name="nv16" value="0x3631564e"/>
-      <entry name="nv61" value="0x3136564e"/>
-      <entry name="yuv410" value="0x39565559"/>
-      <entry name="yvu410" value="0x39555659"/>
-      <entry name="yuv411" value="0x31315559"/>
-      <entry name="yvu411" value="0x31315659"/>
-      <entry name="yuv420" value="0x32315559"/>
-      <entry name="yvu420" value="0x32315659"/>
-      <entry name="yuv422" value="0x36315559"/>
-      <entry name="yvu422" value="0x36315659"/>
-      <entry name="yuv444" value="0x34325559"/>
-      <entry name="yvu444" value="0x34325659"/>
-    </enum>
-
     <!-- Call this request with the magic received from drmGetMagic().
          It will be passed on to the drmAuthMagic() or
          DRIAuthConnection() call.  This authentication must be
@@ -115,8 +51,24 @@
       <arg name="name" type="uint"/>
       <arg name="width" type="int"/>
       <arg name="height" type="int"/>
-      <arg name="stride" type="uint"/>
+      <arg name="stride" type="int"/>
+      <arg name="format" type="uint"/>
+    </request>
+
+    <!-- Create a wayland buffer for the named DRM buffer.  The DRM
+         surface must have a name using the flink ioctl -->
+    <request name="create_planar_buffer">
+      <arg name="id" type="new_id" interface="wl_buffer"/>
+      <arg name="name" type="uint"/>
+      <arg name="width" type="int"/>
+      <arg name="height" type="int"/>
       <arg name="format" type="uint"/>
+      <arg name="offset0" type="int"/>
+      <arg name="stride0" type="int"/>
+      <arg name="offset1" type="int"/>
+      <arg name="stride1" type="int"/>
+      <arg name="offset2" type="int"/>
+      <arg name="stride2" type="int"/>
     </request>
 
     <!-- Notification of the path of the drm device which is used by
@@ -128,12 +80,24 @@
       <arg name="name" type="string"/>
     </event>
 
+    <enum name="format">
+      <entry name="scanout" value="0x01"/>
+      <entry name="scalable" value="0x012"/>
+    </enum>
+
     <event name="format">
       <arg name="format" type="uint"/>
+      <arg name="flags" type="uint"/>
     </event>
 
     <!-- Raised if the authenticate request succeeded -->
     <event name="authenticated"/>
+
+    <event name="scanout">
+      <arg name="surface" type="object" interface="wl_surface"/>
+      <arg name="enable" type="int"/>
+    </event>
+
   </interface>
 
 </protocol>
diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c
index 5f831b3..e35a3d9 100644
--- a/src/egl/wayland/wayland-drm/wayland-drm.c
+++ b/src/egl/wayland/wayland-drm/wayland-drm.c
@@ -59,7 +59,6 @@ struct wl_drm {
 struct wl_drm_buffer {
 	struct wl_buffer buffer;
 	struct wl_drm *drm;
-	uint32_t format;
 
 	void *driver_buffer;
 };
@@ -103,14 +102,14 @@ const static struct wl_buffer_interface drm_buffer_interface = {
 static void
 drm_create_buffer(struct wl_client *client, struct wl_resource *resource,
 		  uint32_t id, uint32_t name, int32_t width, int32_t height,
-		  uint32_t stride, uint32_t format)
+		  int32_t stride, uint32_t format)
 {
 	struct wl_drm *drm = resource->data;
 	struct wl_drm_buffer *buffer;
 
 	switch (format) {
-	case WL_DRM_FORMAT_ARGB8888:
-	case WL_DRM_FORMAT_XRGB8888:
+	case WL_BUFFER_FORMAT_ARGB8888:
+	case WL_BUFFER_FORMAT_XRGB8888:
 		break;
 	default:
 		wl_resource_post_error(resource,
@@ -128,7 +127,7 @@ drm_create_buffer(struct wl_client *client, struct wl_resource *resource,
 	buffer->drm = drm;
 	buffer->buffer.width = width;
 	buffer->buffer.height = height;
-	buffer->format = format;
+	buffer->buffer.format = format;
 
 	buffer->driver_buffer =
 		drm->callbacks->reference_buffer(drm->user_data, name,
@@ -155,6 +154,17 @@ drm_create_buffer(struct wl_client *client, struct wl_resource *resource,
 }
 
 static void
+drm_create_planer_buffer(struct wl_client *client,
+			 struct wl_resource *resource,
+			 uint32_t id, uint32_t name,
+			 int32_t width, int32_t height, uint32_t format,
+			 int32_t offset0, int32_t stride0,
+			 int32_t offset1, int32_t stride1,
+			 int32_t offset2, int32_t stride2)
+{
+}
+
+static void
 drm_authenticate(struct wl_client *client,
 		 struct wl_resource *resource, uint32_t id)
 {
@@ -170,7 +180,8 @@ drm_authenticate(struct wl_client *client,
 
 const static struct wl_drm_interface drm_interface = {
 	drm_authenticate,
-	drm_create_buffer
+	drm_create_buffer,
+	drm_create_planer_buffer
 };
 
 static void
@@ -181,11 +192,9 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id)
 
 	resource = wl_client_add_object(client, &wl_drm_interface,
 					&drm_interface, id, data);
-	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_FORMAT,
-			       WL_DRM_FORMAT_XRGB8888);
+	wl_drm_send_device(resource, drm->device_name);
+	wl_drm_send_format(resource, WL_BUFFER_FORMAT_ARGB8888, 0);
+	wl_drm_send_format(resource, WL_BUFFER_FORMAT_XRGB8888, 0);
 }
 
 struct wl_drm *
@@ -228,7 +237,7 @@ wayland_drm_buffer_get_format(struct wl_buffer *buffer_base)
 {
 	struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) buffer_base;
 
-	return buffer->format;
+	return buffer->buffer.format;
 }
 
 void *
diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
index 80b3f22..934750e 100644
--- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
+++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
@@ -23,10 +23,10 @@ egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
    enum pipe_format pf;
 
    switch (format) {
-   case WL_DRM_FORMAT_ARGB8888:
+   case WL_BUFFER_FORMAT_ARGB8888:
       pf = PIPE_FORMAT_B8G8R8A8_UNORM;
       break;
-   case WL_DRM_FORMAT_XRGB8888:
+   case WL_BUFFER_FORMAT_XRGB8888:
       pf = PIPE_FORMAT_B8G8R8X8_UNORM;
       break;
    default:
diff --git a/src/gallium/state_trackers/egl/wayland/native_drm.c b/src/gallium/state_trackers/egl/wayland/native_drm.c
index e3bd628..6acf11b 100644
--- a/src/gallium/state_trackers/egl/wayland/native_drm.c
+++ b/src/gallium/state_trackers/egl/wayland/native_drm.c
@@ -109,10 +109,10 @@ wayland_create_drm_buffer(struct wayland_display *display,
 
    switch (surface->color_format) {
    case PIPE_FORMAT_B8G8R8A8_UNORM:
-      format = WL_DRM_FORMAT_ARGB8888;
+      format = WL_BUFFER_FORMAT_ARGB8888;
       break;
    case PIPE_FORMAT_B8G8R8X8_UNORM:
-      format = WL_DRM_FORMAT_XRGB8888;
+      format = WL_BUFFER_FORMAT_XRGB8888;
       break;
    default:
       return NULL;
@@ -158,10 +158,10 @@ drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
    struct wayland_drm_display *drmdpy = data;
 
    switch (format) {
-   case WL_DRM_FORMAT_ARGB8888:
+   case WL_BUFFEr_FORMAT_ARGB8888:
       drmdpy->base.formats |= HAS_ARGB8888;
       break;
-   case WL_DRM_FORMAT_XRGB8888:
+   case WL_BUFFER_FORMAT_XRGB8888:
       drmdpy->base.formats |= HAS_XRGB8888;
       break;
    }
