//
// 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.
//
// cl_stubs.cpp: Stubs for CL entry points.
//

#include "common/unsafe_buffers.h"
#include "libANGLE/cl_utils.h"
#include "libGLESv2/cl_stubs_autogen.h"

#include "libGLESv2/proc_table_cl.h"

#include "libANGLE/CLBuffer.h"
#include "libANGLE/CLCommandQueue.h"
#include "libANGLE/CLContext.h"
#include "libANGLE/CLDevice.h"
#include "libANGLE/CLEvent.h"
#include "libANGLE/CLImage.h"
#include "libANGLE/CLKernel.h"
#include "libANGLE/CLMemory.h"
#include "libANGLE/CLPlatform.h"
#include "libANGLE/CLProgram.h"
#include "libANGLE/CLSampler.h"

#define WARN_NOT_SUPPORTED(command)                                         \
    do                                                                      \
    {                                                                       \
        static bool sWarned = false;                                        \
        if (!sWarned)                                                       \
        {                                                                   \
            sWarned = true;                                                 \
            WARN() << "OpenCL command " #command " is not (yet) supported"; \
        }                                                                   \
    } while (0)

#define CL_RETURN_ERROR(command)                                    \
    do                                                              \
    {                                                               \
        if (IsError(command))                                       \
        {                                                           \
            ERR() << "failed with error code: " << cl::gClErrorTls; \
        }                                                           \
        return cl::gClErrorTls;                                     \
    } while (0)

#define CL_RETURN_OBJ(command)                                      \
    do                                                              \
    {                                                               \
        auto obj = command;                                         \
        if (cl::gClErrorTls != CL_SUCCESS)                          \
        {                                                           \
            ERR() << "failed with error code: " << cl::gClErrorTls; \
            return nullptr;                                         \
        }                                                           \
        return obj;                                                 \
    } while (0)

#define CL_RETURN_PTR(ptrOut, command)                              \
    do                                                              \
    {                                                               \
        void *ptrOut = nullptr;                                     \
        if (IsError(command))                                       \
        {                                                           \
            ERR() << "failed with error code: " << cl::gClErrorTls; \
            return nullptr;                                         \
        }                                                           \
        return ptrOut;                                              \
    } while (0)

