[PATCH 1/6] linux-dmabuf: Move the attributes part of linux_dmabuf_buffer into its own struct

Derek Foreman derekf at osg.samsung.com
Wed Dec 2 14:49:52 PST 2015


On 24/11/15 01:28 PM, Emmanuel Gil Peyrot wrote:
> This allows renderers to use that struct to create their own dmabufs,
> in case they can’t import the one provided by the client directly but
> know how to convert it into a format they can render.
> 
> Signed-off-by: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
> Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> Reviewed-by: Daniel Stone <daniels at collabora.com>

Me too, me too.

Reviewed-by: Derek Foreman <derekf at osg.samsung.com>

And I'll push it.

> Differential Revision: https://phabricator.freedesktop.org/D332
> ---
>  src/compositor-drm.c | 12 +++++------
>  src/gl-renderer.c    | 50 ++++++++++++++++++++++----------------------
>  src/linux-dmabuf.c   | 58 ++++++++++++++++++++++++++--------------------------
>  src/linux-dmabuf.h   | 14 ++++++++-----
>  4 files changed, 69 insertions(+), 65 deletions(-)
> 
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index a84d869..55bc187 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -983,14 +983,14 @@ drm_output_prepare_overlay_view(struct drm_output *output,
>  		 * support a mix of gbm_bos and drmfbs.
>  		 */
>  		struct gbm_import_fd_data gbm_dmabuf = {
> -			.fd     = dmabuf->dmabuf_fd[0],
> -			.width  = dmabuf->width,
> -			.height = dmabuf->height,
> -			.stride = dmabuf->stride[0],
> -			.format = dmabuf->format
> +			.fd     = dmabuf->attributes.fd[0],
> +			.width  = dmabuf->attributes.width,
> +			.height = dmabuf->attributes.height,
> +			.stride = dmabuf->attributes.stride[0],
> +			.format = dmabuf->attributes.format
>  		};
>  
> -		if (dmabuf->n_planes != 1 || dmabuf->offset[0] != 0)
> +		if (dmabuf->attributes.n_planes != 1 || dmabuf->attributes.offset[0] != 0)
>  			return NULL;
>  
>  		bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_FD, &gbm_dmabuf,
> diff --git a/src/gl-renderer.c b/src/gl-renderer.c
> index ae72f32..d5356b6 100644
> --- a/src/gl-renderer.c
> +++ b/src/gl-renderer.c
> @@ -1446,38 +1446,38 @@ import_dmabuf(struct gl_renderer *gr,
>  	 */
>  
>  	attribs[atti++] = EGL_WIDTH;
> -	attribs[atti++] = dmabuf->width;
> +	attribs[atti++] = dmabuf->attributes.width;
>  	attribs[atti++] = EGL_HEIGHT;
> -	attribs[atti++] = dmabuf->height;
> +	attribs[atti++] = dmabuf->attributes.height;
>  	attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
> -	attribs[atti++] = dmabuf->format;
> +	attribs[atti++] = dmabuf->attributes.format;
>  	/* XXX: Add modifier here when supported */
>  
> -	if (dmabuf->n_planes > 0) {
> +	if (dmabuf->attributes.n_planes > 0) {
>  		attribs[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
> -		attribs[atti++] = dmabuf->dmabuf_fd[0];
> +		attribs[atti++] = dmabuf->attributes.fd[0];
>  		attribs[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
> -		attribs[atti++] = dmabuf->offset[0];
> +		attribs[atti++] = dmabuf->attributes.offset[0];
>  		attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
> -		attribs[atti++] = dmabuf->stride[0];
> +		attribs[atti++] = dmabuf->attributes.stride[0];
>  	}
>  
> -	if (dmabuf->n_planes > 1) {
> +	if (dmabuf->attributes.n_planes > 1) {
>  		attribs[atti++] = EGL_DMA_BUF_PLANE1_FD_EXT;
> -		attribs[atti++] = dmabuf->dmabuf_fd[1];
> +		attribs[atti++] = dmabuf->attributes.fd[1];
>  		attribs[atti++] = EGL_DMA_BUF_PLANE1_OFFSET_EXT;
> -		attribs[atti++] = dmabuf->offset[1];
> +		attribs[atti++] = dmabuf->attributes.offset[1];
>  		attribs[atti++] = EGL_DMA_BUF_PLANE1_PITCH_EXT;
> -		attribs[atti++] = dmabuf->stride[1];
> +		attribs[atti++] = dmabuf->attributes.stride[1];
>  	}
>  
> -	if (dmabuf->n_planes > 2) {
> +	if (dmabuf->attributes.n_planes > 2) {
>  		attribs[atti++] = EGL_DMA_BUF_PLANE2_FD_EXT;
> -		attribs[atti++] = dmabuf->dmabuf_fd[2];
> +		attribs[atti++] = dmabuf->attributes.fd[2];
>  		attribs[atti++] = EGL_DMA_BUF_PLANE2_OFFSET_EXT;
> -		attribs[atti++] = dmabuf->offset[2];
> +		attribs[atti++] = dmabuf->attributes.offset[2];
>  		attribs[atti++] = EGL_DMA_BUF_PLANE2_PITCH_EXT;
> -		attribs[atti++] = dmabuf->stride[2];
> +		attribs[atti++] = dmabuf->attributes.stride[2];
>  	}
>  
>  	attribs[atti++] = EGL_NONE;
> @@ -1507,14 +1507,14 @@ gl_renderer_import_dmabuf(struct weston_compositor *ec,
>  
>  	assert(gr->has_dmabuf_import);
>  
> -	for (i = 0; i < dmabuf->n_planes; i++) {
> +	for (i = 0; i < dmabuf->attributes.n_planes; i++) {
>  		/* EGL import does not have modifiers */
> -		if (dmabuf->modifier[i] != 0)
> +		if (dmabuf->attributes.modifier[i] != 0)
>  			return false;
>  	}
>  
>  	/* reject all flags we do not recognize or handle */
> -	if (dmabuf->flags & ~ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT)
> +	if (dmabuf->attributes.flags & ~ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT)
>  		return false;
>  
>  	image = import_dmabuf(gr, dmabuf);
> @@ -1528,12 +1528,12 @@ gl_renderer_import_dmabuf(struct weston_compositor *ec,
>  }
>  
>  static GLenum
> -choose_texture_target(struct linux_dmabuf_buffer *dmabuf)
> +choose_texture_target(struct dmabuf_attributes *attributes)
>  {
> -	if (dmabuf->n_planes > 1)
> +	if (attributes->n_planes > 1)
>  		return GL_TEXTURE_EXTERNAL_OES;
>  
> -	switch (dmabuf->format & ~DRM_FORMAT_BIG_ENDIAN) {
> +	switch (attributes->format & ~DRM_FORMAT_BIG_ENDIAN) {
>  	case DRM_FORMAT_YUYV:
>  	case DRM_FORMAT_YVYU:
>  	case DRM_FORMAT_UYVY:
> @@ -1560,16 +1560,16 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
>  		return;
>  	}
>  
> -	buffer->width = dmabuf->width;
> -	buffer->height = dmabuf->height;
> +	buffer->width = dmabuf->attributes.width;
> +	buffer->height = dmabuf->attributes.height;
>  	buffer->y_inverted =
> -		!!(dmabuf->flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT);
> +		!!(dmabuf->attributes.flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT);
>  
>  	for (i = 0; i < gs->num_images; i++)
>  		egl_image_unref(gs->images[i]);
>  	gs->num_images = 0;
>  
> -	gs->target = choose_texture_target(dmabuf);
> +	gs->target = choose_texture_target(&dmabuf->attributes);
>  	switch (gs->target) {
>  	case GL_TEXTURE_2D:
>  		gs->shader = &gr->texture_shader_rgba;
> diff --git a/src/linux-dmabuf.c b/src/linux-dmabuf.c
> index 53768bf..8c6337c 100644
> --- a/src/linux-dmabuf.c
> +++ b/src/linux-dmabuf.c
> @@ -35,12 +35,12 @@ linux_dmabuf_buffer_destroy(struct linux_dmabuf_buffer *buffer)
>  {
>  	int i;
>  
> -	for (i = 0; i < buffer->n_planes; i++) {
> -		close(buffer->dmabuf_fd[i]);
> -		buffer->dmabuf_fd[i] = -1;
> +	for (i = 0; i < buffer->attributes.n_planes; i++) {
> +		close(buffer->attributes.fd[i]);
> +		buffer->attributes.fd[i] = -1;
>  	}
>  
> -	buffer->n_planes = 0;
> +	buffer->attributes.n_planes = 0;
>  	free(buffer);
>  }
>  
> @@ -95,7 +95,7 @@ params_add(struct wl_client *client,
>  		return;
>  	}
>  
> -	if (buffer->dmabuf_fd[plane_idx] != -1) {
> +	if (buffer->attributes.fd[plane_idx] != -1) {
>  		wl_resource_post_error(params_resource,
>  			ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_PLANE_SET,
>  			"a dmabuf has already been added for plane %u",
> @@ -104,12 +104,12 @@ params_add(struct wl_client *client,
>  		return;
>  	}
>  
> -	buffer->dmabuf_fd[plane_idx] = name_fd;
> -	buffer->offset[plane_idx] = offset;
> -	buffer->stride[plane_idx] = stride;
> -	buffer->modifier[plane_idx] = ((uint64_t)modifier_hi << 32) |
> -				      modifier_lo;
> -	buffer->n_planes++;
> +	buffer->attributes.fd[plane_idx] = name_fd;
> +	buffer->attributes.offset[plane_idx] = offset;
> +	buffer->attributes.stride[plane_idx] = stride;
> +	buffer->attributes.modifier[plane_idx] = ((uint64_t)modifier_hi << 32) |
> +	                                         modifier_lo;
> +	buffer->attributes.n_planes++;
>  }
>  
>  static void
> @@ -167,7 +167,7 @@ params_create(struct wl_client *client,
>  	wl_resource_set_user_data(buffer->params_resource, NULL);
>  	buffer->params_resource = NULL;
>  
> -	if (!buffer->n_planes) {
> +	if (!buffer->attributes.n_planes) {
>  		wl_resource_post_error(params_resource,
>  			ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INCOMPLETE,
>  			"no dmabuf has been added to the params");
> @@ -175,8 +175,8 @@ params_create(struct wl_client *client,
>  	}
>  
>  	/* Check for holes in the dmabufs set (e.g. [0, 1, 3]) */
> -	for (i = 0; i < buffer->n_planes; i++) {
> -		if (buffer->dmabuf_fd[i] == -1) {
> +	for (i = 0; i < buffer->attributes.n_planes; i++) {
> +		if (buffer->attributes.fd[i] == -1) {
>  			wl_resource_post_error(params_resource,
>  				ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INCOMPLETE,
>  				"no dmabuf has been added for plane %i", i);
> @@ -184,10 +184,10 @@ params_create(struct wl_client *client,
>  		}
>  	}
>  
> -	buffer->width = width;
> -	buffer->height = height;
> -	buffer->format = format;
> -	buffer->flags = flags;
> +	buffer->attributes.width = width;
> +	buffer->attributes.height = height;
> +	buffer->attributes.format = format;
> +	buffer->attributes.flags = flags;
>  
>  	if (width < 1 || height < 1) {
>  		wl_resource_post_error(params_resource,
> @@ -196,10 +196,10 @@ params_create(struct wl_client *client,
>  		goto err_out;
>  	}
>  
> -	for (i = 0; i < buffer->n_planes; i++) {
> +	for (i = 0; i < buffer->attributes.n_planes; i++) {
>  		off_t size;
>  
> -		if ((uint64_t) buffer->offset[i] + buffer->stride[i] > UINT32_MAX) {
> +		if ((uint64_t) buffer->attributes.offset[i] + buffer->attributes.stride[i] > UINT32_MAX) {
>  			wl_resource_post_error(params_resource,
>  				ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
>  				"size overflow for plane %i", i);
> @@ -207,8 +207,8 @@ params_create(struct wl_client *client,
>  		}
>  
>  		if (i == 0 &&
> -		   (uint64_t) buffer->offset[i] +
> -		   (uint64_t) buffer->stride[i] * height > UINT32_MAX) {
> +		   (uint64_t) buffer->attributes.offset[i] +
> +		   (uint64_t) buffer->attributes.stride[i] * height > UINT32_MAX) {
>  			wl_resource_post_error(params_resource,
>  				ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
>  				"size overflow for plane %i", i);
> @@ -217,30 +217,30 @@ params_create(struct wl_client *client,
>  
>  		/* Don't report an error as it might be caused
>  		 * by the kernel not supporting seeking on dmabuf */
> -		size = lseek(buffer->dmabuf_fd[i], 0, SEEK_END);
> +		size = lseek(buffer->attributes.fd[i], 0, SEEK_END);
>  		if (size == -1)
>  			break;
>  
> -		if (buffer->offset[i] >= size) {
> +		if (buffer->attributes.offset[i] >= size) {
>  			wl_resource_post_error(params_resource,
>  				ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
>  				"invalid offset %i for plane %i",
> -				buffer->offset[i], i);
> +				buffer->attributes.offset[i], i);
>  			goto err_out;
>  		}
>  
> -		if (buffer->offset[i] + buffer->stride[i] > size) {
> +		if (buffer->attributes.offset[i] + buffer->attributes.stride[i] > size) {
>  			wl_resource_post_error(params_resource,
>  				ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
>  				"invalid stride %i for plane %i",
> -				buffer->stride[i], i);
> +				buffer->attributes.stride[i], i);
>  			goto err_out;
>  		}
>  
>  		/* Only valid for first plane as other planes might be
>  		 * sub-sampled according to fourcc format */
>  		if (i == 0 &&
> -		    buffer->offset[i] + buffer->stride[i] * height > size) {
> +		    buffer->attributes.offset[i] + buffer->attributes.stride[i] * height > size) {
>  			wl_resource_post_error(params_resource,
>  				ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
>  				"invalid buffer stride or height for plane %i", i);
> @@ -316,7 +316,7 @@ linux_dmabuf_create_params(struct wl_client *client,
>  		goto err_out;
>  
>  	for (i = 0; i < MAX_DMABUF_PLANES; i++)
> -		buffer->dmabuf_fd[i] = -1;
> +		buffer->attributes.fd[i] = -1;
>  
>  	buffer->compositor = compositor;
>  	buffer->params_resource =
> diff --git a/src/linux-dmabuf.h b/src/linux-dmabuf.h
> index 162ff58..cd30f91 100644
> --- a/src/linux-dmabuf.h
> +++ b/src/linux-dmabuf.h
> @@ -31,19 +31,23 @@ struct linux_dmabuf_buffer;
>  typedef void (*dmabuf_user_data_destroy_func)(
>  			struct linux_dmabuf_buffer *buffer);
>  
> -struct linux_dmabuf_buffer {
> -	struct wl_resource *buffer_resource;
> -	struct wl_resource *params_resource;
> -	struct weston_compositor *compositor;
> +struct dmabuf_attributes {
>  	int32_t width;
>  	int32_t height;
>  	uint32_t format;
>  	uint32_t flags; /* enum zlinux_buffer_params_flags */
>  	int n_planes;
> -	int dmabuf_fd[MAX_DMABUF_PLANES];
> +	int fd[MAX_DMABUF_PLANES];
>  	uint32_t offset[MAX_DMABUF_PLANES];
>  	uint32_t stride[MAX_DMABUF_PLANES];
>  	uint64_t modifier[MAX_DMABUF_PLANES];
> +};
> +
> +struct linux_dmabuf_buffer {
> +	struct wl_resource *buffer_resource;
> +	struct wl_resource *params_resource;
> +	struct weston_compositor *compositor;
> +	struct dmabuf_attributes attributes;
>  
>  	void *user_data;
>  	dmabuf_user_data_destroy_func user_data_destroy_func;
> 



More information about the wayland-devel mailing list