[Beignet] [PATCH V2 1/2] fix issue to create cl image from libva with non-zero offset

Zhigang Gong zhigang.gong at linux.intel.com
Tue Nov 25 20:40:41 PST 2014


This patch itself LGTM, but the interface is really not good.
There is a one-dimension offset for a generic image object, which
is too low level and not a good candidate for a application level API.

Just as we discussed before, there are also some other concerns on
this extension's definition. We may need to refine it in the future.

Will push this patchset latter. Thanks.

On Fri, Nov 21, 2014 at 01:59:20PM +0800, Guo Yejun wrote:
> Beignet accepts buffer object name to share data between libva,
> it supports to create cl image from the bo name with a non-zero
> offset, but it does not work at some platforms.
> 
> The driver calls intel_bo_gem_create_from_name to retrieve the
> dri_bo, and the offset of dri_bo is changed by the non-zero offset.
> At some platforms, the change of the offset has side effect when
> the kernel is executed again and so intel_bo_gem_create_from_name
> is called for the second time.
> 
> So, do not change the offset of dri_bo, but maintain the non-zero
> offset in cl_image, and maintain the non-zero offset until we write
> the surface state into batch buffer.
> 
> V2: correct the offset parameter passed to dri_bo_emit_reloc
> Signed-off-by: Guo Yejun <yejun.guo at intel.com>
> ---
>  src/cl_driver.h          | 2 +-
>  src/cl_mem.c             | 2 +-
>  src/intel/intel_driver.c | 4 +---
>  src/intel/intel_gpgpu.c  | 4 ++--
>  4 files changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/src/cl_driver.h b/src/cl_driver.h
> index 97ca559..f13ebee 100644
> --- a/src/cl_driver.h
> +++ b/src/cl_driver.h
> @@ -305,7 +305,7 @@ extern cl_buffer_release_from_texture_cb *cl_buffer_release_from_texture;
>  typedef cl_buffer (cl_buffer_get_buffer_from_libva_cb)(cl_context ctx, unsigned int bo_name, size_t *sz);
>  extern cl_buffer_get_buffer_from_libva_cb *cl_buffer_get_buffer_from_libva;
>  
> -typedef cl_buffer (cl_buffer_get_image_from_libva_cb)(cl_context ctx, unsigned int bo_name, struct _cl_mem_image *image, unsigned int offset);
> +typedef cl_buffer (cl_buffer_get_image_from_libva_cb)(cl_context ctx, unsigned int bo_name, struct _cl_mem_image *image);
>  extern cl_buffer_get_image_from_libva_cb *cl_buffer_get_image_from_libva;
>  
>  /* Unref a buffer and destroy it if no more ref */
> diff --git a/src/cl_mem.c b/src/cl_mem.c
> index d60c59b..a8f46b0 100644
> --- a/src/cl_mem.c
> +++ b/src/cl_mem.c
> @@ -1915,7 +1915,7 @@ LOCAL cl_mem cl_mem_new_libva_image(cl_context ctx,
>  
>    image = cl_mem_image(mem);
>  
> -  mem->bo = cl_buffer_get_image_from_libva(ctx, bo_name, image, offset);
> +  mem->bo = cl_buffer_get_image_from_libva(ctx, bo_name, image);
>  
>    image->w = width;
>    image->h = height;
> diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c
> index c370c66..bdfa768 100644
> --- a/src/intel/intel_driver.c
> +++ b/src/intel/intel_driver.c
> @@ -675,15 +675,13 @@ cl_buffer intel_share_buffer_from_libva(cl_context ctx,
>  
>  cl_buffer intel_share_image_from_libva(cl_context ctx,
>                                         unsigned int bo_name,
> -                                       struct _cl_mem_image *image,
> -                                       unsigned int offset)
> +                                       struct _cl_mem_image *image)
>  {
>    drm_intel_bo *intel_bo;
>    uint32_t intel_tiling, intel_swizzle_mode;
>  
>    intel_bo = intel_driver_share_buffer((intel_driver_t *)ctx->drv, "shared from libva", bo_name);
>  
> -  intel_bo->offset += offset;
>    drm_intel_bo_get_tiling(intel_bo, &intel_tiling, &intel_swizzle_mode);
>    image->tiling = get_cl_tiling(intel_tiling);
>  
> diff --git a/src/intel/intel_gpgpu.c b/src/intel/intel_gpgpu.c
> index ffe382c..09f2317 100644
> --- a/src/intel/intel_gpgpu.c
> +++ b/src/intel/intel_gpgpu.c
> @@ -1063,7 +1063,7 @@ intel_gpgpu_bind_image_gen7(intel_gpgpu_t *gpgpu,
>      ss->ss0.surface_array_spacing = 1;
>    }
>    ss->ss0.surface_format = format;
> -  ss->ss1.base_addr = obj_bo->offset;
> +  ss->ss1.base_addr = obj_bo->offset + obj_bo_offset;
>    ss->ss2.width = w - 1;
>  
>    ss->ss2.height = h - 1;
> @@ -1108,7 +1108,7 @@ intel_gpgpu_bind_image_gen75(intel_gpgpu_t *gpgpu,
>      ss->ss0.surface_array_spacing = 1;
>    }
>    ss->ss0.surface_format = format;
> -  ss->ss1.base_addr = obj_bo->offset;
> +  ss->ss1.base_addr = obj_bo->offset + obj_bo_offset;
>    ss->ss2.width = w - 1;
>    ss->ss2.height = h - 1;
>    ss->ss3.depth = depth - 1;
> -- 
> 1.9.1
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list