namespace cl
{

cl_int IcdGetPlatformIDsKHR(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
{
    CL_RETURN_ERROR((Platform::GetPlatformIDs(num_entries, platforms, num_platforms)));
}

void *IcdGetFunctionAddressForPlatformKHR(cl_platform_id platform, const char *func_name)
{
    WARN_NOT_SUPPORTED(IcdGetFunctionAddressForPlatformKHR);
    return 0;
}

cl_int IcdSetPlatformDispatchDataKHR(cl_platform_id platform, void *dispatch_data)
{
    WARN_NOT_SUPPORTED(IcdSetPlatformDispatchDataKHR);
    return CL_INVALID_OPERATION;
}

cl_int GetPlatformIDs(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
{
    CL_RETURN_ERROR(Platform::GetPlatformIDs(num_entries, platforms, num_platforms));
}

cl_int GetPlatformInfo(cl_platform_id platform,
                       PlatformInfo param_name,
                       size_t param_value_size,
                       void *param_value,
                       size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(Platform::CastOrDefault(platform)->getInfo(param_name, param_value_size,
                                                               param_value, param_value_size_ret));
}

cl_int GetDeviceIDs(cl_platform_id platform,
                    DeviceType device_type,
                    cl_uint num_entries,
                    cl_device_id *devices,
                    cl_uint *num_devices)
{
    CL_RETURN_ERROR(Platform::CastOrDefault(platform)->getDeviceIDs(device_type, num_entries,
                                                                    devices, num_devices));
}

cl_int GetDeviceInfo(cl_device_id device,
                     DeviceInfo param_name,
                     size_t param_value_size,
                     void *param_value,
                     size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(device->cast<Device>().getInfo(param_name, param_value_size, param_value,
                                                   param_value_size_ret));
}

cl_int CreateSubDevices(cl_device_id in_device,
                        const cl_device_partition_property *properties,
                        cl_uint num_devices,
                        cl_device_id *out_devices,
                        cl_uint *num_devices_ret)
{
    CL_RETURN_ERROR(in_device->cast<Device>().createSubDevices(properties, num_devices, out_devices,
                                                               num_devices_ret));
}

cl_int RetainDevice(cl_device_id device)
{
    Device &dev = device->cast<Device>();
    if (!dev.isRoot())
    {
        dev.retain();
    }
    return CL_SUCCESS;
}

cl_int ReleaseDevice(cl_device_id device)
{
    Device &dev = device->cast<Device>();
    if (!dev.isRoot() && dev.release())
    {
        delete &dev;
    }
    return CL_SUCCESS;
}

cl_int SetDefaultDeviceCommandQueue(cl_context context,
                                    cl_device_id device,
                                    cl_command_queue command_queue)
{
    WARN_NOT_SUPPORTED(SetDefaultDeviceCommandQueue);
    return CL_INVALID_OPERATION;
}

cl_int GetDeviceAndHostTimer(cl_device_id device,
                             cl_ulong *device_timestamp,
                             cl_ulong *host_timestamp)
{
    WARN_NOT_SUPPORTED(GetDeviceAndHostTimer);
    return CL_INVALID_OPERATION;
}

cl_int GetHostTimer(cl_device_id device, cl_ulong *host_timestamp)
{
    WARN_NOT_SUPPORTED(GetHostTimer);
    return CL_INVALID_OPERATION;
}

cl_context CreateContext(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),
                         void *user_data)
{
    CL_RETURN_OBJ(Platform::CreateContext(properties, num_devices, devices, pfn_notify, user_data));
}

cl_context CreateContextFromType(const cl_context_properties *properties,
                                 DeviceType device_type,
                                 void(CL_CALLBACK *pfn_notify)(const char *errinfo,
                                                               const void *private_info,
                                                               size_t cb,
                                                               void *user_data),
                                 void *user_data)
{
    CL_RETURN_OBJ(Platform::CreateContextFromType(properties, device_type, pfn_notify, user_data));
}

cl_int RetainContext(cl_context context)
{
    context->cast<Context>().retain();
    return CL_SUCCESS;
}

cl_int ReleaseContext(cl_context context)
{
    Context &ctx = context->cast<Context>();
    if (ctx.release())
    {
        delete &ctx;
    }
    return CL_SUCCESS;
}

cl_int GetContextInfo(cl_context context,
                      ContextInfo param_name,
                      size_t param_value_size,
                      void *param_value,
                      size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(context->cast<Context>().getInfo(param_name, param_value_size, param_value,
                                                     param_value_size_ret));
}

cl_int SetContextDestructorCallback(cl_context context,
                                    void(CL_CALLBACK *pfn_notify)(cl_context context,
                                                                  void *user_data),
                                    void *user_data)
{
    CL_RETURN_ERROR(context->cast<Context>().setDestructorCallback(pfn_notify, user_data));
}

cl_command_queue CreateCommandQueueWithProperties(cl_context context,
                                                  cl_device_id device,
                                                  const cl_queue_properties *properties)
{
    CL_RETURN_OBJ(context->cast<Context>().createCommandQueueWithProperties(device, properties));
}

cl_int RetainCommandQueue(cl_command_queue command_queue)
{
    command_queue->cast<CommandQueue>().retain();
    return CL_SUCCESS;
}

cl_int ReleaseCommandQueue(cl_command_queue command_queue)
{
    CommandQueue &queue = command_queue->cast<CommandQueue>();
    const cl_int err    = queue.onRelease();
    if (queue.release())
    {
        delete &queue;
    }
    return err;
}

cl_int GetCommandQueueInfo(cl_command_queue command_queue,
                           CommandQueueInfo param_name,
                           size_t param_value_size,
                           void *param_value,
                           size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().getInfo(param_name, param_value_size,
                                                                param_value, param_value_size_ret));
}

cl_mem CreateBuffer(cl_context context, MemFlags flags, size_t size, void *host_ptr)
{
    CL_RETURN_OBJ(context->cast<Context>().createBuffer(nullptr, flags, size, host_ptr));
}

cl_mem CreateBufferWithProperties(cl_context context,
                                  const cl_mem_properties *properties,
                                  MemFlags flags,
                                  size_t size,
                                  void *host_ptr)
{
    CL_RETURN_OBJ(context->cast<Context>().createBuffer(properties, flags, size, host_ptr));
}

cl_mem CreateSubBuffer(cl_mem buffer,
                       MemFlags flags,
                       cl_buffer_create_type buffer_create_type,
                       const void *buffer_create_info)
{
    CL_RETURN_OBJ(
        buffer->cast<Buffer>().createSubBuffer(flags, buffer_create_type, buffer_create_info));
}

cl_mem CreateImage(cl_context context,
                   MemFlags flags,
                   const cl_image_format *image_format,
                   const cl_image_desc *image_desc,
                   void *host_ptr)
{
    CL_RETURN_OBJ(
        context->cast<Context>().createImage(nullptr, flags, image_format, image_desc, host_ptr));
}

cl_mem CreateImageWithProperties(cl_context context,
                                 const cl_mem_properties *properties,
                                 MemFlags flags,
                                 const cl_image_format *image_format,
                                 const cl_image_desc *image_desc,
                                 void *host_ptr)
{
    CL_RETURN_OBJ(context->cast<Context>().createImage(properties, flags, image_format, image_desc,
                                                       host_ptr));
}

cl_mem CreatePipe(cl_context context,
                  MemFlags flags,
                  cl_uint pipe_packet_size,
                  cl_uint pipe_max_packets,
                  const cl_pipe_properties *properties)
{
    WARN_NOT_SUPPORTED(CreatePipe);
    cl::gClErrorTls = CL_INVALID_OPERATION;
    return 0;
}

cl_int RetainMemObject(cl_mem memobj)
{
    memobj->cast<Memory>().retain();
    return CL_SUCCESS;
}

cl_int ReleaseMemObject(cl_mem memobj)
{
    Memory &memory = memobj->cast<Memory>();
    if (memory.release())
    {
        delete &memory;
    }
    return CL_SUCCESS;
}

cl_int GetSupportedImageFormats(cl_context context,
                                MemFlags flags,
                                MemObjectType image_type,
                                cl_uint num_entries,
                                cl_image_format *image_formats,
                                cl_uint *num_image_formats)
{
    CL_RETURN_ERROR(context->cast<Context>().getSupportedImageFormats(
        flags, image_type, num_entries, image_formats, num_image_formats));
}

cl_int GetMemObjectInfo(cl_mem memobj,
                        MemInfo param_name,
                        size_t param_value_size,
                        void *param_value,
                        size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(memobj->cast<Memory>().getInfo(param_name, param_value_size, param_value,
                                                   param_value_size_ret));
}

cl_int GetImageInfo(cl_mem image,
                    ImageInfo param_name,
                    size_t param_value_size,
                    void *param_value,
                    size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(image->cast<Image>().getInfo(param_name, param_value_size, param_value,
                                                 param_value_size_ret));
}

cl_int GetPipeInfo(cl_mem pipe,
                   PipeInfo param_name,
                   size_t param_value_size,
                   void *param_value,
                   size_t *param_value_size_ret)
{
    WARN_NOT_SUPPORTED(GetPipeInfo);
    return CL_INVALID_MEM_OBJECT;
}

cl_int SetMemObjectDestructorCallback(cl_mem memobj,
                                      void(CL_CALLBACK *pfn_notify)(cl_mem memobj, void *user_data),
                                      void *user_data)
{
    CL_RETURN_ERROR(memobj->cast<Memory>().setDestructorCallback(pfn_notify, user_data));
}

void *SVMAlloc(cl_context context, SVM_MemFlags flags, size_t size, cl_uint alignment)
{
    WARN_NOT_SUPPORTED(SVMAlloc);
    return 0;
}

void SVMFree(cl_context context, void *svm_pointer)
{
    WARN_NOT_SUPPORTED(SVMFree);
}

cl_sampler CreateSamplerWithProperties(cl_context context,
                                       const cl_sampler_properties *sampler_properties)
{
    CL_RETURN_OBJ(context->cast<Context>().createSamplerWithProperties(sampler_properties));
}

cl_int RetainSampler(cl_sampler sampler)
{
    sampler->cast<Sampler>().retain();
    return CL_SUCCESS;
}

cl_int ReleaseSampler(cl_sampler sampler)
{
    Sampler &smplr = sampler->cast<Sampler>();
    if (smplr.release())
    {
        delete &smplr;
    }
    return CL_SUCCESS;
}

cl_int GetSamplerInfo(cl_sampler sampler,
                      SamplerInfo param_name,
                      size_t param_value_size,
                      void *param_value,
                      size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(sampler->cast<Sampler>().getInfo(param_name, param_value_size, param_value,
                                                     param_value_size_ret));
}

cl_program CreateProgramWithSource(cl_context context,
                                   cl_uint count,
                                   const char **strings,
                                   const size_t *lengths)
{
    CL_RETURN_OBJ(context->cast<Context>().createProgramWithSource(count, strings, lengths));
}

cl_program CreateProgramWithBinary(cl_context context,
                                   cl_uint num_devices,
                                   const cl_device_id *device_list,
                                   const size_t *lengths,
                                   const unsigned char **binaries,
                                   cl_int *binary_status)
{
    CL_RETURN_OBJ(context->cast<Context>().createProgramWithBinary(
        num_devices, device_list, lengths, binaries, binary_status));
}

cl_program CreateProgramWithBuiltInKernels(cl_context context,
                                           cl_uint num_devices,
                                           const cl_device_id *device_list,
                                           const char *kernel_names)
{
    CL_RETURN_OBJ(context->cast<Context>().createProgramWithBuiltInKernels(num_devices, device_list,
                                                                           kernel_names));
}

cl_program CreateProgramWithIL(cl_context context, const void *il, size_t length)
{
    CL_RETURN_OBJ(context->cast<Context>().createProgramWithIL(il, length));
}

cl_int RetainProgram(cl_program program)
{
    program->cast<Program>().retain();
    return CL_SUCCESS;
}

cl_int ReleaseProgram(cl_program program)
{
    Program &prog = program->cast<Program>();
    if (prog.release())
    {
        delete &prog;
    }
    return CL_SUCCESS;
}

cl_int BuildProgram(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),
                    void *user_data)
{
    CL_RETURN_ERROR(
        program->cast<Program>().build(num_devices, device_list, options, pfn_notify, user_data));
}

