blob: bea9743f48299f30296642d59d34c72ccb50b8e5 [file] [log] [blame]
/*
* Copyright (c) 2016, 2017 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef __ARM_COMPUTE_OPENCL_H__
#define __ARM_COMPUTE_OPENCL_H__
#include <string>
#include <utility>
/* Configure the Khronos C++ wrapper to target OpenCL 1.2: */
#define CL_HPP_ENABLE_EXCEPTIONS
#define CL_HPP_CL_1_2_DEFAULT_BUILD
#define CL_HPP_TARGET_OPENCL_VERSION 110
#define CL_HPP_MINIMUM_OPENCL_VERSION 110
#include <CL/cl2.hpp>
namespace cl
{
static const NDRange Range_128_1 = NDRange(128, 1);
} // namespace cl
namespace arm_compute
{
bool opencl_is_available();
class CLSymbols final
{
private:
CLSymbols() = default;
void load_symbols(void *handle);
public:
static CLSymbols &get();
bool load(const std::string &library);
bool load_default();
using clBuildProgram_func = cl_int (*)(cl_program, cl_uint, const cl_device_id *, const char *, void (*pfn_notify)(cl_program, void *), void *);
using clEnqueueNDRangeKernel_func = cl_int (*)(cl_command_queue, cl_kernel, cl_uint, const size_t *, const size_t *, const size_t *, cl_uint, const cl_event *, cl_event *);
using clSetKernelArg_func = cl_int (*)(cl_kernel, cl_uint, size_t, const void *);
using clReleaseMemObject_func = cl_int (*)(cl_mem);
using clEnqueueUnmapMemObject_func = cl_int (*)(cl_command_queue, cl_mem, void *, cl_uint, const cl_event *, cl_event *);
using clRetainCommandQueue_func = cl_int (*)(cl_command_queue command_queue);
using clReleaseContext_func = cl_int (*)(cl_context);
using clReleaseEvent_func = cl_int (*)(cl_event);
using clEnqueueWriteBuffer_func = cl_int (*)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void *, cl_uint, const cl_event *, cl_event *);
using clEnqueueReadBuffer_func = cl_int (*)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, void *, cl_uint, const cl_event *, cl_event *);
using clGetProgramBuildInfo_func = cl_int (*)(cl_program, cl_device_id, cl_program_build_info, size_t, void *, size_t *);
using clRetainProgram_func = cl_int (*)(cl_program program);
using clEnqueueMapBuffer_func = void *(*)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t, cl_uint, const cl_event *, cl_event *, cl_int *);
using clReleaseCommandQueue_func = cl_int (*)(cl_command_queue);
using clCreateProgramWithBinary_func = cl_program (*)(cl_context, cl_uint, const cl_device_id *, const size_t *, const unsigned char **, cl_int *, cl_int *);
using clRetainContext_func = cl_int (*)(cl_context context);
using clReleaseProgram_func = cl_int (*)(cl_program program);
using clFlush_func = cl_int (*)(cl_command_queue command_queue);
using clFinish_func = cl_int (*)(cl_command_queue command_queue);
using clGetProgramInfo_func = cl_int (*)(cl_program, cl_program_info, size_t, void *, size_t *);
using clCreateKernel_func = cl_kernel (*)(cl_program, const char *, cl_int *);
using clRetainKernel_func = cl_int (*)(cl_kernel kernel);
using clCreateBuffer_func = cl_mem (*)(cl_context, cl_mem_flags, size_t, void *, cl_int *);
using clCreateProgramWithSource_func = cl_program (*)(cl_context, cl_uint, const char **, const size_t *, cl_int *);
using clReleaseKernel_func = cl_int (*)(cl_kernel kernel);
using clGetDeviceInfo_func = cl_int (*)(cl_device_id, cl_device_info, size_t, void *, size_t *);
using clGetDeviceIDs_func = cl_int (*)(cl_platform_id, cl_device_type, cl_uint, cl_device_id *, cl_uint *);
clBuildProgram_func clBuildProgram = nullptr;
clEnqueueNDRangeKernel_func clEnqueueNDRangeKernel = nullptr;
clSetKernelArg_func clSetKernelArg = nullptr;
clReleaseKernel_func clReleaseKernel = nullptr;
clCreateProgramWithSource_func clCreateProgramWithSource = nullptr;
clCreateBuffer_func clCreateBuffer = nullptr;
clRetainKernel_func clRetainKernel = nullptr;
clCreateKernel_func clCreateKernel = nullptr;
clGetProgramInfo_func clGetProgramInfo = nullptr;
clFlush_func clFlush = nullptr;
clFinish_func clFinish = nullptr;
clReleaseProgram_func clReleaseProgram = nullptr;
clRetainContext_func clRetainContext = nullptr;
clCreateProgramWithBinary_func clCreateProgramWithBinary = nullptr;
clReleaseCommandQueue_func clReleaseCommandQueue = nullptr;
clEnqueueMapBuffer_func clEnqueueMapBuffer = nullptr;
clRetainProgram_func clRetainProgram = nullptr;
clGetProgramBuildInfo_func clGetProgramBuildInfo = nullptr;
clEnqueueReadBuffer_func clEnqueueReadBuffer = nullptr;
clEnqueueWriteBuffer_func clEnqueueWriteBuffer = nullptr;
clReleaseEvent_func clReleaseEvent = nullptr;
clReleaseContext_func clReleaseContext = nullptr;
clRetainCommandQueue_func clRetainCommandQueue = nullptr;
clEnqueueUnmapMemObject_func clEnqueueUnmapMemObject = nullptr;
clReleaseMemObject_func clReleaseMemObject = nullptr;
clGetDeviceInfo_func clGetDeviceInfo = nullptr;
clGetDeviceIDs_func clGetDeviceIDs = nullptr;
private:
std::pair<bool, bool> _loaded{ false, false };
};
} // namespace arm_compute
#endif /* __ARM_COMPUTE_OPENCL_H__ */