//
// 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.
//
// angle_cl.h: Includes all necessary CL headers and definitions for ANGLE.

#ifndef ANGLECL_H_
#define ANGLECL_H_

#define CL_TARGET_OPENCL_VERSION 300
#define CL_USE_DEPRECATED_OPENCL_1_0_APIS
#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
#define CL_USE_DEPRECATED_OPENCL_2_1_APIS
#define CL_USE_DEPRECATED_OPENCL_2_2_APIS

#include "CL/cl.h"
#include "CL/cl_ext.h"
#include "CL/cl_half.h"
#include "CL/cl_icd.h"
#include "CL/cl_platform.h"

#include <cstddef>
#include <cstdint>
#include <type_traits>

namespace cl
{

using ContextErrorCB = void(CL_CALLBACK *)(const char *errinfo,
                                           const void *private_info,
                                           size_t cb,
                                           void *user_data);

using ContextCB = void(CL_CALLBACK *)(cl_context context, void *user_data);
using MemoryCB  = void(CL_CALLBACK *)(cl_mem memobj, void *user_data);
using ProgramCB = void(CL_CALLBACK *)(cl_program program, void *user_data);
using EventCB   = void(CL_CALLBACK *)(cl_event event, cl_int event_command_status, void *user_data);
using UserFunc  = void(CL_CALLBACK *)(void *args);

template <typename T = void>
struct Dispatch
{
    explicit Dispatch(std::uint32_t magic) : mDispatch(sDispatch), mMagic(magic) {}

    const cl_icd_dispatch &getDispatch() const { return *mDispatch; }

    static const cl_icd_dispatch *sDispatch;

  protected:
    // This has to be the first member to be OpenCL ICD compatible
    const cl_icd_dispatch *const mDispatch;
    const std::uint32_t mMagic;
};

template <typename T>
const cl_icd_dispatch *Dispatch<T>::sDispatch = nullptr;

template <typename NativeObjectType, std::uint32_t magic>
struct NativeObject : public Dispatch<>
{
    NativeObject() : Dispatch<>(magic)
    {
        static_assert(std::is_standard_layout<NativeObjectType>::value &&
                          offsetof(NativeObjectType, mDispatch) == 0u,
                      "Not ICD compatible");
    }

    template <typename T>
    T &cast()
    {
        return static_cast<T &>(*this);
    }

    template <typename T>
    const T &cast() const
    {
        return static_cast<const T &>(*this);
    }

    NativeObjectType *getNative() { return static_cast<NativeObjectType *>(this); }

    const NativeObjectType *getNative() const
    {
        return static_cast<const NativeObjectType *>(this);
    }

    static NativeObjectType *CastNative(NativeObjectType *p) { return p; }

    static bool IsValid(const NativeObjectType *p)
    {
        return p != nullptr && p->mDispatch == sDispatch && p->mMagic == magic;
    }
};

}  // namespace cl

struct _cl_platform_id : public cl::NativeObject<_cl_platform_id, 0x12345678u>
{};

struct _cl_device_id : public cl::NativeObject<_cl_device_id, 0x23456789u>
{};

struct _cl_context : public cl::NativeObject<_cl_context, 0x3456789Au>
{};

struct _cl_command_queue : public cl::NativeObject<_cl_command_queue, 0x456789ABu>
{};

struct _cl_mem : public cl::NativeObject<_cl_mem, 0x56789ABCu>
{};

struct _cl_program : public cl::NativeObject<_cl_program, 0x6789ABCDu>
{};

struct _cl_kernel : public cl::NativeObject<_cl_kernel, 0x789ABCDEu>
{};

struct _cl_event : public cl::NativeObject<_cl_event, 0x89ABCDEFu>
{};

struct _cl_sampler : public cl::NativeObject<_cl_sampler, 0x9ABCDEF0u>
{};

#endif  // ANGLECL_H_