cl_int CompileProgram(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),
                      void *user_data)
{
    CL_RETURN_ERROR(program->cast<Program>().compile(num_devices, device_list, options,
                                                     num_input_headers, input_headers,
                                                     header_include_names, pfn_notify, user_data));
}

cl_program LinkProgram(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),
                       void *user_data)
{
    CL_RETURN_OBJ(context->cast<Context>().linkProgram(num_devices, device_list, options,
                                                       num_input_programs, input_programs,
                                                       pfn_notify, user_data));
}

cl_int SetProgramReleaseCallback(cl_program program,
                                 void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
                                 void *user_data)
{
    WARN_NOT_SUPPORTED(SetProgramReleaseCallback);
    return CL_INVALID_OPERATION;
}

cl_int SetProgramSpecializationConstant(cl_program program,
                                        cl_uint spec_id,
                                        size_t spec_size,
                                        const void *spec_value)
{
    WARN_NOT_SUPPORTED(SetProgramSpecializationConstant);
    return CL_INVALID_OPERATION;
}

cl_int UnloadPlatformCompiler(cl_platform_id platform)
{
    CL_RETURN_ERROR(platform->cast<Platform>().unloadCompiler());
}

cl_int GetProgramInfo(cl_program program,
                      ProgramInfo param_name,
                      size_t param_value_size,
                      void *param_value,
                      size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(program->cast<Program>().getInfo(param_name, param_value_size, param_value,
                                                     param_value_size_ret));
}

