summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuo Yejun <yejun.guo@intel.com>2014-11-21 13:59:20 +0800
committerZhigang Gong <zhigang.gong@intel.com>2014-11-27 09:26:17 +0800
commit3746a88b24aa5abd51704d2458f358ba54f66216 (patch)
treebbc591564176a7b4f13f61e30560eae5d4da5ea9
parent9de9195b6d74a324709b5e130c6b9cde24c5d4e5 (diff)
fix issue to create cl image from libva with non-zero offset
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@intel.com>
-rw-r--r--src/cl_driver.h2
-rw-r--r--src/cl_mem.c2
-rw-r--r--src/intel/intel_driver.c4
-rw-r--r--src/intel/intel_gpgpu.c4
4 files changed, 5 insertions, 7 deletions
diff --git a/src/cl_driver.h b/src/cl_driver.h
index 97ca5594..f13ebee8 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 3323897b..1f1b6682 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -1919,7 +1919,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 c370c666..bdfa768b 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 ffe382cd..09f2317f 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;