| // | |
| // 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_icd.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 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_ |