cl_int GetProgramBuildInfo(cl_program program,
                           cl_device_id device,
                           ProgramBuildInfo param_name,
                           size_t param_value_size,
                           void *param_value,
                           size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(program->cast<Program>().getBuildInfo(device, param_name, param_value_size,
                                                          param_value, param_value_size_ret));
}

cl_kernel CreateKernel(cl_program program, const char *kernel_name)
{
    CL_RETURN_OBJ(program->cast<Program>().createKernel(kernel_name));
}

cl_int CreateKernelsInProgram(cl_program program,
                              cl_uint num_kernels,
                              cl_kernel *kernels,
                              cl_uint *num_kernels_ret)
{
    CL_RETURN_ERROR(program->cast<Program>().createKernels(num_kernels, kernels, num_kernels_ret));
}

cl_kernel CloneKernel(cl_kernel source_kernel)
{
    CL_RETURN_OBJ(source_kernel->cast<Kernel>().clone(););
}

cl_int RetainKernel(cl_kernel kernel)
{
    kernel->cast<Kernel>().retain();
    return CL_SUCCESS;
}

cl_int ReleaseKernel(cl_kernel kernel)
{
    Kernel &krnl = kernel->cast<Kernel>();
    if (krnl.release())
    {
        delete &krnl;
    }
    return CL_SUCCESS;
}

cl_int SetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)
{
    CL_RETURN_ERROR(kernel->cast<Kernel>().setArg(arg_index, arg_size, arg_value));
}

cl_int SetKernelArgSVMPointer(cl_kernel kernel, cl_uint arg_index, const void *arg_value)
{
    WARN_NOT_SUPPORTED(SetKernelArgSVMPointer);
    return CL_INVALID_OPERATION;
}

cl_int SetKernelExecInfo(cl_kernel kernel,
                         KernelExecInfo param_name,
                         size_t param_value_size,
                         const void *param_value)
{
    WARN_NOT_SUPPORTED(SetKernelExecInfo);
    return CL_INVALID_OPERATION;
}

cl_int GetKernelInfo(cl_kernel kernel,
                     KernelInfo param_name,
                     size_t param_value_size,
                     void *param_value,
                     size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(kernel->cast<Kernel>().getInfo(param_name, param_value_size, param_value,
                                                   param_value_size_ret));
}

