clover: Add support for CL_MAP_WRITE_INVALIDATE_REGION

OpenCL 1.2 CL_MAP_WRITE_INVALIDATE_REGION sounds a lot like
PIPE_TRANSFER_DISCARD_RANGE:

From OpenCL 1.2 spec:
    The contents of the region being mapped are to be discarded.

From p_defines.h:
    Discards the memory within the mapped region.

v2: Move the code for validating flags to the front-end as
    suggested by Francisco Jerez

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
Bruno Jiménez 2014-08-07 16:34:53 +02:00 committed by Francisco Jerez
parent 8d853468bd
commit ec73778f1f
2 changed files with 14 additions and 0 deletions

View File

@ -167,6 +167,16 @@ namespace {
}
}
///
/// Checks that the mapping flags are correct.
///
void
validate_flags(const cl_map_flags flags) {
if ((flags & (CL_MAP_WRITE | CL_MAP_READ)) &&
(flags & CL_MAP_WRITE_INVALIDATE_REGION))
throw error(CL_INVALID_VALUE);
}
///
/// Class that encapsulates the task of mapping an object of type
/// \a T. The return value of get() should be implicitly
@ -629,6 +639,7 @@ clEnqueueMapBuffer(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
validate_common(q, deps);
validate_object(q, mem, obj_origin, obj_pitch, region);
validate_flags(flags);
void *map = mem.resource(q).add_map(q, flags, blocking, obj_origin, region);
@ -656,6 +667,7 @@ clEnqueueMapImage(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
validate_common(q, deps);
validate_object(q, img, origin, region);
validate_flags(flags);
void *map = img.resource(q).add_map(q, flags, blocking, origin, region);

View File

@ -174,6 +174,8 @@ mapping::mapping(command_queue &q, resource &r,
pctx(q.pipe) {
unsigned usage = ((flags & CL_MAP_WRITE ? PIPE_TRANSFER_WRITE : 0 ) |
(flags & CL_MAP_READ ? PIPE_TRANSFER_READ : 0 ) |
(flags & CL_MAP_WRITE_INVALIDATE_REGION ?
PIPE_TRANSFER_DISCARD_RANGE : 0) |
(!blocking ? PIPE_TRANSFER_UNSYNCHRONIZED : 0));
p = pctx->transfer_map(pctx, r.pipe, 0, usage,