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