cl_int GetKernelArgInfo(cl_kernel kernel,
                        cl_uint arg_index,
                        KernelArgInfo param_name,
                        size_t param_value_size,
                        void *param_value,
                        size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(kernel->cast<Kernel>().getArgInfo(arg_index, param_name, param_value_size,
                                                      param_value, param_value_size_ret));
}

cl_int GetKernelWorkGroupInfo(cl_kernel kernel,
                              cl_device_id device,
                              KernelWorkGroupInfo param_name,
                              size_t param_value_size,
                              void *param_value,
                              size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(kernel->cast<Kernel>().getWorkGroupInfo(device, param_name, param_value_size,
                                                            param_value, param_value_size_ret));
}

cl_int GetKernelSubGroupInfo(cl_kernel kernel,
                             cl_device_id device,
                             KernelSubGroupInfo param_name,
                             size_t input_value_size,
                             const void *input_value,
                             size_t param_value_size,
                             void *param_value,
                             size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(kernel->cast<Kernel>().getSubWorkGroupInfo(device, param_name, input_value_size,
                                                               input_value, param_value_size,
                                                               param_value, param_value_size_ret));
}

cl_int WaitForEvents(cl_uint num_events, const cl_event *event_list)
{
    CL_RETURN_ERROR(
        (*event_list)->cast<Event>().getContext().waitForEvents(num_events, event_list));
}

cl_int GetEventInfo(cl_event event,
                    EventInfo param_name,
                    size_t param_value_size,
                    void *param_value,
                    size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(event->cast<Event>().getInfo(param_name, param_value_size, param_value,
                                                 param_value_size_ret));
}

cl_event CreateUserEvent(cl_context context)
{
    CL_RETURN_OBJ(context->cast<Context>().createUserEvent());
}

cl_int RetainEvent(cl_event event)
{
    event->cast<Event>().retain();
    return CL_SUCCESS;
}

cl_int ReleaseEvent(cl_event event)
{
    Event &evt = event->cast<Event>();
    if (evt.release())
    {
        delete &evt;
    }
    return CL_SUCCESS;
}

cl_int SetUserEventStatus(cl_event event, cl_int execution_status)
{
    CL_RETURN_ERROR(event->cast<Event>().setUserEventStatus(execution_status));
}

cl_int SetEventCallback(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),
                        void *user_data)
{
    CL_RETURN_ERROR(
        event->cast<Event>().setCallback(command_exec_callback_type, pfn_notify, user_data));
}

cl_int GetEventProfilingInfo(cl_event event,
                             ProfilingInfo param_name,
                             size_t param_value_size,
                             void *param_value,
                             size_t *param_value_size_ret)
{
    CL_RETURN_ERROR(event->cast<Event>().getProfilingInfo(param_name, param_value_size, param_value,
                                                          param_value_size_ret));
}

cl_int Flush(cl_command_queue command_queue)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().flush());
}

cl_int Finish(cl_command_queue command_queue)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().finish());
}

cl_int EnqueueReadBuffer(cl_command_queue command_queue,
                         cl_mem buffer,
                         cl_bool blocking_read,
                         size_t offset,
                         size_t size,
                         void *ptr,
                         cl_uint num_events_in_wait_list,
                         const cl_event *event_wait_list,
                         cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueReadBuffer(
        buffer, blocking_read, offset, size, ptr, num_events_in_wait_list, event_wait_list, event));
}

cl_int EnqueueReadBufferRect(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,
                             void *ptr,
                             cl_uint num_events_in_wait_list,
                             const cl_event *event_wait_list,
                             cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueReadBufferRect(
        buffer, blocking_read, cl::Offset{buffer_origin[0], buffer_origin[1], buffer_origin[2]},
        cl::Offset{host_origin[0], host_origin[1], host_origin[2]},
        cl::Extents{region[0], region[1], region[2]}, buffer_row_pitch, buffer_slice_pitch,
        host_row_pitch, host_slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event)));
}

cl_int EnqueueWriteBuffer(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,
                          cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueWriteBuffer(
        buffer, blocking_write, offset, size, ptr, num_events_in_wait_list, event_wait_list,
        event));
}

cl_int EnqueueWriteBufferRect(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,
                              cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueWriteBufferRect(
        buffer, blocking_write, cl::Offset{buffer_origin[0], buffer_origin[1], buffer_origin[2]},
        cl::Offset{host_origin[0], host_origin[1], host_origin[2]},
        cl::Extents{region[0], region[1], region[2]}, buffer_row_pitch, buffer_slice_pitch,
        host_row_pitch, host_slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event)));
}

