From: Zhigang Gong Date: Fri, 30 Aug 2013 09:19:40 +0000 (+0800) Subject: Runtime: clEnqueueMapImage also need to maintain the mapped images. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3aad78e1a246d848b92f6e154076ffef606101b1;p=contrib%2Fbeignet.git Runtime: clEnqueueMapImage also need to maintain the mapped images. v3: Use cl_mem_unmap_gtt rather than cl_mem_unmap_auto in function _cl_map_mem. v2: merge with: commit 0237652c579123436e5f48514f733e36c8b5264a Author: Yang Rong Date: Fri Aug 23 11:04:21 2013 +0800 Add clEnqueueMapBuffer and clEnqueueMapImage non-blocking map support. Signed-off-by: Zhigang Gong Revied-by: "Yang, Rong R" --- diff --git a/src/cl_api.c b/src/cl_api.c index 0665bf4..30d0b11 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -1563,6 +1563,70 @@ clEnqueueCopyBufferToImage(cl_command_queue command_queue, return 0; } +static cl_int _cl_map_mem(cl_mem mem, void **ptr, void **mem_ptr, size_t offset, size_t size) +{ + cl_int slot = -1; + int err = CL_SUCCESS; + if (!(*ptr = cl_mem_map_gtt_unsync(mem))) { + err = CL_MAP_FAILURE; + goto error; + } + *ptr = (char*)(*ptr) + offset; + if(mem->flags & CL_MEM_USE_HOST_PTR) { + assert(mem->host_ptr); + //only calc ptr here, will do memcpy in enqueue + *mem_ptr = mem->host_ptr + offset; + } else { + *mem_ptr = *ptr; + } + /* Record the mapped address. */ + if (!mem->mapped_ptr_sz) { + mem->mapped_ptr_sz = 16; + mem->mapped_ptr = (cl_mapped_ptr *)malloc( + sizeof(cl_mapped_ptr) * mem->mapped_ptr_sz); + if (!mem->mapped_ptr) { + cl_mem_unmap_gtt(mem); + err = CL_OUT_OF_HOST_MEMORY; + goto error; + } + memset(mem->mapped_ptr, 0, mem->mapped_ptr_sz * sizeof(cl_mapped_ptr)); + slot = 0; + } else { + int i = 0; + for (; i < mem->mapped_ptr_sz; i++) { + if (mem->mapped_ptr[i].ptr == NULL) { + slot = i; + break; + } + } + if (i == mem->mapped_ptr_sz) { + cl_mapped_ptr *new_ptr = (cl_mapped_ptr *)malloc( + sizeof(cl_mapped_ptr) * mem->mapped_ptr_sz * 2); + if (!new_ptr) { + cl_mem_unmap_gtt (mem); + err = CL_OUT_OF_HOST_MEMORY; + goto error; + } + memset(new_ptr, 0, 2 * mem->mapped_ptr_sz * sizeof(cl_mapped_ptr)); + memcpy(new_ptr, mem->mapped_ptr, + mem->mapped_ptr_sz * sizeof(cl_mapped_ptr)); + slot = mem->mapped_ptr_sz; + mem->mapped_ptr_sz *= 2; + free(mem->mapped_ptr); + mem->mapped_ptr = new_ptr; + } + } + assert(slot != -1); + mem->mapped_ptr[slot].ptr = *mem_ptr; + mem->mapped_ptr[slot].v_ptr = *ptr; + mem->mapped_ptr[slot].size = size; + mem->map_ref++; +error: + if (err != CL_SUCCESS) + *mem_ptr = NULL; + return err; +} + void * clEnqueueMapBuffer(cl_command_queue command_queue, cl_mem buffer, @@ -1578,7 +1642,6 @@ clEnqueueMapBuffer(cl_command_queue command_queue, cl_int err = CL_SUCCESS; void *ptr = NULL; void *mem_ptr = NULL; - cl_int slot = -1; enqueue_data *data, no_wait_data = { 0 }; CHECK_QUEUE(command_queue); @@ -1605,68 +1668,9 @@ clEnqueueMapBuffer(cl_command_queue command_queue, goto error; } - if (!(ptr = cl_mem_map_gtt_unsync(buffer))) { - err = CL_MAP_FAILURE; + err = _cl_map_mem(buffer, &ptr, &mem_ptr, offset, size); + if (err != CL_SUCCESS) goto error; - } - - ptr = (char*)ptr + offset; - - if(buffer->flags & CL_MEM_USE_HOST_PTR) { - assert(buffer->host_ptr); - //only calc ptr here, will do memcpy in enqueue - mem_ptr = buffer->host_ptr + offset; - } else { - mem_ptr = ptr; - } - - /* Record the mapped address. */ - if (!buffer->mapped_ptr_sz) { - buffer->mapped_ptr_sz = 16; - buffer->mapped_ptr = (cl_mapped_ptr *)malloc( - sizeof(cl_mapped_ptr) * buffer->mapped_ptr_sz); - if (!buffer->mapped_ptr) { - cl_mem_unmap_gtt (buffer); - err = CL_OUT_OF_HOST_MEMORY; - ptr = NULL; - goto error; - } - - memset(buffer->mapped_ptr, 0, buffer->mapped_ptr_sz * sizeof(cl_mapped_ptr)); - slot = 0; - } else { - int i = 0; - for (; i < buffer->mapped_ptr_sz; i++) { - if (buffer->mapped_ptr[i].ptr == NULL) { - slot = i; - break; - } - } - - if (i == buffer->mapped_ptr_sz) { - cl_mapped_ptr *new_ptr = (cl_mapped_ptr *)malloc( - sizeof(cl_mapped_ptr) * buffer->mapped_ptr_sz * 2); - if (!new_ptr) { - cl_mem_unmap_gtt (buffer); - err = CL_OUT_OF_HOST_MEMORY; - ptr = NULL; - goto error; - } - memset(new_ptr, 0, 2 * buffer->mapped_ptr_sz * sizeof(cl_mapped_ptr)); - memcpy(new_ptr, buffer->mapped_ptr, - buffer->mapped_ptr_sz * sizeof(cl_mapped_ptr)); - slot = buffer->mapped_ptr_sz; - buffer->mapped_ptr_sz *= 2; - free(buffer->mapped_ptr); - buffer->mapped_ptr = new_ptr; - } - } - - assert(slot != -1); - buffer->mapped_ptr[slot].ptr = mem_ptr; - buffer->mapped_ptr[slot].v_ptr = ptr; - buffer->mapped_ptr[slot].size = size; - buffer->map_ref++; TRY(cl_event_check_waitlist, num_events_in_wait_list, event_wait_list, event, buffer->ctx); @@ -1706,6 +1710,7 @@ clEnqueueMapImage(cl_command_queue command_queue, { cl_int err = CL_SUCCESS; void *ptr = NULL; + void *mem_ptr = NULL; enqueue_data *data, no_wait_data = { 0 }; CHECK_QUEUE(command_queue); @@ -1747,8 +1752,13 @@ clEnqueueMapImage(cl_command_queue command_queue, } size_t offset = image->bpp*origin[0] + image->row_pitch*origin[1] + image->slice_pitch*origin[2]; - ptr = (char*)ptr + offset; + size_t size = image->depth == 1 ? image->row_pitch*image->h : image->slice_pitch*image->depth; + err = _cl_map_mem(mem, &ptr, &mem_ptr, offset, size); + if (err != CL_SUCCESS) + goto error; + + ptr = (char*)ptr + offset; TRY(cl_event_check_waitlist, num_events_in_wait_list, event_wait_list, event, mem->ctx); data = &no_wait_data; @@ -1760,6 +1770,7 @@ clEnqueueMapImage(cl_command_queue command_queue, data->slice_pitch = *image_slice_pitch; data->map_flags = map_flags; data->ptr = ptr; + data->offset = offset; if(handle_events(command_queue, num_events_in_wait_list, event_wait_list, event, data, CL_COMMAND_MAP_IMAGE) == CL_ENQUEUE_EXECUTE_IMM) { @@ -1770,7 +1781,7 @@ clEnqueueMapImage(cl_command_queue command_queue, error: if (errcode_ret) *errcode_ret = err; - return ptr; //TODO: map and unmap first + return mem_ptr; //TODO: map and unmap first } cl_int