As we treat 1D array image as a 2d array image with height 1 internally, we need to fixup region and origins passed in from external APIs.
Signed-off-by: Zhigang Gong <[email protected]> --- src/cl_api.c | 39 ++++++++++++++++++++++++++------------- src/cl_utils.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/cl_api.c b/src/cl_api.c index 327f02b..b17cc52 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -2046,8 +2046,8 @@ cl_int clEnqueueReadImage(cl_command_queue command_queue, cl_mem mem, cl_bool blocking_read, - const size_t * origin, - const size_t * region, + const size_t * porigin, + const size_t * pregion, size_t row_pitch, size_t slice_pitch, void * ptr, @@ -2060,6 +2060,8 @@ clEnqueueReadImage(cl_command_queue command_queue, CHECK_QUEUE(command_queue); CHECK_IMAGE(mem, image); + FIXUP_IMAGE_REGION(image, pregion, region); + FIXUP_IMAGE_ORIGIN(image, porigin, origin); if (command_queue->ctx != mem->ctx) { err = CL_INVALID_CONTEXT; goto error; @@ -2125,8 +2127,8 @@ cl_int clEnqueueWriteImage(cl_command_queue command_queue, cl_mem mem, cl_bool blocking_write, - const size_t * origin, - const size_t * region, + const size_t * porigin, + const size_t * pregion, size_t row_pitch, size_t slice_pitch, const void * ptr, @@ -2139,6 +2141,8 @@ clEnqueueWriteImage(cl_command_queue command_queue, CHECK_QUEUE(command_queue); CHECK_IMAGE(mem, image); + FIXUP_IMAGE_REGION(image, pregion, region); + FIXUP_IMAGE_ORIGIN(image, porigin, origin); if (command_queue->ctx != mem->ctx) { err = CL_INVALID_CONTEXT; goto error; @@ -2204,9 +2208,9 @@ cl_int clEnqueueCopyImage(cl_command_queue command_queue, cl_mem src_mem, cl_mem dst_mem, - const size_t * src_origin, - const size_t * dst_origin, - const size_t * region, + const size_t * psrc_origin, + const size_t * pdst_origin, + const size_t * pregion, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) @@ -2219,6 +2223,9 @@ clEnqueueCopyImage(cl_command_queue command_queue, CHECK_QUEUE(command_queue); CHECK_IMAGE(src_mem, src_image); CHECK_IMAGE(dst_mem, dst_image); + FIXUP_IMAGE_REGION(src_image, pregion, region); + FIXUP_IMAGE_ORIGIN(src_image, psrc_origin, src_origin); + FIXUP_IMAGE_ORIGIN(dst_image, pdst_origin, dst_origin); if (command_queue->ctx != src_mem->ctx || command_queue->ctx != dst_mem->ctx) { err = CL_INVALID_CONTEXT; @@ -2288,8 +2295,8 @@ cl_int clEnqueueCopyImageToBuffer(cl_command_queue command_queue, cl_mem src_mem, cl_mem dst_buffer, - const size_t * src_origin, - const size_t * region, + const size_t * psrc_origin, + const size_t * pregion, size_t dst_offset, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, @@ -2301,6 +2308,8 @@ clEnqueueCopyImageToBuffer(cl_command_queue command_queue, CHECK_QUEUE(command_queue); CHECK_IMAGE(src_mem, src_image); CHECK_MEM(dst_buffer); + FIXUP_IMAGE_REGION(src_image, pregion, region); + FIXUP_IMAGE_ORIGIN(src_image, psrc_origin, src_origin); if (command_queue->ctx != src_mem->ctx || command_queue->ctx != dst_buffer->ctx) { err = CL_INVALID_CONTEXT; @@ -2353,8 +2362,8 @@ clEnqueueCopyBufferToImage(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_mem, size_t src_offset, - const size_t * dst_origin, - const size_t * region, + const size_t * pdst_origin, + const size_t * pregion, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) @@ -2365,6 +2374,8 @@ clEnqueueCopyBufferToImage(cl_command_queue command_queue, CHECK_QUEUE(command_queue); CHECK_MEM(src_buffer); CHECK_IMAGE(dst_mem, dst_image); + FIXUP_IMAGE_REGION(dst_image, pregion, region); + FIXUP_IMAGE_ORIGIN(dst_image, pdst_origin, dst_origin); if (command_queue->ctx != src_buffer->ctx || command_queue->ctx != dst_mem->ctx) { err = CL_INVALID_CONTEXT; @@ -2556,8 +2567,8 @@ clEnqueueMapImage(cl_command_queue command_queue, cl_mem mem, cl_bool blocking_map, cl_map_flags map_flags, - const size_t * origin, - const size_t * region, + const size_t * porigin, + const size_t * pregion, size_t * image_row_pitch, size_t * image_slice_pitch, cl_uint num_events_in_wait_list, @@ -2572,6 +2583,8 @@ clEnqueueMapImage(cl_command_queue command_queue, CHECK_QUEUE(command_queue); CHECK_IMAGE(mem, image); + FIXUP_IMAGE_REGION(image, pregion, region); + FIXUP_IMAGE_ORIGIN(image, porigin, origin); if (command_queue->ctx != mem->ctx) { err = CL_INVALID_CONTEXT; goto error; diff --git a/src/cl_utils.h b/src/cl_utils.h index fa900a7..26cf329 100644 --- a/src/cl_utils.h +++ b/src/cl_utils.h @@ -149,6 +149,35 @@ do { \ struct _cl_mem_image *IMAGE; \ IMAGE = cl_mem_image(MEM); \ +#define FIXUP_IMAGE_REGION(IMAGE, PREGION, REGION) \ +const size_t *REGION; \ +size_t REGION ##_REC[3]; \ +do { \ + if (IMAGE->image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) { \ + REGION ##_REC[0] = PREGION[0]; \ + REGION ##_REC[1] = 1; \ + REGION ##_REC[2] = PREGION[1]; \ + REGION = REGION ##_REC; \ + } else { \ + REGION = PREGION; \ + } \ +} while(0) + +#define FIXUP_IMAGE_ORIGIN(IMAGE, PREGION, REGION) \ +const size_t *REGION; \ +size_t REGION ##_REC[3]; \ +do { \ + if (IMAGE->image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) { \ + REGION ##_REC[0] = PREGION[0]; \ + REGION ##_REC[1] = 0; \ + REGION ##_REC[2] = PREGION[1]; \ + REGION = REGION ##_REC; \ + } else { \ + REGION = PREGION; \ + } \ +} while(0) + + #define CHECK_EVENT(EVENT) \ do { \ if (UNLIKELY(EVENT == NULL)) { \ -- 1.8.3.2 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