cl_int EnqueueFillBuffer(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,
                         cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueFillBuffer(
        buffer, pattern, pattern_size, offset, size, num_events_in_wait_list, event_wait_list,
        event));
}

cl_int EnqueueCopyBuffer(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,
                         cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueCopyBuffer(
        src_buffer, dst_buffer, src_offset, dst_offset, size, num_events_in_wait_list,
        event_wait_list, event));
}

cl_int EnqueueCopyBufferRect(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,
                             cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueCopyBufferRect(
        src_buffer, dst_buffer, cl::Offset{src_origin[0], src_origin[1], src_origin[2]},
        cl::Offset{dst_origin[0], dst_origin[1], dst_origin[2]},
        cl::Extents{region[0], region[1], region[2]}, src_row_pitch, src_slice_pitch, dst_row_pitch,
        dst_slice_pitch, num_events_in_wait_list, event_wait_list, event)));
}

cl_int EnqueueReadImage(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,
                        void *ptr,
                        cl_uint num_events_in_wait_list,
                        const cl_event *event_wait_list,
                        cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueReadImage(
        image, blocking_read, cl::Offset{origin[0], origin[1], origin[2]},
        cl::Extents{region[0], region[1], region[2]}, row_pitch, slice_pitch, ptr,
        num_events_in_wait_list, event_wait_list, event)));
}

cl_int EnqueueWriteImage(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,
                         cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueWriteImage(
        image, blocking_write, cl::Offset{origin[0], origin[1], origin[2]},
        cl::Extents{region[0], region[1], region[2]}, input_row_pitch, input_slice_pitch, ptr,
        num_events_in_wait_list, event_wait_list, event)));
}

cl_int EnqueueFillImage(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,
                        cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueFillImage(
        image, fill_color, cl::Offset{origin[0], origin[1], origin[2]},
        cl::Extents{region[0], region[1], region[2]}, num_events_in_wait_list, event_wait_list,
        event)));
}

cl_int EnqueueCopyImage(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,
                        cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueCopyImage(
        src_image, dst_image, cl::Offset{src_origin[0], src_origin[1], src_origin[2]},
        cl::Offset{dst_origin[0], dst_origin[1], dst_origin[2]},
        cl::Extents{region[0], region[1], region[2]}, num_events_in_wait_list, event_wait_list,
        event)));
}

cl_int EnqueueCopyImageToBuffer(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,
                                cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueCopyImageToBuffer(
        src_image, dst_buffer, cl::Offset{src_origin[0], src_origin[1], src_origin[2]},
        cl::Extents{region[0], region[1], region[2]}, dst_offset, num_events_in_wait_list,
        event_wait_list, event)));
}

cl_int EnqueueCopyBufferToImage(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,
                                cl_event *event)
{
    CL_RETURN_ERROR(ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueCopyBufferToImage(
        src_buffer, dst_image, src_offset, cl::Offset{dst_origin[0], dst_origin[1], dst_origin[2]},
        cl::Extents{region[0], region[1], region[2]}, num_events_in_wait_list, event_wait_list,
        event)));
}

void *EnqueueMapBuffer(cl_command_queue command_queue,
                       cl_mem buffer,
                       cl_bool blocking_map,
                       MapFlags map_flags,
                       size_t offset,
                       size_t size,
                       cl_uint num_events_in_wait_list,
                       const cl_event *event_wait_list,
                       cl_event *event)
{
    CL_RETURN_PTR(ptrOut, command_queue->cast<CommandQueue>().enqueueMapBuffer(
                              buffer, blocking_map, map_flags, offset, size,
                              num_events_in_wait_list, event_wait_list, event, ptrOut));
}

void *EnqueueMapImage(cl_command_queue command_queue,
                      cl_mem image,
                      cl_bool blocking_map,
                      MapFlags map_flags,
                      const size_t *origin,
                      const size_t *region,
                      size_t *image_row_pitch,
                      size_t *image_slice_pitch,
                      cl_uint num_events_in_wait_list,
                      const cl_event *event_wait_list,
                      cl_event *event)
{
    CL_RETURN_PTR(ptrOut,
                  ANGLE_UNSAFE_TODO(command_queue->cast<CommandQueue>().enqueueMapImage(
                      image, blocking_map, map_flags, cl::Offset{origin[0], origin[1], origin[2]},
                      cl::Extents{region[0], region[1], region[2]}, image_row_pitch,
                      image_slice_pitch, num_events_in_wait_list, event_wait_list, event, ptrOut)));
}

cl_int EnqueueUnmapMemObject(cl_command_queue command_queue,
                             cl_mem memobj,
                             void *mapped_ptr,
                             cl_uint num_events_in_wait_list,
                             const cl_event *event_wait_list,
                             cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueUnmapMemObject(
        memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event));
}

