summaryrefslogtreecommitdiff
path: root/src/cl_mem.c
diff options
context:
space:
mode:
authorGuo Yejun <yejun.guo@intel.com>2014-11-18 16:28:29 +0800
committerZhigang Gong <zhigang.gong@intel.com>2014-11-19 12:54:22 +0800
commit09f1c9d3820609c166fa1377427eb3d7bbbf1bf4 (patch)
treeb6d9189285601fd7b2dfbf00ccd42f111efda983 /src/cl_mem.c
parent4e2caf4ae6e2b80fd40939745e58eac4afb34ddc (diff)
re-enable userptr with fix: CPU access after GPU finishes the rendering
1. the wait logic is integrated into function cl_mem_map/unmap_auto 2. use cl_mem_map/unmap_auto for userptr inside clEnqueueRead/WriteBuffer 3. do not use cl_buffer_subdata for userptr, use cl_mem_map/memcpy instead Signed-off-by: Guo Yejun <yejun.guo@intel.com> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
Diffstat (limited to 'src/cl_mem.c')
-rw-r--r--src/cl_mem.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/cl_mem.c b/src/cl_mem.c
index 0fbd3040..65f299ff 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -1818,8 +1818,13 @@ cl_mem_map_auto(cl_mem mem, int write)
{
if (IS_IMAGE(mem) && cl_mem_image(mem)->tiling != CL_NO_TILE)
return cl_mem_map_gtt(mem);
- else
- return cl_mem_map(mem, write);
+ else {
+ if (mem->is_userptr) {
+ cl_buffer_wait_rendering(mem->bo);
+ return mem->host_ptr;
+ }else
+ return cl_mem_map(mem, write);
+ }
}
LOCAL cl_int
@@ -1829,7 +1834,7 @@ cl_mem_unmap_auto(cl_mem mem)
cl_buffer_unmap_gtt(mem->bo);
mem->mapped_gtt = 0;
}
- else
+ else if (!mem->is_userptr)
cl_buffer_unmap(mem->bo);
return CL_SUCCESS;
}