Add a weston_buffer structure to replace wl_buffer

This commit adds a weston_buffer structure to replace wl_buffer.  This way
we can hold onto buffers by just their resource.  In order to do this, the
every renderer.attach function has to fill in the weston_buffer.width and
weston_buffer.height fields.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index 7d27a97..f0ae345 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -1100,7 +1100,7 @@
 {
 	struct gl_renderer *gr = get_renderer(surface->compositor);
 	struct gl_surface_state *gs = get_surface_state(surface);
-	struct wl_buffer *buffer = gs->buffer_ref.buffer;
+	struct weston_buffer *buffer = gs->buffer_ref.buffer;
 
 #ifdef GL_UNPACK_ROW_LENGTH
 	pixman_box32_t *rectangles;
@@ -1131,7 +1131,7 @@
 		glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
 			     gs->pitch, buffer->height, 0,
 			     GL_BGRA_EXT, GL_UNSIGNED_BYTE,
-			     wl_shm_buffer_get_data(buffer));
+			     wl_shm_buffer_get_data(buffer->shm_buffer));
 
 		goto done;
 	}
@@ -1139,7 +1139,7 @@
 #ifdef GL_UNPACK_ROW_LENGTH
 	/* Mesa does not define GL_EXT_unpack_subimage */
 	glPixelStorei(GL_UNPACK_ROW_LENGTH, gs->pitch);
-	data = wl_shm_buffer_get_data(buffer);
+	data = wl_shm_buffer_get_data(buffer->shm_buffer);
 	rectangles = pixman_region32_rectangles(&gs->texture_damage, &n);
 	for (i = 0; i < n; i++) {
 		pixman_box32_t r;
@@ -1182,11 +1182,12 @@
 }
 
 static void
-gl_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
+gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
 {
 	struct weston_compositor *ec = es->compositor;
 	struct gl_renderer *gr = get_renderer(ec);
 	struct gl_surface_state *gs = get_surface_state(es);
+	struct wl_shm_buffer *shm_buffer;
 	EGLint attribs[3], format;
 	int i, num_planes;
 
@@ -1203,16 +1204,21 @@
 		return;
 	}
 
-	if (wl_buffer_is_shm(buffer)) {
+	shm_buffer = wl_shm_buffer_get(buffer->resource);
+	if (shm_buffer) {
+		buffer->shm_buffer = shm_buffer;
+		buffer->width = wl_shm_buffer_get_width(shm_buffer);
+		buffer->height = wl_shm_buffer_get_height(shm_buffer);
+
 		/* Only allocate a texture if it doesn't match existing one.
 		 * If gs->num_images is not 0, then a switch from DRM allocated
 		 * buffer to a SHM buffer is happening, and we need to allocate
 		 * a new texture buffer. */
-		if (wl_shm_buffer_get_stride(buffer) / 4 != gs->pitch ||
-		    wl_shm_buffer_get_height(buffer) != gs->height ||
+		if (wl_shm_buffer_get_stride(shm_buffer) / 4 != gs->pitch ||
+		    buffer->height != gs->height ||
 		    gs->num_images > 0) {
-			gs->pitch = wl_shm_buffer_get_stride(buffer) / 4;
-			gs->height = wl_shm_buffer_get_height(buffer);
+			gs->pitch =  wl_shm_buffer_get_stride(shm_buffer) / 4;
+			gs->height = buffer->height;
 			gs->target = GL_TEXTURE_2D;
 
 			ensure_textures(gs, 1);
@@ -1227,12 +1233,17 @@
 						   gs->height / es->buffer_scale);
 		}
 
-		if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888)
+		if (wl_shm_buffer_get_format(shm_buffer) == WL_SHM_FORMAT_XRGB8888)
 			gs->shader = &gr->texture_shader_rgbx;
 		else
 			gs->shader = &gr->texture_shader_rgba;
-	} else if (gr->query_buffer(gr->egl_display, buffer,
+	} else if (gr->query_buffer(gr->egl_display,
+				    (struct wl_buffer *)buffer->resource,
 				    EGL_TEXTURE_FORMAT, &format)) {
+		buffer->legacy_buffer = (struct wl_buffer *)buffer->resource;
+		buffer->width = buffer->legacy_buffer->width;
+		buffer->height = buffer->legacy_buffer->height;
+
 		for (i = 0; i < gs->num_images; i++)
 			gr->destroy_image(gr->egl_display, gs->images[i]);
 		gs->num_images = 0;
@@ -1271,7 +1282,8 @@
 			gs->images[i] = gr->create_image(gr->egl_display,
 							 NULL,
 							 EGL_WAYLAND_BUFFER_WL,
-							 buffer, attribs);
+							 buffer->legacy_buffer,
+							 attribs);
 			if (!gs->images[i]) {
 				weston_log("failed to create img for plane %d\n", i);
 				continue;