void OpenCLImage2D :: create( OpenCLContext &ctx, cl_mem_flags usage, AlloArray *array ) { destroy(); detach(); usage = OpenCLMemoryBuffer::check_memory_flags(usage, array->data.ptr); bool at_least_2d = array->header.dimcount >= 2; size_t width = array->header.dim[0]; size_t height = at_least_2d ? array->header.dim[1] : 1; size_t rowstride = at_least_2d ? array->header.stride[1] : allo_array_size(array); cl_image_format format = OpenCLImageFormat::format_from_array(array); cl_int res = CL_SUCCESS; cl_mem mem = clCreateImage2D( ctx.get_context(), usage, &format, width, height, rowstride, array->data.ptr, &res ); if(opencl_error(res, "clCreateImage2D error creating buffer")) { return; } mMem = mem; ctx.attach_resource(this); }
void OpenCLImage2D :: create( OpenCLContext &ctx, cl_mem_flags usage, const cl_image_format *format, size_t width, size_t height, size_t rowstride, void *ptr ) { destroy(); detach(); usage = OpenCLMemoryBuffer::check_memory_flags(usage, ptr); cl_int res = CL_SUCCESS; cl_mem mem = clCreateImage2D( ctx.get_context(), usage, format, width, height, rowstride, ptr, &res ); if(opencl_error(res, "clCreateImage2D error creating buffer")) { return; } mMem = mem; ctx.attach_resource(this); }
void OpenCLCommandQueue :: create(OpenCLContext &ctx, const OpenCLDevice &dev, bool ordered, bool profiling) { destroy(); detach(); cl_command_queue_properties properties = 0; if(profiling) { properties |= CL_QUEUE_PROFILING_ENABLE; } if(! ordered) { if(GET_FLAG(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, dev.get_queue_properties())) { properties |= CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE; } else { opencl_error(USER_OPENCL_ERROR, "Device doesn't support out of order execution ... disabling"); } } cl_int res = CL_SUCCESS; cl_command_queue command_queue = clCreateCommandQueue( ctx.get_context(), dev.get_device(), properties, &res ); if(opencl_error(res, "clCreateCommandQueue error creating command queue")) { return; } mCommandQueue = command_queue; ctx.attach_resource(this); }