[Mesa-dev] [PATCH] i965: fix dma_buf import with non-zero offset.

Pohjolainen, Topi topi.pohjolainen at intel.com
Mon Mar 10 23:37:34 PDT 2014


On Mon, Mar 10, 2014 at 05:36:17PM +0100, Gwenole Beauchesne wrote:
> Fix eglCreateImage() from a packed dma_buf surface with a non-zero offset
> to pixels data. In particular, this fixes support for planar YUV surfaces
> when they are individually mapped on a per-plane basis, i.e. when the
> OES_EGL_image_external is not used and user application wants to use its
> own shader code for composition, or processing on individual plane (OCL).
> 
> Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
> ---
>  src/mesa/drivers/dri/i965/intel_screen.c |    9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> index 05cf6b1..81a8330 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.c
> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> @@ -651,6 +651,7 @@ intel_create_image_from_fds(__DRIscreen *screen,
>  {
>     struct intel_screen *intelScreen = screen->driverPrivate;
>     struct intel_image_format *f;
> +   uint32_t mask_x, mask_y;
>     __DRIimage *image;
>     int i, index;
>  
> @@ -684,6 +685,14 @@ intel_create_image_from_fds(__DRIscreen *screen,
>        image->strides[index] = strides[index];
>     }
>  
> +   if (f->nplanes == 1) {
> +      image->offset = image->offsets[0];

I haven't thought through all the uses of '__DRIimage' but I'm a bit worried
that there is now the offset possibly twice - in the base and again in the
array describing the planes. I wonder if the real bug is that the offsets in
the array are not used in the right place(s):

In intel_image_target_texture_2d() the call:

   intel_set_texture_image_region(ctx, texImage, image->region,
                                  target, image->internal_format,
                                  image->format, image->offset,
                                  image->width,  image->height,
                                  image->tile_x, image->tile_y);

should probably take the plane offsets into account even now when only single
plane images are accepted.

Would this make sense?

> +      intel_region_get_tile_masks(image->region, &mask_x, &mask_y, false);
> +      if (image->offset & mask_x)
> +         _mesa_warning(NULL,
> +                       "intel_create_image_from_fds: offset not on tile boundary");
> +   }
> +
>     intel_setup_image_from_dimensions(image);
>  
>     return image;
> -- 
> 1.7.9.5
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list