blob: e542d117649fea05ae0cf93c435c7e0ff121383b [file]
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// validationCL.cpp: Validation functions for generic CL entry point parameters
#include "libANGLE/validationCL_autogen.h"
#define ANGLE_ERROR_RETURN(error, ret) \
if (errcode_ret != nullptr) \
{ \
*errcode_ret = error; \
} \
return ret
namespace cl
{
namespace
{
const Platform *ValidateContextProperties(const cl_context_properties *properties,
cl_int *errcode_ret)
{
cl_platform_id platform = nullptr;
bool hasUserSync = false;
if (properties != nullptr)
{
while (*properties != 0)
{
switch (*properties++)
{
case CL_CONTEXT_PLATFORM:
if (platform != nullptr)
{
ANGLE_ERROR_RETURN(CL_INVALID_PROPERTY, nullptr);
}
platform = reinterpret_cast<cl_platform_id>(*properties++);
if (!Platform::IsValid(platform))
{
ANGLE_ERROR_RETURN(CL_INVALID_PLATFORM, nullptr);
}
break;
case CL_CONTEXT_INTEROP_USER_SYNC:
if (hasUserSync || (*properties != CL_FALSE && *properties != CL_TRUE))
{
ANGLE_ERROR_RETURN(CL_INVALID_PROPERTY, nullptr);
}
++properties;
hasUserSync = true;
break;
default:
ANGLE_ERROR_RETURN(CL_INVALID_PROPERTY, nullptr);
}
}
}
if (platform == nullptr)
{
platform = Platform::GetDefault();
if (platform == nullptr)
{
ANGLE_ERROR_RETURN(CL_INVALID_PLATFORM, nullptr);
}
}
return static_cast<Platform *>(platform);
}
} // namespace
// CL 1.0
cl_int ValidateGetPlatformIDs(cl_uint num_entries,
const cl_platform_id *platforms,
const cl_uint *num_platforms)
{
if ((num_entries == 0u && platforms != nullptr) ||
(platforms == nullptr && num_platforms == nullptr))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
cl_int ValidateGetPlatformInfo(cl_platform_id platform,
PlatformInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
if (!Platform::IsValidOrDefault(platform))
{
return CL_INVALID_PLATFORM;
}
if (param_name == PlatformInfo::InvalidEnum ||
(param_value_size == 0u && param_value != nullptr))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
cl_int ValidateGetDeviceIDs(cl_platform_id platform,
cl_device_type device_type,
cl_uint num_entries,
const cl_device_id *devices,
const cl_uint *num_devices)
{
if (!Platform::IsValidOrDefault(platform))
{
return CL_INVALID_PLATFORM;
}
if (!Device::IsValidType(device_type))
{
return CL_INVALID_DEVICE_TYPE;
}
if ((num_entries == 0u && devices != nullptr) || (devices == nullptr && num_devices == nullptr))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
cl_int ValidateGetDeviceInfo(cl_device_id device,
DeviceInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
if (!Device::IsValid(device))
{
return CL_INVALID_DEVICE;
}
if (param_name == DeviceInfo::InvalidEnum || (param_value_size == 0u && param_value != nullptr))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
bool ValidateCreateContext(const cl_context_properties *properties,
cl_uint num_devices,
const cl_device_id *devices,
void(CL_CALLBACK *pfn_notify)(const char *errinfo,
const void *private_info,
size_t cb,
void *user_data),
const void *user_data,
cl_int *errcode_ret)
{
const Platform *const platform = ValidateContextProperties(properties, errcode_ret);
if (platform == nullptr)
{
return false;
}
if (num_devices == 0u || devices == nullptr || (pfn_notify == nullptr && user_data != nullptr))
{
ANGLE_ERROR_RETURN(CL_INVALID_VALUE, false);
}
while (num_devices-- > 0u)
{
if (!platform->hasDevice(*devices++))
{
ANGLE_ERROR_RETURN(CL_INVALID_DEVICE, false);
}
}
return true;
}
bool ValidateCreateContextFromType(const cl_context_properties *properties,
cl_device_type device_type,
void(CL_CALLBACK *pfn_notify)(const char *errinfo,
const void *private_info,
size_t cb,
void *user_data),
const void *user_data,
cl_int *errcode_ret)
{
const Platform *const platform = ValidateContextProperties(properties, errcode_ret);
if (platform == nullptr)
{
return false;
}
if (!Device::IsValidType(device_type))
{
ANGLE_ERROR_RETURN(CL_INVALID_DEVICE_TYPE, false);
}
if (pfn_notify == nullptr && user_data != nullptr)
{
ANGLE_ERROR_RETURN(CL_INVALID_VALUE, false);
}
return true;
}
cl_int ValidateRetainContext(cl_context context)
{
return Context::IsValid(context) ? CL_SUCCESS : CL_INVALID_CONTEXT;
}
cl_int ValidateReleaseContext(cl_context context)
{
return Context::IsValid(context) ? CL_SUCCESS : CL_INVALID_CONTEXT;
}
cl_int ValidateGetContextInfo(cl_context context,
ContextInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
if (!Context::IsValid(context))
{
return CL_INVALID_CONTEXT;
}
if (param_name == ContextInfo::InvalidEnum ||
(param_value_size == 0u && param_value != nullptr))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
cl_int ValidateRetainCommandQueue(cl_command_queue command_queue)
{
return CommandQueue::IsValid(command_queue) ? CL_SUCCESS : CL_INVALID_COMMAND_QUEUE;
}
cl_int ValidateReleaseCommandQueue(cl_command_queue command_queue)
{
return CommandQueue::IsValid(command_queue) ? CL_SUCCESS : CL_INVALID_COMMAND_QUEUE;
}
cl_int ValidateGetCommandQueueInfo(cl_command_queue command_queue,
CommandQueueInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
if (!CommandQueue::IsValid(command_queue))
{
return CL_INVALID_COMMAND_QUEUE;
}
const cl_version version =
static_cast<CommandQueue *>(command_queue)->getDevice().getInfo().mVersion;
if (param_name == CommandQueueInfo::InvalidEnum ||
(param_name == CommandQueueInfo::Size && version < CL_MAKE_VERSION(2, 0, 0)) ||
(param_name == CommandQueueInfo::DeviceDefault && version < CL_MAKE_VERSION(2, 1, 0)) ||
(param_name == CommandQueueInfo::PropertiesArray && version < CL_MAKE_VERSION(3, 0, 0)) ||
(param_value_size == 0u && param_value != nullptr))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
bool ValidateCreateBuffer(cl_context context,
cl_mem_flags flags,
size_t size,
const void *host_ptr,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateRetainMemObject(cl_mem memobj)
{
return CL_SUCCESS;
}
cl_int ValidateReleaseMemObject(cl_mem memobj)
{
return CL_SUCCESS;
}
cl_int ValidateGetSupportedImageFormats(cl_context context,
cl_mem_flags flags,
MemObjectType image_type,
cl_uint num_entries,
const cl_image_format *image_formats,
const cl_uint *num_image_formats)
{
return CL_SUCCESS;
}
cl_int ValidateGetMemObjectInfo(cl_mem memobj,
MemInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateGetImageInfo(cl_mem image,
ImageInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateRetainSampler(cl_sampler sampler)
{
return CL_SUCCESS;
}
cl_int ValidateReleaseSampler(cl_sampler sampler)
{
return CL_SUCCESS;
}
cl_int ValidateGetSamplerInfo(cl_sampler sampler,
SamplerInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
bool ValidateCreateProgramWithSource(cl_context context,
cl_uint count,
const char **strings,
const size_t *lengths,
cl_int *errcode_ret)
{
return true;
}
bool ValidateCreateProgramWithBinary(cl_context context,
cl_uint num_devices,
const cl_device_id *device_list,
const size_t *lengths,
const unsigned char **binaries,
const cl_int *binary_status,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateRetainProgram(cl_program program)
{
return CL_SUCCESS;
}
cl_int ValidateReleaseProgram(cl_program program)
{
return CL_SUCCESS;
}
cl_int ValidateBuildProgram(cl_program program,
cl_uint num_devices,
const cl_device_id *device_list,
const char *options,
void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
const void *user_data)
{
return CL_SUCCESS;
}
cl_int ValidateGetProgramInfo(cl_program program,
ProgramInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateGetProgramBuildInfo(cl_program program,
cl_device_id device,
ProgramBuildInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
bool ValidateCreateKernel(cl_program program, const char *kernel_name, cl_int *errcode_ret)
{
return true;
}
cl_int ValidateCreateKernelsInProgram(cl_program program,
cl_uint num_kernels,
const cl_kernel *kernels,
const cl_uint *num_kernels_ret)
{
return CL_SUCCESS;
}
cl_int ValidateRetainKernel(cl_kernel kernel)
{
return CL_SUCCESS;
}
cl_int ValidateReleaseKernel(cl_kernel kernel)
{
return CL_SUCCESS;
}
cl_int ValidateSetKernelArg(cl_kernel kernel,
cl_uint arg_index,
size_t arg_size,
const void *arg_value)
{
return CL_SUCCESS;
}
cl_int ValidateGetKernelInfo(cl_kernel kernel,
KernelInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateGetKernelWorkGroupInfo(cl_kernel kernel,
cl_device_id device,
KernelWorkGroupInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateWaitForEvents(cl_uint num_events, const cl_event *event_list)
{
return CL_SUCCESS;
}
cl_int ValidateGetEventInfo(cl_event event,
EventInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateRetainEvent(cl_event event)
{
return CL_SUCCESS;
}
cl_int ValidateReleaseEvent(cl_event event)
{
return CL_SUCCESS;
}
cl_int ValidateGetEventProfilingInfo(cl_event event,
ProfilingInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateFlush(cl_command_queue command_queue)
{
return CL_SUCCESS;
}
cl_int ValidateFinish(cl_command_queue command_queue)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueReadBuffer(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_read,
size_t offset,
size_t size,
const void *ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueWriteBuffer(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_write,
size_t offset,
size_t size,
const void *ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueCopyBuffer(cl_command_queue command_queue,
cl_mem src_buffer,
cl_mem dst_buffer,
size_t src_offset,
size_t dst_offset,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueReadImage(cl_command_queue command_queue,
cl_mem image,
cl_bool blocking_read,
const size_t *origin,
const size_t *region,
size_t row_pitch,
size_t slice_pitch,
const void *ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueWriteImage(cl_command_queue command_queue,
cl_mem image,
cl_bool blocking_write,
const size_t *origin,
const size_t *region,
size_t input_row_pitch,
size_t input_slice_pitch,
const void *ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueCopyImage(cl_command_queue command_queue,
cl_mem src_image,
cl_mem dst_image,
const size_t *src_origin,
const size_t *dst_origin,
const size_t *region,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueCopyImageToBuffer(cl_command_queue command_queue,
cl_mem src_image,
cl_mem dst_buffer,
const size_t *src_origin,
const size_t *region,
size_t dst_offset,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueCopyBufferToImage(cl_command_queue command_queue,
cl_mem src_buffer,
cl_mem dst_image,
size_t src_offset,
const size_t *dst_origin,
const size_t *region,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
bool ValidateEnqueueMapBuffer(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_map,
cl_map_flags map_flags,
size_t offset,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event,
cl_int *errcode_ret)
{
return true;
}
bool ValidateEnqueueMapImage(cl_command_queue command_queue,
cl_mem image,
cl_bool blocking_map,
cl_map_flags map_flags,
const size_t *origin,
const size_t *region,
const size_t *image_row_pitch,
const size_t *image_slice_pitch,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateEnqueueUnmapMemObject(cl_command_queue command_queue,
cl_mem memobj,
const void *mapped_ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueNDRangeKernel(cl_command_queue command_queue,
cl_kernel kernel,
cl_uint work_dim,
const size_t *global_work_offset,
const size_t *global_work_size,
const size_t *local_work_size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueNativeKernel(cl_command_queue command_queue,
void(CL_CALLBACK *user_func)(void *),
const void *args,
size_t cb_args,
cl_uint num_mem_objects,
const cl_mem *mem_list,
const void **args_mem_loc,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateSetCommandQueueProperty(cl_command_queue command_queue,
cl_command_queue_properties properties,
cl_bool enable,
const cl_command_queue_properties *old_properties)
{
if (!CommandQueue::IsValid(command_queue))
{
return CL_INVALID_COMMAND_QUEUE;
}
// Fails if properties bitfield is not zero after masking out all allowed values
if ((properties & ~(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_PROFILING_ENABLE)) != 0u)
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
bool ValidateCreateImage2D(cl_context context,
cl_mem_flags flags,
const cl_image_format *image_format,
size_t image_width,
size_t image_height,
size_t image_row_pitch,
const void *host_ptr,
cl_int *errcode_ret)
{
return true;
}
bool ValidateCreateImage3D(cl_context context,
cl_mem_flags flags,
const cl_image_format *image_format,
size_t image_width,
size_t image_height,
size_t image_depth,
size_t image_row_pitch,
size_t image_slice_pitch,
const void *host_ptr,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateEnqueueMarker(cl_command_queue command_queue, const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueWaitForEvents(cl_command_queue command_queue,
cl_uint num_events,
const cl_event *event_list)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueBarrier(cl_command_queue command_queue)
{
return CL_SUCCESS;
}
cl_int ValidateUnloadCompiler()
{
return CL_SUCCESS;
}
bool ValidateGetExtensionFunctionAddress(const char *func_name)
{
return func_name != nullptr && *func_name != '\0';
}
bool ValidateCreateCommandQueue(cl_context context,
cl_device_id device,
cl_command_queue_properties properties,
cl_int *errcode_ret)
{
if (!Context::IsValid(context))
{
ANGLE_ERROR_RETURN(CL_INVALID_CONTEXT, false);
}
if (!static_cast<Context *>(context)->hasDevice(device))
{
ANGLE_ERROR_RETURN(CL_INVALID_DEVICE, false);
}
// Fails if properties bitfield is not zero after masking out all allowed values
if ((properties & ~(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_PROFILING_ENABLE)) != 0u)
{
ANGLE_ERROR_RETURN(CL_INVALID_VALUE, false);
}
return true;
}
bool ValidateCreateSampler(cl_context context,
cl_bool normalized_coords,
AddressingMode addressing_mode,
FilterMode filter_mode,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateEnqueueTask(cl_command_queue command_queue,
cl_kernel kernel,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
// CL 1.1
bool ValidateCreateSubBuffer(cl_mem buffer,
cl_mem_flags flags,
cl_buffer_create_type buffer_create_type,
const void *buffer_create_info,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateSetMemObjectDestructorCallback(cl_mem memobj,
void(CL_CALLBACK *pfn_notify)(cl_mem memobj,
void *user_data),
const void *user_data)
{
return CL_SUCCESS;
}
bool ValidateCreateUserEvent(cl_context context, cl_int *errcode_ret)
{
return true;
}
cl_int ValidateSetUserEventStatus(cl_event event, cl_int execution_status)
{
return CL_SUCCESS;
}
cl_int ValidateSetEventCallback(cl_event event,
cl_int command_exec_callback_type,
void(CL_CALLBACK *pfn_notify)(cl_event event,
cl_int event_command_status,
void *user_data),
const void *user_data)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueReadBufferRect(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_read,
const size_t *buffer_origin,
const size_t *host_origin,
const size_t *region,
size_t buffer_row_pitch,
size_t buffer_slice_pitch,
size_t host_row_pitch,
size_t host_slice_pitch,
const void *ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueWriteBufferRect(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_write,
const size_t *buffer_origin,
const size_t *host_origin,
const size_t *region,
size_t buffer_row_pitch,
size_t buffer_slice_pitch,
size_t host_row_pitch,
size_t host_slice_pitch,
const void *ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueCopyBufferRect(cl_command_queue command_queue,
cl_mem src_buffer,
cl_mem dst_buffer,
const size_t *src_origin,
const size_t *dst_origin,
const size_t *region,
size_t src_row_pitch,
size_t src_slice_pitch,
size_t dst_row_pitch,
size_t dst_slice_pitch,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
// CL 1.2
cl_int ValidateCreateSubDevices(cl_device_id in_device,
const cl_device_partition_property *properties,
cl_uint num_devices,
const cl_device_id *out_devices,
const cl_uint *num_devices_ret)
{
if (!Device::IsValid(in_device) ||
static_cast<Device *>(in_device)->getInfo().mVersion < CL_MAKE_VERSION(1, 2, 0))
{
return CL_INVALID_DEVICE;
}
if (properties == nullptr || (*properties != CL_DEVICE_PARTITION_EQUALLY &&
*properties != CL_DEVICE_PARTITION_BY_COUNTS &&
*properties != CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
cl_int ValidateRetainDevice(cl_device_id device)
{
return Device::IsValid(device) &&
static_cast<Device *>(device)->getInfo().mVersion >= CL_MAKE_VERSION(1, 2, 0)
? CL_SUCCESS
: CL_INVALID_DEVICE;
}
cl_int ValidateReleaseDevice(cl_device_id device)
{
return Device::IsValid(device) &&
static_cast<Device *>(device)->getInfo().mVersion >= CL_MAKE_VERSION(1, 2, 0)
? CL_SUCCESS
: CL_INVALID_DEVICE;
}
bool ValidateCreateImage(cl_context context,
cl_mem_flags flags,
const cl_image_format *image_format,
const cl_image_desc *image_desc,
const void *host_ptr,
cl_int *errcode_ret)
{
return true;
}
bool ValidateCreateProgramWithBuiltInKernels(cl_context context,
cl_uint num_devices,
const cl_device_id *device_list,
const char *kernel_names,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateCompileProgram(cl_program program,
cl_uint num_devices,
const cl_device_id *device_list,
const char *options,
cl_uint num_input_headers,
const cl_program *input_headers,
const char **header_include_names,
void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
const void *user_data)
{
return CL_SUCCESS;
}
bool ValidateLinkProgram(cl_context context,
cl_uint num_devices,
const cl_device_id *device_list,
const char *options,
cl_uint num_input_programs,
const cl_program *input_programs,
void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
const void *user_data,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateUnloadPlatformCompiler(cl_platform_id platform)
{
return CL_SUCCESS;
}
cl_int ValidateGetKernelArgInfo(cl_kernel kernel,
cl_uint arg_index,
KernelArgInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueFillBuffer(cl_command_queue command_queue,
cl_mem buffer,
const void *pattern,
size_t pattern_size,
size_t offset,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueFillImage(cl_command_queue command_queue,
cl_mem image,
const void *fill_color,
const size_t *origin,
const size_t *region,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueMigrateMemObjects(cl_command_queue command_queue,
cl_uint num_mem_objects,
const cl_mem *mem_objects,
cl_mem_migration_flags flags,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueMarkerWithWaitList(cl_command_queue command_queue,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueBarrierWithWaitList(cl_command_queue command_queue,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
bool ValidateGetExtensionFunctionAddressForPlatform(cl_platform_id platform, const char *func_name)
{
return Platform::IsValid(platform) && func_name != nullptr && *func_name != '\0';
}
// CL 2.0
bool ValidateCreateCommandQueueWithProperties(cl_context context,
cl_device_id device,
const cl_queue_properties *properties,
cl_int *errcode_ret)
{
if (!Context::IsValid(context))
{
ANGLE_ERROR_RETURN(CL_INVALID_CONTEXT, false);
}
if (!static_cast<Context *>(context)->hasDevice(device) ||
static_cast<Device *>(device)->getInfo().mVersion < CL_MAKE_VERSION(2, 0, 0))
{
ANGLE_ERROR_RETURN(CL_INVALID_DEVICE, false);
}
if (properties != nullptr)
{
while (*properties != 0)
{
switch (*properties++)
{
case CL_QUEUE_PROPERTIES:
{
const cl_command_queue_properties props = *properties++;
// Fails if properties bitfield is not zero after masking out allowed values
if ((props &
~(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_PROFILING_ENABLE |
CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT)) != 0u ||
// Fails for invalid value combinations
((props & CL_QUEUE_ON_DEVICE) != 0u &&
(props & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE) == 0u) ||
((props & CL_QUEUE_ON_DEVICE_DEFAULT) != 0u &&
(props & CL_QUEUE_ON_DEVICE) == 0u))
{
ANGLE_ERROR_RETURN(CL_INVALID_VALUE, false);
}
break;
}
case CL_QUEUE_SIZE:
{
cl_uint maxSize = 0u;
if (static_cast<Device *>(device)->getInfoUInt(DeviceInfo::QueueOnDeviceMaxSize,
&maxSize) != CL_SUCCESS ||
*properties > maxSize)
{
ANGLE_ERROR_RETURN(CL_INVALID_VALUE, false);
}
++properties;
break;
}
default:
ANGLE_ERROR_RETURN(CL_INVALID_VALUE, false);
}
}
}
return true;
}
bool ValidateCreatePipe(cl_context context,
cl_mem_flags flags,
cl_uint pipe_packet_size,
cl_uint pipe_max_packets,
const cl_pipe_properties *properties,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateGetPipeInfo(cl_mem pipe,
PipeInfo param_name,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
bool ValidateSVMAlloc(cl_context context, cl_svm_mem_flags flags, size_t size, cl_uint alignment)
{
return true;
}
bool ValidateSVMFree(cl_context context, const void *svm_pointer)
{
return true;
}
bool ValidateCreateSamplerWithProperties(cl_context context,
const cl_sampler_properties *sampler_properties,
cl_int *errcode_ret)
{
return true;
}
cl_int ValidateSetKernelArgSVMPointer(cl_kernel kernel, cl_uint arg_index, const void *arg_value)
{
return CL_SUCCESS;
}
cl_int ValidateSetKernelExecInfo(cl_kernel kernel,
KernelExecInfo param_name,
size_t param_value_size,
const void *param_value)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueSVMFree(cl_command_queue command_queue,
cl_uint num_svm_pointers,
void *const svm_pointers[],
void(CL_CALLBACK *pfn_free_func)(cl_command_queue queue,
cl_uint num_svm_pointers,
void *svm_pointers[],
void *user_data),
const void *user_data,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueSVMMemcpy(cl_command_queue command_queue,
cl_bool blocking_copy,
const void *dst_ptr,
const void *src_ptr,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueSVMMemFill(cl_command_queue command_queue,
const void *svm_ptr,
const void *pattern,
size_t pattern_size,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueSVMMap(cl_command_queue command_queue,
cl_bool blocking_map,
cl_map_flags flags,
const void *svm_ptr,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueSVMUnmap(cl_command_queue command_queue,
const void *svm_ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
// CL 2.1
cl_int ValidateSetDefaultDeviceCommandQueue(cl_context context,
cl_device_id device,
cl_command_queue command_queue)
{
return CL_SUCCESS;
}
cl_int ValidateGetDeviceAndHostTimer(cl_device_id device,
const cl_ulong *device_timestamp,
const cl_ulong *host_timestamp)
{
return CL_SUCCESS;
}
cl_int ValidateGetHostTimer(cl_device_id device, const cl_ulong *host_timestamp)
{
return CL_SUCCESS;
}
bool ValidateCreateProgramWithIL(cl_context context,
const void *il,
size_t length,
cl_int *errcode_ret)
{
return true;
}
bool ValidateCloneKernel(cl_kernel source_kernel, cl_int *errcode_ret)
{
return true;
}
cl_int ValidateGetKernelSubGroupInfo(cl_kernel kernel,
cl_device_id device,
KernelSubGroupInfo param_name,
size_t input_value_size,
const void *input_value,
size_t param_value_size,
const void *param_value,
const size_t *param_value_size_ret)
{
return CL_SUCCESS;
}
cl_int ValidateEnqueueSVMMigrateMem(cl_command_queue command_queue,
cl_uint num_svm_pointers,
const void **svm_pointers,
const size_t *sizes,
cl_mem_migration_flags flags,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
const cl_event *event)
{
return CL_SUCCESS;
}
// CL 2.2
cl_int ValidateSetProgramReleaseCallback(cl_program program,
void(CL_CALLBACK *pfn_notify)(cl_program program,
void *user_data),
const void *user_data)
{
return CL_SUCCESS;
}
cl_int ValidateSetProgramSpecializationConstant(cl_program program,
cl_uint spec_id,
size_t spec_size,
const void *spec_value)
{
return CL_SUCCESS;
}
// CL 3.0
cl_int ValidateSetContextDestructorCallback(cl_context context,
void(CL_CALLBACK *pfn_notify)(cl_context context,
void *user_data),
const void *user_data)
{
return CL_SUCCESS;
}
bool ValidateCreateBufferWithProperties(cl_context context,
const cl_mem_properties *properties,
cl_mem_flags flags,
size_t size,
const void *host_ptr,
cl_int *errcode_ret)
{
return true;
}
bool ValidateCreateImageWithProperties(cl_context context,
const cl_mem_properties *properties,
cl_mem_flags flags,
const cl_image_format *image_format,
const cl_image_desc *image_desc,
const void *host_ptr,
cl_int *errcode_ret)
{
return true;
}
// cl_khr_icd
cl_int ValidateIcdGetPlatformIDsKHR(cl_uint num_entries,
const cl_platform_id *platforms,
const cl_uint *num_platforms)
{
if ((num_entries == 0u && platforms != nullptr) ||
(platforms == nullptr && num_platforms == nullptr))
{
return CL_INVALID_VALUE;
}
return CL_SUCCESS;
}
} // namespace cl