[PATCH weston 3/3] simple-dmabuf-drm: support DRM_FORMAT_LINEAR for NV12 as well

Guido Günther agx at sigxcpu.org
Mon May 28 15:43:08 UTC 2018


Hi,
On Mon, May 28, 2018 at 04:31:14PM +0300, Pekka Paalanen wrote:
> On Tue, 20 Mar 2018 11:36:38 +0100
> Guido Günther <agx at sigxcpu.org> wrote:
> 
> > This makes --import-format=NV12 testable on e.g. intel
> > 
> > We only set nv12_format_found to true if we found that format and at
> > least one understood modifier. Store modifier verbatim instead of using
> > a boolean flag. Last advertised and supported modifier currently wins.
> > 
> > Signed-off-by: Guido Günther <agx at sigxcpu.org>
> > ---
> >  clients/simple-dmabuf-drm.c | 54 +++++++++++++++++++++++++++++++--------------
> >  1 file changed, 37 insertions(+), 17 deletions(-)
> > 
> > diff --git a/clients/simple-dmabuf-drm.c b/clients/simple-dmabuf-drm.c
> > index b9681ca4..7175f2d7 100644
> > --- a/clients/simple-dmabuf-drm.c
> > +++ b/clients/simple-dmabuf-drm.c
> > @@ -75,7 +75,7 @@ struct display {
> >  	struct zwp_linux_dmabuf_v1 *dmabuf;
> >  	int xrgb8888_format_found;
> >  	int nv12_format_found;
> > -	int nv12_modifier_found;
> > +	uint64_t nv12_modifier;
> >  	int req_dmabuf_immediate;
> >  	int req_dmabuf_modifiers;
> >  };
> > @@ -273,7 +273,7 @@ fd_device_destroy(struct buffer *buf)
> >  #endif /* HAVE_LIBDRM_FREEDRENO */
> >  
> >  static void
> > -fill_content(struct buffer *my_buf)
> > +fill_content(struct buffer *my_buf, uint64_t modifier)
> >  {
> >  	int x = 0, y = 0;
> >  	uint32_t *pix;
> > @@ -281,11 +281,31 @@ fill_content(struct buffer *my_buf)
> >  	assert(my_buf->mmap);
> >  
> >  	if (my_buf->format == DRM_FORMAT_NV12) {
> > -		pix = (uint32_t *) my_buf->mmap;
> > -		for (y = 0; y < my_buf->height; y++)
> > -			memcpy(&pix[y * my_buf->width / 4],
> > -			       &nv12_tiled[my_buf->width * y / 4],
> > -			       my_buf->width);
> > +		if (modifier == DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) {
> > +			pix = (uint32_t *) my_buf->mmap;
> > +			for (y = 0; y < my_buf->height; y++)
> > +				memcpy(&pix[y * my_buf->width / 4],
> > +				       &nv12_tiled[my_buf->width * y / 4],
> > +				       my_buf->width);
> > +		}
> > +		else if (modifier == DRM_FORMAT_MOD_LINEAR) {
> > +			uint8_t *pix8;
> > +			/* first plane: Y (2/3 of the buffer)	*/
> > +			for (y = 0; y < my_buf->height * 2/3; y++) {
> > +				pix8 = my_buf->mmap + y * my_buf->stride;
> > +				for (x = 0; x < my_buf->width; x++)
> > +					*pix8++ = x % 0xff;
> > +			}
> > +			/* second plane (CbCr) is half the size of Y
> > +			   plane (last 1/3 of the buffer) */
> > +			for (y = my_buf->height * 2/3; y < my_buf->height; y++) {
> > +				pix8 = my_buf->mmap + y * my_buf->stride;
> > +				for (x = 0; x < my_buf->width; x+=2) {
> > +					*pix8++ = x % 256;
> > +					*pix8++ = y % 256;
> > +				}
> > +			}
> 
> Was the LINEAR branch supposed to produce the same image as the XRGB
> path? It doesn't, the colors are different on intel, so I assume there
> is no such intention.
> 
> If there was, I'd call for an image that can be described in words what
> it should look like, and would be identifiable if it was flipped or
> rotated or had wrong colors.

There was no intention to reproduce it. I've added a hint how it should
look like to the commit message.

> 
> > +		}
> >  	}
> >  	else {
> >  		for (y = 0; y < my_buf->height; y++) {
> > @@ -420,7 +440,6 @@ create_dmabuf_buffer(struct display *display, struct buffer *buffer,
> >  		/* adjust height for allocation of NV12 Y and UV planes */
> >  		buffer->height = height * 3 / 2;
> >  		buffer->bpp = 8;
> > -		modifier = DRM_FORMAT_MOD_SAMSUNG_64_32_TILE;
> >  		break;
> >  	default:
> >  		buffer->height = height;
> > @@ -437,7 +456,7 @@ create_dmabuf_buffer(struct display *display, struct buffer *buffer,
> >  		fprintf(stderr, "map_bo failed\n");
> >  		goto error2;
> >  	}
> > -	fill_content(buffer);
> > +	fill_content(buffer, modifier);
> 
> Doesn't this call have modifier=0 always?
> Which by luck turns out to be DRM_FORMAT_MOD_LINEAR.

I fixed that in my branch a while ago but forget to push that to the
list. Sent out a new version now.

> 
> The first two patches are pushed:
>    bff90630..577b3464  master -> master
> 
> Without this one issue I would have push the third one too.

Thanks!
 -- Guido


More information about the wayland-devel mailing list