cl_int EnqueueMigrateMemObjects(cl_command_queue command_queue,
                                cl_uint num_mem_objects,
                                const cl_mem *mem_objects,
                                MemMigrationFlags flags,
                                cl_uint num_events_in_wait_list,
                                const cl_event *event_wait_list,
                                cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueMigrateMemObjects(
        num_mem_objects, mem_objects, flags, num_events_in_wait_list, event_wait_list, event));
}

cl_int EnqueueNDRangeKernel(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,
                            cl_event *event)
{
    cl::NDRange ndrange(work_dim, global_work_offset, global_work_size, local_work_size);
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueNDRangeKernel(
        kernel, ndrange, num_events_in_wait_list, event_wait_list, event));
}

cl_int EnqueueNativeKernel(cl_command_queue command_queue,
                           void(CL_CALLBACK *user_func)(void *),
                           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,
                           cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueNativeKernel(
        user_func, args, cb_args, num_mem_objects, mem_list, args_mem_loc, num_events_in_wait_list,
        event_wait_list, event));
}

cl_int EnqueueMarkerWithWaitList(cl_command_queue command_queue,
                                 cl_uint num_events_in_wait_list,
                                 const cl_event *event_wait_list,
                                 cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueMarkerWithWaitList(
        num_events_in_wait_list, event_wait_list, event));
}

cl_int EnqueueBarrierWithWaitList(cl_command_queue command_queue,
                                  cl_uint num_events_in_wait_list,
                                  const cl_event *event_wait_list,
                                  cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueBarrierWithWaitList(
        num_events_in_wait_list, event_wait_list, event));
}

cl_int EnqueueSVMFree(cl_command_queue command_queue,
                      cl_uint num_svm_pointers,
                      void *svm_pointers[],
                      void(CL_CALLBACK *pfn_free_func)(cl_command_queue queue,
                                                       cl_uint num_svm_pointers,
                                                       void *svm_pointers[],
                                                       void *user_data),
                      void *user_data,
                      cl_uint num_events_in_wait_list,
                      const cl_event *event_wait_list,
                      cl_event *event)
{
    WARN_NOT_SUPPORTED(EnqueueSVMFree);
    return CL_INVALID_OPERATION;
}

cl_int EnqueueSVMMemcpy(cl_command_queue command_queue,
                        cl_bool blocking_copy,
                        void *dst_ptr,
                        const void *src_ptr,
                        size_t size,
                        cl_uint num_events_in_wait_list,
                        const cl_event *event_wait_list,
                        cl_event *event)
{
    WARN_NOT_SUPPORTED(EnqueueSVMMemcpy);
    return CL_INVALID_OPERATION;
}

cl_int EnqueueSVMMemFill(cl_command_queue command_queue,
                         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,
                         cl_event *event)
{
    WARN_NOT_SUPPORTED(EnqueueSVMMemFill);
    return CL_INVALID_OPERATION;
}

cl_int EnqueueSVMMap(cl_command_queue command_queue,
                     cl_bool blocking_map,
                     MapFlags flags,
                     void *svm_ptr,
                     size_t size,
                     cl_uint num_events_in_wait_list,
                     const cl_event *event_wait_list,
                     cl_event *event)
{
    WARN_NOT_SUPPORTED(EnqueueSVMMap);
    return CL_INVALID_OPERATION;
}

cl_int EnqueueSVMUnmap(cl_command_queue command_queue,
                       void *svm_ptr,
                       cl_uint num_events_in_wait_list,
                       const cl_event *event_wait_list,
                       cl_event *event)
{
    WARN_NOT_SUPPORTED(EnqueueSVMUnmap);
    return CL_INVALID_OPERATION;
}

cl_int EnqueueSVMMigrateMem(cl_command_queue command_queue,
                            cl_uint num_svm_pointers,
                            const void **svm_pointers,
                            const size_t *sizes,
                            MemMigrationFlags flags,
                            cl_uint num_events_in_wait_list,
                            const cl_event *event_wait_list,
                            cl_event *event)
{
    WARN_NOT_SUPPORTED(EnqueueSVMMigrateMem);
    return CL_INVALID_OPERATION;
}

cl_int EnqueueAcquireExternalMemObjectsKHR(cl_command_queue command_queue,
                                           cl_uint num_mem_objects,
                                           const cl_mem *mem_objects,
                                           cl_uint num_events_in_wait_list,
                                           const cl_event *event_wait_list,
                                           cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueAcquireExternalMemObjectsKHR(
        num_mem_objects, mem_objects, num_events_in_wait_list, event_wait_list, event));
}

