xref: /aosp_15_r20/external/angle/include/angle_cl.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // angle_cl.h: Includes all necessary CL headers and definitions for ANGLE.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #ifndef ANGLECL_H_
9*8975f5c5SAndroid Build Coastguard Worker #define ANGLECL_H_
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #define CL_TARGET_OPENCL_VERSION 300
12*8975f5c5SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_1_0_APIS
13*8975f5c5SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_1_1_APIS
14*8975f5c5SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
15*8975f5c5SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_2_0_APIS
16*8975f5c5SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_2_1_APIS
17*8975f5c5SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_2_2_APIS
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker #include "CL/cl_icd.h"
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker #include <cstddef>
22*8975f5c5SAndroid Build Coastguard Worker #include <cstdint>
23*8975f5c5SAndroid Build Coastguard Worker #include <type_traits>
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker namespace cl
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker using ContextErrorCB = void(CL_CALLBACK *)(const char *errinfo,
29*8975f5c5SAndroid Build Coastguard Worker                                            const void *private_info,
30*8975f5c5SAndroid Build Coastguard Worker                                            size_t cb,
31*8975f5c5SAndroid Build Coastguard Worker                                            void *user_data);
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker using MemoryCB  = void(CL_CALLBACK *)(cl_mem memobj, void *user_data);
34*8975f5c5SAndroid Build Coastguard Worker using ProgramCB = void(CL_CALLBACK *)(cl_program program, void *user_data);
35*8975f5c5SAndroid Build Coastguard Worker using EventCB   = void(CL_CALLBACK *)(cl_event event, cl_int event_command_status, void *user_data);
36*8975f5c5SAndroid Build Coastguard Worker using UserFunc  = void(CL_CALLBACK *)(void *args);
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker template <typename T = void>
39*8975f5c5SAndroid Build Coastguard Worker struct Dispatch
40*8975f5c5SAndroid Build Coastguard Worker {
DispatchDispatch41*8975f5c5SAndroid Build Coastguard Worker     explicit Dispatch(std::uint32_t magic) : mDispatch(sDispatch), mMagic(magic) {}
42*8975f5c5SAndroid Build Coastguard Worker 
getDispatchDispatch43*8975f5c5SAndroid Build Coastguard Worker     const cl_icd_dispatch &getDispatch() const { return *mDispatch; }
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker     static const cl_icd_dispatch *sDispatch;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker   protected:
48*8975f5c5SAndroid Build Coastguard Worker     // This has to be the first member to be OpenCL ICD compatible
49*8975f5c5SAndroid Build Coastguard Worker     const cl_icd_dispatch *const mDispatch;
50*8975f5c5SAndroid Build Coastguard Worker     const std::uint32_t mMagic;
51*8975f5c5SAndroid Build Coastguard Worker };
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker template <typename T>
54*8975f5c5SAndroid Build Coastguard Worker const cl_icd_dispatch *Dispatch<T>::sDispatch = nullptr;
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker template <typename NativeObjectType, std::uint32_t magic>
57*8975f5c5SAndroid Build Coastguard Worker struct NativeObject : public Dispatch<>
58*8975f5c5SAndroid Build Coastguard Worker {
NativeObjectNativeObject59*8975f5c5SAndroid Build Coastguard Worker     NativeObject() : Dispatch<>(magic)
60*8975f5c5SAndroid Build Coastguard Worker     {
61*8975f5c5SAndroid Build Coastguard Worker         static_assert(std::is_standard_layout<NativeObjectType>::value &&
62*8975f5c5SAndroid Build Coastguard Worker                           offsetof(NativeObjectType, mDispatch) == 0u,
63*8975f5c5SAndroid Build Coastguard Worker                       "Not ICD compatible");
64*8975f5c5SAndroid Build Coastguard Worker     }
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
castNativeObject67*8975f5c5SAndroid Build Coastguard Worker     T &cast()
68*8975f5c5SAndroid Build Coastguard Worker     {
69*8975f5c5SAndroid Build Coastguard Worker         return static_cast<T &>(*this);
70*8975f5c5SAndroid Build Coastguard Worker     }
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
castNativeObject73*8975f5c5SAndroid Build Coastguard Worker     const T &cast() const
74*8975f5c5SAndroid Build Coastguard Worker     {
75*8975f5c5SAndroid Build Coastguard Worker         return static_cast<const T &>(*this);
76*8975f5c5SAndroid Build Coastguard Worker     }
77*8975f5c5SAndroid Build Coastguard Worker 
getNativeNativeObject78*8975f5c5SAndroid Build Coastguard Worker     NativeObjectType *getNative() { return static_cast<NativeObjectType *>(this); }
79*8975f5c5SAndroid Build Coastguard Worker 
getNativeNativeObject80*8975f5c5SAndroid Build Coastguard Worker     const NativeObjectType *getNative() const
81*8975f5c5SAndroid Build Coastguard Worker     {
82*8975f5c5SAndroid Build Coastguard Worker         return static_cast<const NativeObjectType *>(this);
83*8975f5c5SAndroid Build Coastguard Worker     }
84*8975f5c5SAndroid Build Coastguard Worker 
CastNativeNativeObject85*8975f5c5SAndroid Build Coastguard Worker     static NativeObjectType *CastNative(NativeObjectType *p) { return p; }
86*8975f5c5SAndroid Build Coastguard Worker 
IsValidNativeObject87*8975f5c5SAndroid Build Coastguard Worker     static bool IsValid(const NativeObjectType *p)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         return p != nullptr && p->mDispatch == sDispatch && p->mMagic == magic;
90*8975f5c5SAndroid Build Coastguard Worker     }
91*8975f5c5SAndroid Build Coastguard Worker };
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker struct _cl_platform_id : public cl::NativeObject<_cl_platform_id, 0x12345678u>
96*8975f5c5SAndroid Build Coastguard Worker {};
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker struct _cl_device_id : public cl::NativeObject<_cl_device_id, 0x23456789u>
99*8975f5c5SAndroid Build Coastguard Worker {};
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker struct _cl_context : public cl::NativeObject<_cl_context, 0x3456789Au>
102*8975f5c5SAndroid Build Coastguard Worker {};
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker struct _cl_command_queue : public cl::NativeObject<_cl_command_queue, 0x456789ABu>
105*8975f5c5SAndroid Build Coastguard Worker {};
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker struct _cl_mem : public cl::NativeObject<_cl_mem, 0x56789ABCu>
108*8975f5c5SAndroid Build Coastguard Worker {};
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker struct _cl_program : public cl::NativeObject<_cl_program, 0x6789ABCDu>
111*8975f5c5SAndroid Build Coastguard Worker {};
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker struct _cl_kernel : public cl::NativeObject<_cl_kernel, 0x789ABCDEu>
114*8975f5c5SAndroid Build Coastguard Worker {};
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker struct _cl_event : public cl::NativeObject<_cl_event, 0x89ABCDEFu>
117*8975f5c5SAndroid Build Coastguard Worker {};
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker struct _cl_sampler : public cl::NativeObject<_cl_sampler, 0x9ABCDEF0u>
120*8975f5c5SAndroid Build Coastguard Worker {};
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLECL_H_
123