satdump/src-core/libs/libopencl_loader/opencl_loader.cpp
2024-02-08 23:40:29 -05:00

1373 lines
50 KiB
C++

//
// opencl_loader.cpp
// libOpenCL_loader
//
// Created by Guohui Wang on 4/23/18.
// Copyright © 2019 Guohui Wang. All rights reserved.
//
#ifdef __ANDROID__
#include "opencl_loader.h"
#include "opencl_header_private.h"
#include <iostream>
#include <memory>
#ifdef __ANDROID_API__
#include <android/log.h>
#define CL_LOADER_LOG(...) \
__android_log_print(ANDROID_LOG_VERBOSE, "libopencl_loader", __VA_ARGS__)
#define CL_LOADER_LOGD(...) \
__android_log_print(ANDROID_LOG_DEBUG, "libopencl_loader", __VA_ARGS__)
#define CL_LOADER_LOGW(...) \
__android_log_print(ANDROID_LOG_WARN, "libopencl_loader", __VA_ARGS__)
#define CL_LOADER_LOGE(...) \
__android_log_print(ANDROID_LOG_ERROR, "libopencl_loader", __VA_ARGS__)
#else
#define CL_LOADER_LOG(...) printf(__VA_ARGS__)
#define CL_LOADER_LOGD(...) printf(__VA_ARGS__)
#define CL_LOADER_LOGW(...) printf(__VA_ARGS__)
#define CL_LOADER_LOGE(...) printf(__VA_ARGS__)
#endif
#if defined(_WIN32) || defined(_WIN64)
#define WIN32_LEAN_AND_MEAN
#define WIN64_LEAN_AND_MEAN
#define VC_EXTRALEAN
#include <windows.h>
#define strdup _strdup
typedef HMODULE CL_LOADER_DYNLIB_HANDLE;
#define CL_LOADER_DLOPEN LoadLibraryA
#define CL_LOADER_CLCLOSE FreeLibrary
#define CL_LOADER_DLSYM GetProcAddress
#else
#include <dlfcn.h>
typedef void* CL_LOADER_DYNLIB_HANDLE;
#define CL_LOADER_DLOPEN(LIB) dlopen(LIB, RTLD_LAZY)
#define CL_LOADER_CLCLOSE dlclose
#define CL_LOADER_DLSYM dlsym
#endif
static CL_LOADER_DYNLIB_HANDLE handle = nullptr;
#define REINTERPRET_CAST_FUNC(fn) \
fn = reinterpret_cast<fn##_func>(CL_LOADER_DLSYM(libraryHandle, #fn));
namespace OpenCLHelper {
namespace {
/* Declare local function stubs to be casted to the opencl functions at runtime
*/
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 clGetProgramInfo_func =
cl_int (*)(cl_program, cl_program_info, size_t, void*, size_t*);
using clGetSupportedImageFormats_func = cl_int (*)(cl_context context,
cl_mem_flags,
cl_mem_object_type,
cl_uint,
cl_image_format*,
cl_uint*);
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);
using clCreateCommandQueue_func =
cl_command_queue (*)(cl_context,
cl_device_id,
cl_command_queue_properties,
cl_int*);
using clCreateContextFromType_func = cl_context (*)(
const cl_context_properties*,
cl_device_type,
void(CL_CALLBACK* /* pfn_notify*/)(const char*, const void*, size_t, void*),
void*,
cl_int*);
using clGetContextInfo_func =
cl_int (*)(cl_context, cl_context_info, size_t, void*, size_t*);
using clGetDeviceInfo_func =
cl_int (*)(cl_device_id, cl_device_info, size_t, void*, size_t*);
using clGetPlatformIDs_func = cl_int (*)(cl_uint, cl_platform_id*, cl_uint*);
using clGetPlatformInfo_func =
cl_int (*)(cl_platform_id, cl_platform_info, size_t, void*, size_t*);
using clRetainDevice_func = cl_int (*)(cl_device_id);
using clReleaseDevice_func = cl_int (*)(cl_device_id);
using clCreateContext_func =
cl_context (*)(const cl_context_properties*,
cl_uint,
const cl_device_id*,
void(CL_CALLBACK*)(const char*, const void*, size_t, void*),
void*,
cl_int*);
using clFinish_func = cl_int (*)(cl_command_queue);
using clGetDeviceIDs_func = cl_int (*)(cl_platform_id,
cl_device_type,
cl_uint,
cl_device_id*,
cl_uint*);
using clEnqueueFillBuffer_func = cl_int (*)(cl_command_queue,
cl_mem,
const void*,
size_t,
size_t,
size_t,
cl_uint,
const cl_event*,
cl_event*);
using clCreateImage_func = cl_mem (*)(cl_context,
cl_mem_flags,
const cl_image_format*,
const cl_image_desc*,
void*,
cl_int*);
using clEnqueueReadImage_func =
cl_int (*)(cl_command_queue /* command_queue */,
cl_mem /* image */,
cl_bool /* blocking_read */,
const size_t* /* origin[3] */,
const size_t* /* region[3] */,
size_t /* row_pitch */,
size_t /* slice_pitch */,
void* /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event* /* event_wait_list */,
cl_event* /* event */);
using clEnqueueWriteImage_func =
cl_int (*)(cl_command_queue /* command_queue */,
cl_mem /* image */,
cl_bool /* blocking_write */,
const size_t* /* origin[3] */,
const size_t* /* region[3] */,
size_t /* input_row_pitch */,
size_t /* input_slice_pitch */,
const void* /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event* /* event_wait_list */,
cl_event* /* event */);
using clEnqueueMapImage_func = void* (*) (cl_command_queue,
cl_mem,
cl_bool,
cl_map_flags,
const size_t*,
const size_t*,
size_t*,
size_t*,
cl_uint,
const cl_event*,
cl_event*,
cl_int*);
using clGetKernelWorkGroupInfo_func = cl_int (*)(cl_kernel,
cl_device_id,
cl_kernel_work_group_info,
size_t,
void*,
size_t*);
using clWaitForEvents_func = cl_int (*)(cl_uint, const cl_event*);
using clGetEventProfilingInfo_func =
cl_int (*)(cl_event, cl_profiling_info, size_t, void*, size_t*);
using clCreateImage2D_func = cl_mem (*)(cl_context,
cl_mem_flags,
const cl_image_format*,
size_t,
size_t,
size_t,
void*,
cl_int*);
using clRetainMemObject_func = cl_int (*)(cl_mem);
using clRetainEvent_func = cl_int (*)(cl_event);
class CLSymbols
{
public:
static std::shared_ptr<CLSymbols> symbolsInstance;
static CLSymbols& Get()
{
if (!CLSymbols::symbolsInstance) {
CLSymbols::symbolsInstance =
std::shared_ptr<CLSymbols>(new CLSymbols(handle));
}
return *CLSymbols::symbolsInstance;
}
static void Reset()
{
CLSymbols::symbolsInstance = nullptr;
}
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;
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;
clCreateCommandQueue_func clCreateCommandQueue = nullptr;
clCreateContextFromType_func clCreateContextFromType = nullptr;
clGetContextInfo_func clGetContextInfo = nullptr;
clGetDeviceInfo_func clGetDeviceInfo = nullptr;
clGetSupportedImageFormats_func clGetSupportedImageFormats = nullptr;
clGetPlatformIDs_func clGetPlatformIDs = nullptr;
clGetPlatformInfo_func clGetPlatformInfo = nullptr;
clRetainDevice_func clRetainDevice = nullptr;
clReleaseDevice_func clReleaseDevice = nullptr;
clCreateContext_func clCreateContext = nullptr;
clFinish_func clFinish = nullptr;
clGetDeviceIDs_func clGetDeviceIDs = nullptr;
clEnqueueFillBuffer_func clEnqueueFillBuffer = nullptr;
clCreateImage_func clCreateImage = nullptr;
clEnqueueReadImage_func clEnqueueReadImage = nullptr;
clEnqueueWriteImage_func clEnqueueWriteImage = nullptr;
clEnqueueMapImage_func clEnqueueMapImage = nullptr;
clGetKernelWorkGroupInfo_func clGetKernelWorkGroupInfo = nullptr;
clWaitForEvents_func clWaitForEvents = nullptr;
clGetEventProfilingInfo_func clGetEventProfilingInfo = nullptr;
clCreateImage2D_func clCreateImage2D = nullptr;
clRetainMemObject_func clRetainMemObject = nullptr;
clRetainEvent_func clRetainEvent = nullptr;
private:
CLSymbols(CL_LOADER_DYNLIB_HANDLE libraryHandle)
{
if (libraryHandle == nullptr) {
#if defined(_WIN32)
std::cerr
<< "OpenCL function invoked without call to CLLoader::Init()"
<< std::endl;
#else
std::cerr
<< "OpenCL function invoked without call to CLLoader::Init() "
<< dlerror() << std::endl;
#endif
return;
}
// TODO: We can also load these lazily, but then it might hide runtime
// issues
//
REINTERPRET_CAST_FUNC(clBuildProgram);
REINTERPRET_CAST_FUNC(clEnqueueNDRangeKernel)
REINTERPRET_CAST_FUNC(clSetKernelArg);
REINTERPRET_CAST_FUNC(clReleaseKernel)
REINTERPRET_CAST_FUNC(clCreateProgramWithSource);
REINTERPRET_CAST_FUNC(clCreateBuffer);
REINTERPRET_CAST_FUNC(clRetainKernel);
REINTERPRET_CAST_FUNC(clCreateKernel);
REINTERPRET_CAST_FUNC(clGetProgramInfo);
REINTERPRET_CAST_FUNC(clFlush);
REINTERPRET_CAST_FUNC(clReleaseProgram);
REINTERPRET_CAST_FUNC(clRetainContext);
REINTERPRET_CAST_FUNC(clCreateProgramWithBinary);
REINTERPRET_CAST_FUNC(clReleaseCommandQueue);
REINTERPRET_CAST_FUNC(clEnqueueMapBuffer);
REINTERPRET_CAST_FUNC(clRetainProgram);
REINTERPRET_CAST_FUNC(clGetProgramBuildInfo);
REINTERPRET_CAST_FUNC(clEnqueueReadBuffer);
REINTERPRET_CAST_FUNC(clEnqueueWriteBuffer);
REINTERPRET_CAST_FUNC(clReleaseEvent);
REINTERPRET_CAST_FUNC(clRetainCommandQueue);
REINTERPRET_CAST_FUNC(clEnqueueUnmapMemObject);
REINTERPRET_CAST_FUNC(clReleaseMemObject);
REINTERPRET_CAST_FUNC(clCreateCommandQueue);
REINTERPRET_CAST_FUNC(clCreateContextFromType);
REINTERPRET_CAST_FUNC(clGetContextInfo);
REINTERPRET_CAST_FUNC(clGetSupportedImageFormats);
REINTERPRET_CAST_FUNC(clGetDeviceInfo);
REINTERPRET_CAST_FUNC(clGetPlatformIDs);
REINTERPRET_CAST_FUNC(clGetPlatformInfo);
REINTERPRET_CAST_FUNC(clRetainDevice);
REINTERPRET_CAST_FUNC(clReleaseDevice);
REINTERPRET_CAST_FUNC(clCreateContext);
REINTERPRET_CAST_FUNC(clFinish);
REINTERPRET_CAST_FUNC(clGetDeviceIDs);
REINTERPRET_CAST_FUNC(clCreateImage);
REINTERPRET_CAST_FUNC(clEnqueueReadImage);
REINTERPRET_CAST_FUNC(clEnqueueWriteImage);
REINTERPRET_CAST_FUNC(clEnqueueMapImage);
REINTERPRET_CAST_FUNC(clGetKernelWorkGroupInfo);
REINTERPRET_CAST_FUNC(clWaitForEvents);
REINTERPRET_CAST_FUNC(clGetEventProfilingInfo);
REINTERPRET_CAST_FUNC(clCreateImage2D);
REINTERPRET_CAST_FUNC(clRetainMemObject);
REINTERPRET_CAST_FUNC(clRetainEvent);
}
};
std::shared_ptr<CLSymbols> CLSymbols::symbolsInstance(nullptr);
} // namespace
class Impl
{
public:
static Impl& Instance()
{
static Impl impl;
return impl;
}
void Exit()
{
if (handle) {
CL_LOADER_CLCLOSE(handle);
handle = nullptr;
}
CLSymbols::Reset();
}
const std::string& GetLibPath()
{
return openedLib;
}
int Init()
{
#if defined(_WIN32)
const char* openclLibPath[] = {"C:\\Windows\\System32\\OpenCL.dll",
"OpenCL.dll"};
const int numOpenclLibPath = 2;
#elif defined(_WIN64)
const char* openclLibPath[] = {"C:\\Windows\\SysWOW64\\OpenCL.dll",
"OpenCL.dll"};
const int numOpenclLibPath = 2;
#elif defined(__APPLE__)
const char* openclLibPath[] = {
"/System/Library/Frameworks/OpenCL.framework/OpenCL"
"/Library/Frameworks/OpenCL.framework/OpenCL"};
const int numOpenclLibPath = 2;
#elif defined(__ANDROID_API__)
const char* openclLibPath[] = {
// Typical libOpenCL location
"/system/lib/libOpenCL.so",
"/system/lib/egl/libOpenCL.so",
"/system/vendor/lib/libOpenCL.so",
"/system/vendor/lib/egl/libOpenCL.so",
"/system/lib64/libOpenCL.so",
"/system/lib64/egl/libOpenCL.so",
"/system/vendor/lib64/libOpenCL.so",
"/system/vendor/lib64/egl/libOpenCL.so",
// Qualcomm Adreno A3xx
"/system/lib/libllvm-a3xx.so",
// ARM Mali series
"/system/lib/libGLES_mali.so",
"/system/lib/egl/libGLES_mali.so",
"/system/vendor/lib/libGLES_mali.so",
"/system/vendor/lib/egl/libGLES_mali.so",
"/system/lib64/libGLES_mali.so",
"/system/lib64/egl/libGLES_mali.so",
"/system/vendor/lib64/libGLES_mali.so",
"/system/vendor/lib64/egl/libGLES_mali.so",
// Imagination PowerVR Series
"/system/lib/libPVROCL.so",
"/system/lib/egl/libPVROCL.so",
"/system/vendor/lib/libPVROCL.so",
"/system/vendor/lib/egl/libPVROCL.so",
"/system/lib64/libPVROCL.so",
"/system/lib64/egl/libPVROCL.so",
"/system/vendor/lib64/libPVROCL.so",
"/system/vendor/lib64/egl/libPVROCL.so",
// Last try
"libOpenCL.so",
"libGLES_mali.so",
"libPVROCL.so"};
const int numOpenclLibPath = 28;
#else
const char* openclLibPath[] = {"libOpenCL.so"};
const int numOpenclLibPath = 1;
#endif
for (int i = 0; i < numOpenclLibPath; i++) {
if ((handle = CL_LOADER_DLOPEN(openclLibPath[i]))) {
CL_LOADER_LOGD("Index %d, using the Shared library:%s\n",
i,
openclLibPath[i]);
openedLib = openclLibPath[i];
CL_LOADER_LOGD("Loaded OpenCL library:%s\n", openedLib.c_str());
break;
}
}
if (handle == NULL) {
return CL_LOADER_FAILED_LOCATE_LIB_OPENCL;
}
// Check if all the symbols are loaded successfully.
if (CLSymbols::Get().clBuildProgram == nullptr ||
CLSymbols::Get().clEnqueueNDRangeKernel == nullptr ||
CLSymbols::Get().clSetKernelArg == nullptr ||
CLSymbols::Get().clReleaseKernel == nullptr ||
CLSymbols::Get().clCreateProgramWithSource == nullptr ||
CLSymbols::Get().clCreateBuffer == nullptr ||
CLSymbols::Get().clRetainKernel == nullptr ||
CLSymbols::Get().clCreateKernel == nullptr ||
CLSymbols::Get().clGetProgramInfo == nullptr ||
CLSymbols::Get().clFlush == nullptr ||
CLSymbols::Get().clReleaseProgram == nullptr ||
CLSymbols::Get().clRetainContext == nullptr ||
CLSymbols::Get().clCreateProgramWithBinary == nullptr ||
CLSymbols::Get().clReleaseCommandQueue == nullptr ||
CLSymbols::Get().clEnqueueMapBuffer == nullptr ||
CLSymbols::Get().clRetainProgram == nullptr ||
CLSymbols::Get().clGetProgramBuildInfo == nullptr ||
CLSymbols::Get().clEnqueueReadBuffer == nullptr ||
CLSymbols::Get().clEnqueueWriteBuffer == nullptr ||
CLSymbols::Get().clReleaseEvent == nullptr ||
CLSymbols::Get().clRetainCommandQueue == nullptr ||
CLSymbols::Get().clEnqueueUnmapMemObject == nullptr ||
CLSymbols::Get().clReleaseMemObject == nullptr ||
CLSymbols::Get().clCreateCommandQueue == nullptr ||
CLSymbols::Get().clCreateContextFromType == nullptr ||
CLSymbols::Get().clGetContextInfo == nullptr ||
CLSymbols::Get().clGetDeviceInfo == nullptr ||
CLSymbols::Get().clGetPlatformIDs == nullptr ||
CLSymbols::Get().clGetPlatformInfo == nullptr ||
CLSymbols::Get().clRetainDevice == nullptr ||
CLSymbols::Get().clReleaseDevice == nullptr ||
CLSymbols::Get().clCreateContext == nullptr ||
CLSymbols::Get().clFinish == nullptr ||
CLSymbols::Get().clGetDeviceIDs == nullptr ||
CLSymbols::Get().clCreateImage == nullptr ||
CLSymbols::Get().clEnqueueMapImage == nullptr ||
CLSymbols::Get().clGetKernelWorkGroupInfo == nullptr ||
CLSymbols::Get().clWaitForEvents == nullptr ||
CLSymbols::Get().clGetEventProfilingInfo == nullptr ||
CLSymbols::Get().clCreateImage2D == nullptr ||
CLSymbols::Get().clRetainMemObject == nullptr ||
CLSymbols::Get().clRetainEvent == nullptr ||
CLSymbols::Get().clEnqueueReadImage == nullptr ||
CLSymbols::Get().clEnqueueWriteImage == nullptr ||
CLSymbols::Get().clGetSupportedImageFormats == nullptr) {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
return CL_LOADER_SUCCESS;
}
private:
Impl() : openedLib("Unknown location")
{
}
private:
std::string openedLib;
};
int Loader::Init()
{
return Impl::Instance().Init();
}
const std::string& Loader::GetLibPath()
{
return Impl::Instance().GetLibPath();
}
void Loader::Exit()
{
return Impl::Instance().Exit();
}
} // namespace OpenCLHelper
using CLSymbols = OpenCLHelper::CLSymbols;
CL_LOADER_EXPORT cl_int clBuildProgram(
cl_program program,
cl_uint num_devices,
const cl_device_id* device_list,
const char* options,
void(CL_CALLBACK* pfn_notify)(cl_program program, void* user_data),
void* user_data)
{
auto func = CLSymbols::Get().clBuildProgram;
if (func != nullptr) {
return func(
program, num_devices, device_list, options, pfn_notify, user_data);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clEnqueueNDRangeKernel(cl_command_queue command_queue,
cl_kernel kernel,
cl_uint work_dim,
const size_t* global_work_offset,
const size_t* global_work_size,
const size_t* local_work_size,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event)
{
auto func = CLSymbols::Get().clEnqueueNDRangeKernel;
if (func != nullptr) {
return func(command_queue,
kernel,
work_dim,
global_work_offset,
global_work_size,
local_work_size,
num_events_in_wait_list,
event_wait_list,
event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clSetKernelArg(cl_kernel kernel,
cl_uint arg_index,
size_t arg_size,
const void* arg_value)
{
auto func = CLSymbols::Get().clSetKernelArg;
if (func != nullptr) {
return func(kernel, arg_index, arg_size, arg_value);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clReleaseMemObject(cl_mem memobj)
{
auto func = CLSymbols::Get().clReleaseMemObject;
if (func != nullptr) {
return func(memobj);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clEnqueueUnmapMemObject(cl_command_queue command_queue,
cl_mem memobj,
void* mapped_ptr,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event)
{
auto func = CLSymbols::Get().clEnqueueUnmapMemObject;
if (func != nullptr) {
return func(command_queue,
memobj,
mapped_ptr,
num_events_in_wait_list,
event_wait_list,
event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clRetainCommandQueue(cl_command_queue command_queue)
{
auto func = CLSymbols::Get().clRetainCommandQueue;
if (func != nullptr) {
return func(command_queue);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clReleaseContext(cl_context context)
{
auto func = CLSymbols::Get().clReleaseContext;
if (func != nullptr) {
return func(context);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clReleaseEvent(cl_event event)
{
auto func = CLSymbols::Get().clReleaseEvent;
if (func != nullptr) {
return func(event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clEnqueueWriteBuffer(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_write,
size_t offset,
size_t size,
const void* ptr,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event)
{
auto func = CLSymbols::Get().clEnqueueWriteBuffer;
if (func != nullptr) {
return func(command_queue,
buffer,
blocking_write,
offset,
size,
ptr,
num_events_in_wait_list,
event_wait_list,
event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clEnqueueReadBuffer(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_read,
size_t offset,
size_t size,
void* ptr,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event)
{
auto func = CLSymbols::Get().clEnqueueReadBuffer;
if (func != nullptr) {
return func(command_queue,
buffer,
blocking_read,
offset,
size,
ptr,
num_events_in_wait_list,
event_wait_list,
event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clGetProgramBuildInfo(cl_program program,
cl_device_id device,
cl_program_build_info param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret)
{
auto func = CLSymbols::Get().clGetProgramBuildInfo;
if (func != nullptr) {
return func(program,
device,
param_name,
param_value_size,
param_value,
param_value_size_ret);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clRetainProgram(cl_program program)
{
auto func = CLSymbols::Get().clRetainProgram;
if (func != nullptr) {
return func(program);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
void* clEnqueueMapBuffer(cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_map,
cl_map_flags map_flags,
size_t offset,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clEnqueueMapBuffer;
if (func != nullptr) {
return func(command_queue,
buffer,
blocking_map,
map_flags,
offset,
size,
num_events_in_wait_list,
event_wait_list,
event,
errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clReleaseCommandQueue(cl_command_queue command_queue)
{
auto func = CLSymbols::Get().clReleaseCommandQueue;
if (func != nullptr) {
return func(command_queue);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_program
clCreateProgramWithBinary(cl_context context,
cl_uint num_devices,
const cl_device_id* device_list,
const size_t* lengths,
const unsigned char** binaries,
cl_int* binary_status,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateProgramWithBinary;
if (func != nullptr) {
return func(context,
num_devices,
device_list,
lengths,
binaries,
binary_status,
errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clRetainContext(cl_context context)
{
auto func = CLSymbols::Get().clRetainContext;
if (func != nullptr) {
return func(context);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clReleaseProgram(cl_program program)
{
auto func = CLSymbols::Get().clReleaseProgram;
if (func != nullptr) {
return func(program);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clFlush(cl_command_queue command_queue)
{
auto func = CLSymbols::Get().clFlush;
if (func != nullptr) {
return func(command_queue);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clGetProgramInfo(cl_program program,
cl_program_info param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret)
{
auto func = CLSymbols::Get().clGetProgramInfo;
if (func != nullptr) {
return func(program,
param_name,
param_value_size,
param_value,
param_value_size_ret);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_kernel clCreateKernel(cl_program program,
const char* kernel_name,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateKernel;
if (func != nullptr) {
return func(program, kernel_name, errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clRetainKernel(cl_kernel kernel)
{
auto func = CLSymbols::Get().clRetainKernel;
if (func != nullptr) {
return func(kernel);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_mem clCreateBuffer(cl_context context,
cl_mem_flags flags,
size_t size,
void* host_ptr,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateBuffer;
if (func != nullptr) {
return func(context, flags, size, host_ptr, errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_program clCreateProgramWithSource(cl_context context,
cl_uint count,
const char** strings,
const size_t* lengths,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateProgramWithSource;
if (func != nullptr) {
return func(context, count, strings, lengths, errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clReleaseKernel(cl_kernel kernel)
{
auto func = CLSymbols::Get().clReleaseKernel;
if (func != nullptr) {
return func(kernel);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_command_queue
clCreateCommandQueue(cl_context context,
cl_device_id device,
cl_command_queue_properties properties,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateCommandQueue;
if (func != nullptr) {
return func(context, device, properties, errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_context clCreateContextFromType(
const cl_context_properties* properties,
cl_device_type device_type,
void(CL_CALLBACK* pfn_notify)(const char*, const void*, size_t, void*),
void* user_data,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateContextFromType;
if (func != nullptr) {
return func(
properties, device_type, pfn_notify, user_data, errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clGetContextInfo(cl_context context,
cl_context_info param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret)
{
auto func = CLSymbols::Get().clGetContextInfo;
if (func != nullptr) {
return func(context,
param_name,
param_value_size,
param_value,
param_value_size_ret);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int
clGetSupportedImageFormats(cl_context context,
cl_mem_flags flags,
cl_mem_object_type image_type,
cl_uint num_entries,
cl_image_format* image_formats,
cl_uint* num_image_formats)
{
auto func = CLSymbols::Get().clGetSupportedImageFormats;
if (func != nullptr) {
return func(context,
flags,
image_type,
num_entries,
image_formats,
num_image_formats);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clGetDeviceInfo(cl_device_id device,
cl_device_info param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret)
{
auto func = CLSymbols::Get().clGetDeviceInfo;
if (func != nullptr) {
return func(device,
param_name,
param_value_size,
param_value,
param_value_size_ret);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clGetPlatformIDs(cl_uint num_entries,
cl_platform_id* platforms,
cl_uint* num_platforms)
{
auto func = CLSymbols::Get().clGetPlatformIDs;
if (func != nullptr) {
return func(num_entries, platforms, num_platforms);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clGetPlatformInfo(cl_platform_id platform,
cl_platform_info param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret)
{
auto func = CLSymbols::Get().clGetPlatformInfo;
if (func != nullptr) {
return func(platform,
param_name,
param_value_size,
param_value,
param_value_size_ret);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clRetainDevice(cl_device_id device)
{
auto func = CLSymbols::Get().clRetainDevice;
if (func != nullptr) {
return func(device);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clReleaseDevice(cl_device_id device)
{
auto func = CLSymbols::Get().clReleaseDevice;
if (func != nullptr) {
return func(device);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_context clCreateContext(
const cl_context_properties* properties,
cl_uint num_devices,
const cl_device_id* devices,
void(CL_CALLBACK* pfn_notify)(const char*, const void*, size_t, void*),
void* user_data,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateContext;
if (func != nullptr) {
return func(properties,
num_devices,
devices,
pfn_notify,
user_data,
errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clFinish(cl_command_queue command_queue)
{
auto func = CLSymbols::Get().clFinish;
if (func != nullptr) {
return func(command_queue);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clGetDeviceIDs(cl_platform_id platform,
cl_device_type device_type,
cl_uint num_entries,
cl_device_id* devices,
cl_uint* num_devices)
{
auto func = CLSymbols::Get().clGetDeviceIDs;
if (func != nullptr) {
return func(platform, device_type, num_entries, devices, num_devices);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clEnqueueFillBuffer(cl_command_queue command_queue,
cl_mem buffer,
const void* pattern,
size_t pattern_size,
size_t offset,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event)
{
auto func = CLSymbols::Get().clEnqueueFillBuffer;
if (func != nullptr) {
return func(command_queue,
buffer,
pattern,
pattern_size,
offset,
size,
num_events_in_wait_list,
event_wait_list,
event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_mem clCreateImage(cl_context context,
cl_mem_flags flags,
const cl_image_format* image_format,
const cl_image_desc* image_desc,
void* host_ptr,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateImage;
if (func != nullptr) {
return func(
context, flags, image_format, image_desc, host_ptr, errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
void* clEnqueueMapImage(cl_command_queue command_queue,
cl_mem image,
cl_bool blocking_map,
cl_map_flags map_flags,
const size_t* origin,
const size_t* region,
size_t* image_row_pitch,
size_t* image_slice_pitch,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clEnqueueMapImage;
if (func != nullptr) {
return func(command_queue,
image,
blocking_map,
map_flags,
origin,
region,
image_row_pitch,
image_slice_pitch,
num_events_in_wait_list,
event_wait_list,
event,
errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clEnqueueReadImage(cl_command_queue command_queue,
cl_mem image,
cl_bool blocking_map,
const size_t* origin,
const size_t* region,
size_t image_row_pitch,
size_t image_slice_pitch,
void* ptr,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event)
{
auto func = CLSymbols::Get().clEnqueueReadImage;
if (func != nullptr) {
return func(command_queue,
image,
blocking_map,
origin,
region,
image_row_pitch,
image_slice_pitch,
ptr,
num_events_in_wait_list,
event_wait_list,
event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clEnqueueWriteImage(cl_command_queue command_queue,
cl_mem image,
cl_bool blocking_map,
const size_t* origin,
const size_t* region,
size_t image_row_pitch,
size_t image_slice_pitch,
const void* ptr,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event)
{
auto func = CLSymbols::Get().clEnqueueWriteImage;
if (func != nullptr) {
return func(command_queue,
image,
blocking_map,
origin,
region,
image_row_pitch,
image_slice_pitch,
ptr,
num_events_in_wait_list,
event_wait_list,
event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int
clGetKernelWorkGroupInfo(cl_kernel kernel,
cl_device_id device,
cl_kernel_work_group_info param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret)
{
auto func = CLSymbols::Get().clGetKernelWorkGroupInfo;
if (func != nullptr) {
return func(kernel,
device,
param_name,
param_value_size,
param_value,
param_value_size_ret);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clWaitForEvents(cl_uint num_events,
const cl_event* event_list)
{
auto func = CLSymbols::Get().clWaitForEvents;
if (func != nullptr) {
return func(num_events, event_list);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clGetEventProfilingInfo(cl_event event,
cl_profiling_info param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret)
{
auto func = CLSymbols::Get().clGetEventProfilingInfo;
if (func != nullptr) {
return func(event,
param_name,
param_value_size,
param_value,
param_value_size_ret);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_mem clCreateImage2D(cl_context context,
cl_mem_flags flags,
const cl_image_format* format,
size_t width,
size_t height,
size_t row_pitch,
void* host_ptr,
cl_int* errcode_ret)
{
auto func = CLSymbols::Get().clCreateImage2D;
if (func != nullptr) {
return func(context,
flags,
format,
width,
height,
row_pitch,
host_ptr,
errcode_ret);
} else {
if (errcode_ret != nullptr) {
*errcode_ret = CL_LOADER_FAILED_MAP_SYMBOL;
}
return nullptr;
}
}
CL_LOADER_EXPORT cl_int clRetainMemObject(cl_mem mem)
{
auto func = CLSymbols::Get().clRetainMemObject;
if (func != nullptr) {
return func(mem);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
CL_LOADER_EXPORT cl_int clRetainEvent(cl_event event)
{
auto func = CLSymbols::Get().clRetainEvent;
if (func != nullptr) {
return func(event);
} else {
return CL_LOADER_FAILED_MAP_SYMBOL;
}
}
#endif