cl_int EnqueueReleaseExternalMemObjectsKHR(cl_command_queue command_queue,
                                           cl_uint num_mem_objects,
                                           const cl_mem *mem_objects,
                                           cl_uint num_events_in_wait_list,
                                           const cl_event *event_wait_list,
                                           cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueReleaseExternalMemObjectsKHR(
        num_mem_objects, mem_objects, num_events_in_wait_list, event_wait_list, event));
}

cl_mem ImportMemoryARM(cl_context context,
                       MemFlags flags,
                       const cl_import_properties_arm *properties,
                       void *memory,
                       size_t size)
{
    Memory::PropArray convertedProperties = Context::ConvertArmMemPropToMemProp(properties, memory);
    CL_RETURN_OBJ(
        context->cast<Context>().createBuffer(convertedProperties.data(), flags, size, nullptr));
}

void *GetExtensionFunctionAddressForPlatform(cl_platform_id platform, const char *func_name)
{
    return GetExtensionFunctionAddress(func_name);
}

cl_int SetCommandQueueProperty(cl_command_queue command_queue,
                               CommandQueueProperties properties,
                               cl_bool enable,
                               cl_command_queue_properties *old_properties)
{
    CL_RETURN_ERROR(
        command_queue->cast<CommandQueue>().setProperty(properties, enable, old_properties));
}

cl_mem CreateImage2D(cl_context context,
                     MemFlags flags,
                     const cl_image_format *image_format,
                     size_t image_width,
                     size_t image_height,
                     size_t image_row_pitch,
                     void *host_ptr)
{
    CL_RETURN_OBJ(context->cast<Context>().createImage2D(flags, image_format, image_width,
                                                         image_height, image_row_pitch, host_ptr));
}

cl_mem CreateImage3D(cl_context context,
                     MemFlags 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,
                     void *host_ptr)
{
    CL_RETURN_OBJ(context->cast<Context>().createImage3D(flags, image_format, image_width,
                                                         image_height, image_depth, image_row_pitch,
                                                         image_slice_pitch, host_ptr));
}

cl_int EnqueueMarker(cl_command_queue command_queue, cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueMarker(event));
}

cl_int EnqueueWaitForEvents(cl_command_queue command_queue,
                            cl_uint num_events,
                            const cl_event *event_list)
{
    CL_RETURN_ERROR(
        command_queue->cast<CommandQueue>().enqueueWaitForEvents(num_events, event_list));
}

cl_int EnqueueBarrier(cl_command_queue command_queue)
{
    CL_RETURN_ERROR(IsError(command_queue->cast<CommandQueue>().enqueueBarrier()));
}

cl_int UnloadCompiler()
{
    Platform *const platform = Platform::GetDefault();
    if (platform == nullptr)
    {
        return CL_SUCCESS;
    }
    CL_RETURN_ERROR(platform->unloadCompiler());
}

void *GetExtensionFunctionAddress(const char *func_name)
{
    if (func_name == nullptr)
    {
        return nullptr;
    }
    const ProcTable &procTable = GetProcTable();
    const auto it              = procTable.find(func_name);
    return it != procTable.cend() ? it->second : nullptr;
}

cl_command_queue CreateCommandQueue(cl_context context,
                                    cl_device_id device,
                                    CommandQueueProperties properties)
{
    CL_RETURN_OBJ(context->cast<Context>().createCommandQueue(device, properties));
}

cl_sampler CreateSampler(cl_context context,
                         cl_bool normalized_coords,
                         AddressingMode addressing_mode,
                         FilterMode filter_mode)
{
    CL_RETURN_OBJ(
        context->cast<Context>().createSampler(normalized_coords, addressing_mode, filter_mode));
}

cl_int EnqueueTask(cl_command_queue command_queue,
                   cl_kernel kernel,
                   cl_uint num_events_in_wait_list,
                   const cl_event *event_wait_list,
                   cl_event *event)
{
    CL_RETURN_ERROR(command_queue->cast<CommandQueue>().enqueueTask(kernel, num_events_in_wait_list,
                                                                    event_wait_list, event));
}

cl_int GetKernelSubGroupInfoKHR(cl_kernel in_kernel,
                                cl_device_id in_device,
                                KernelSubGroupInfo param_namePacked,
                                size_t input_value_size,
                                const void *input_value,
                                size_t param_value_size,
                                void *param_value,
                                size_t *param_value_size_ret)
{
    return GetKernelSubGroupInfo(in_kernel, in_device, param_namePacked, input_value_size,
                                 input_value, param_value_size, param_value, param_value_size_ret);
}

}  // namespace cl
