Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
dlopencl.h
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2011, 2014, 2016 Ulrich Pegelow.
4 Copyright (C) 2012 johannes hanika.
5 Copyright (C) 2012 parafin.
6 Copyright (C) 2012 Richard Wonka.
7 Copyright (C) 2012-2014, 2016 Tobias Ellinghaus.
8 Copyright (C) 2020 Pascal Obry.
9 Copyright (C) 2022 Martin Baƙinka.
10
11 darktable is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
15
16 darktable is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with darktable. If not, see <http://www.gnu.org/licenses/>.
23*/
24
25#pragma once
26
27#ifdef HAVE_OPENCL
28
29#ifdef HAVE_CONFIG_H
30#include "config.h"
31#endif
32
33#include <CL/cl.h>
34
35typedef cl_int (*dt_clGetPlatformIDs_t)(cl_uint, cl_platform_id *, cl_uint *);
36typedef cl_int (*dt_clGetPlatformInfo_t)(cl_platform_id, cl_platform_info, size_t, void *, size_t *);
37typedef cl_int (*dt_clGetDeviceIDs_t)(cl_platform_id, cl_device_type, cl_uint, cl_device_id *, cl_uint *);
38typedef cl_int (*dt_clGetDeviceInfo_t)(cl_device_id, cl_device_info, size_t, void *, size_t *);
39typedef cl_context (*dt_clCreateContext_t)(const cl_context_properties *, cl_uint, const cl_device_id *,
40 void (*)(const char *, const void *, size_t, void *), void *,
41 cl_int *);
42typedef cl_context (*dt_clCreateContextFromType_t)(const cl_context_properties *, cl_device_type,
43 void (*)(const char *, const void *, size_t, void *),
44 void *, cl_int *);
45typedef cl_int (*dt_clRetainContext_t)(cl_context);
46typedef cl_int (*dt_clReleaseContext_t)(cl_context);
47typedef cl_int (*dt_clGetContextInfo_t)(cl_context, cl_context_info, size_t, void *, size_t *);
48typedef cl_command_queue (*dt_clCreateCommandQueue_t)(cl_context, cl_device_id, cl_command_queue_properties,
49 cl_int *);
50typedef cl_int (*dt_clRetainCommandQueue_t)(cl_command_queue);
51typedef cl_int (*dt_clReleaseCommandQueue_t)(cl_command_queue);
52typedef cl_int (*dt_clGetCommandQueueInfo_t)(cl_command_queue, cl_command_queue_info, size_t, void *,
53 size_t *);
54typedef cl_int (*dt_clSetCommandQueueProperty_t)(cl_command_queue, cl_command_queue_properties, cl_bool,
55 cl_command_queue_properties *);
56typedef cl_mem (*dt_clCreateBuffer_t)(cl_context, cl_mem_flags, size_t, void *, cl_int *);
57typedef cl_mem (*dt_clCreateSubBuffer_t)(cl_mem, cl_mem_flags, cl_buffer_create_type, const void *, cl_int *);
58typedef cl_mem (*dt_clCreateImage2D_t)(cl_context, cl_mem_flags, const cl_image_format *, size_t, size_t,
59 size_t, void *, cl_int *);
60typedef cl_mem (*dt_clCreateImage3D_t)(cl_context, cl_mem_flags, const cl_image_format *, size_t, size_t,
61 size_t, size_t, size_t, void *, cl_int *);
62typedef cl_int (*dt_clRetainMemObject_t)(cl_mem);
63typedef cl_int (*dt_clReleaseMemObject_t)(cl_mem);
64typedef cl_int (*dt_clGetSupportedImageFormats_t)(cl_context, cl_mem_flags, cl_mem_object_type, cl_uint,
65 cl_image_format *, cl_uint *);
66typedef cl_int (*dt_clGetMemObjectInfo_t)(cl_mem, cl_mem_info, size_t, void *, size_t *);
67typedef cl_int (*dt_clGetImageInfo_t)(cl_mem, cl_image_info, size_t, void *, size_t *);
68typedef cl_int (*dt_clSetMemObjectDestructorCallback_t)(cl_mem, void(*), void *);
69typedef cl_sampler (*dt_clCreateSampler_t)(cl_context, cl_bool, cl_addressing_mode, cl_filter_mode, cl_int *);
70typedef cl_int (*dt_clRetainSampler_t)(cl_sampler);
71typedef cl_int (*dt_clReleaseSampler_t)(cl_sampler);
72typedef cl_int (*dt_clGetSamplerInfo_t)(cl_sampler, cl_sampler_info, size_t, void *, size_t *);
73typedef cl_program (*dt_clCreateProgramWithSource_t)(cl_context, cl_uint, const char **, const size_t *,
74 cl_int *);
75typedef cl_program (*dt_clCreateProgramWithBinary_t)(cl_context, cl_uint, const cl_device_id *,
76 const size_t *, const unsigned char **, cl_int *,
77 cl_int *);
78typedef cl_int (*dt_clRetainProgram_t)(cl_program);
79typedef cl_int (*dt_clReleaseProgram_t)(cl_program);
80typedef cl_int (*dt_clBuildProgram_t)(cl_program, cl_uint, const cl_device_id *, const char *, void(*),
81 void *);
82typedef cl_int (*dt_clUnloadCompiler_t)(void);
83typedef cl_int (*dt_clGetProgramInfo_t)(cl_program, cl_program_info, size_t, void *, size_t *);
84typedef cl_int (*dt_clGetProgramBuildInfo_t)(cl_program, cl_device_id, cl_program_build_info, size_t, void *,
85 size_t *);
86typedef cl_kernel (*dt_clCreateKernel_t)(cl_program, const char *, cl_int *);
87typedef cl_int (*dt_clCreateKernelsInProgram_t)(cl_program, cl_uint, cl_kernel *, cl_uint *);
88typedef cl_int (*dt_clRetainKernel_t)(cl_kernel);
89typedef cl_int (*dt_clReleaseKernel_t)(cl_kernel);
90typedef cl_int (*dt_clSetKernelArg_t)(cl_kernel, cl_uint, size_t, const void *);
91typedef cl_int (*dt_clGetKernelInfo_t)(cl_kernel, cl_kernel_info, size_t, void *, size_t *);
92typedef cl_int (*dt_clGetKernelWorkGroupInfo_t)(cl_kernel, cl_device_id, cl_kernel_work_group_info, size_t,
93 void *, size_t *);
94typedef cl_int (*dt_clWaitForEvents_t)(cl_uint, const cl_event *);
95typedef cl_int (*dt_clGetEventInfo_t)(cl_event, cl_event_info, size_t, void *, size_t *);
96typedef cl_event (*dt_clCreateUserEvent_t)(cl_context, cl_int *);
97typedef cl_int (*dt_clRetainEvent_t)(cl_event);
98typedef cl_int (*dt_clReleaseEvent_t)(cl_event);
99typedef cl_int (*dt_clSetUserEventStatus_t)(cl_event, cl_int);
100typedef cl_int (*dt_clSetEventCallback_t)(cl_event, cl_int, void (*)(cl_event, cl_int, void *), void *);
101typedef cl_int (*dt_clGetEventProfilingInfo_t)(cl_event, cl_profiling_info, size_t, void *, size_t *);
102typedef cl_int (*dt_clFlush_t)(cl_command_queue);
103typedef cl_int (*dt_clFinish_t)(cl_command_queue);
104typedef cl_int (*dt_clEnqueueReadBuffer_t)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, void *, cl_uint,
105 const cl_event *, cl_event *);
106typedef cl_int (*dt_clEnqueueReadBufferRect_t)(cl_command_queue, cl_mem, cl_bool, const size_t *,
107 const size_t *, const size_t *, size_t, size_t, size_t, size_t,
108 void *, cl_uint, const cl_event *, cl_event *);
109typedef cl_int (*dt_clEnqueueWriteBuffer_t)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void *,
110 cl_uint, const cl_event *, cl_event *);
111typedef cl_int (*dt_clEnqueueWriteBufferRect_t)(cl_command_queue, cl_mem, cl_bool, const size_t *,
112 const size_t *, const size_t *, size_t, size_t, size_t,
113 size_t, const void *, cl_uint, const cl_event *, cl_event *);
114typedef cl_int (*dt_clEnqueueCopyBuffer_t)(cl_command_queue, cl_mem, cl_mem, size_t, size_t, size_t, cl_uint,
115 const cl_event *, cl_event *);
116typedef cl_int (*dt_clEnqueueCopyBufferRect_t)(cl_command_queue, cl_mem, cl_mem, const size_t *,
117 const size_t *, const size_t *, size_t, size_t, size_t, size_t,
118 cl_uint, const cl_event *, cl_event *);
119typedef cl_int (*dt_clEnqueueReadImage_t)(cl_command_queue, cl_mem, cl_bool, const size_t *, const size_t *,
120 size_t, size_t, void *, cl_uint, const cl_event *, cl_event *);
121typedef cl_int (*dt_clEnqueueWriteImage_t)(cl_command_queue, cl_mem, cl_bool, const size_t *, const size_t *,
122 size_t, size_t, const void *, cl_uint, const cl_event *,
123 cl_event *);
124typedef cl_int (*dt_clEnqueueCopyImage_t)(cl_command_queue, cl_mem, cl_mem, const size_t *, const size_t *,
125 const size_t *, cl_uint, const cl_event *, cl_event *);
126typedef cl_int (*dt_clEnqueueCopyImageToBuffer_t)(cl_command_queue, cl_mem, cl_mem, const size_t *,
127 const size_t *, size_t, cl_uint, const cl_event *,
128 cl_event *);
129typedef cl_int (*dt_clEnqueueCopyBufferToImage_t)(cl_command_queue, cl_mem, cl_mem, size_t, const size_t *,
130 const size_t *, cl_uint, const cl_event *, cl_event *);
131typedef void *(*dt_clEnqueueMapBuffer_t)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t,
132 cl_uint, const cl_event *, cl_event *, cl_int *);
133typedef void *(*dt_clEnqueueMapImage_t)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, const size_t *,
134 const size_t *, size_t *, size_t *, cl_uint, const cl_event *,
135 cl_event *, cl_int *);
136typedef cl_int (*dt_clEnqueueUnmapMemObject_t)(cl_command_queue, cl_mem, void *, cl_uint, const cl_event *,
137 cl_event *);
138typedef cl_int (*dt_clEnqueueNDRangeKernel_t)(cl_command_queue, cl_kernel, cl_uint, const size_t *,
139 const size_t *, const size_t *, cl_uint, const cl_event *,
140 cl_event *);
141typedef cl_int (*dt_clEnqueueTask_t)(cl_command_queue, cl_kernel, cl_uint, const cl_event *, cl_event *);
142typedef cl_int (*dt_clEnqueueNativeKernel_t)(cl_command_queue, void (*user_func)(void *), void *, size_t,
143 cl_uint, const cl_mem *, const void **, cl_uint,
144 const cl_event *, cl_event *);
145typedef cl_int (*dt_clEnqueueMarker_t)(cl_command_queue, cl_event *);
146typedef cl_int (*dt_clEnqueueWaitForEvents_t)(cl_command_queue, cl_uint, const cl_event *);
147typedef cl_int (*dt_clEnqueueBarrier_t)(cl_command_queue);
148
149typedef struct dt_dlopencl_symbols_t
150{
151 dt_clGetPlatformIDs_t dt_clGetPlatformIDs;
152 dt_clGetPlatformInfo_t dt_clGetPlatformInfo;
153 dt_clGetDeviceIDs_t dt_clGetDeviceIDs;
154 dt_clGetDeviceInfo_t dt_clGetDeviceInfo;
155 dt_clCreateContext_t dt_clCreateContext;
156 dt_clCreateContextFromType_t dt_clCreateContextFromType;
157 dt_clRetainContext_t dt_clRetainContext;
158 dt_clReleaseContext_t dt_clReleaseContext;
159 dt_clGetContextInfo_t dt_clGetContextInfo;
160 dt_clCreateCommandQueue_t dt_clCreateCommandQueue;
161 dt_clRetainCommandQueue_t dt_clRetainCommandQueue;
162 dt_clReleaseCommandQueue_t dt_clReleaseCommandQueue;
163 dt_clGetCommandQueueInfo_t dt_clGetCommandQueueInfo;
164 dt_clSetCommandQueueProperty_t dt_clSetCommandQueueProperty;
165 dt_clCreateBuffer_t dt_clCreateBuffer;
166 dt_clCreateSubBuffer_t dt_clCreateSubBuffer;
167 dt_clCreateImage2D_t dt_clCreateImage2D;
168 dt_clCreateImage3D_t dt_clCreateImage3D;
169 dt_clRetainMemObject_t dt_clRetainMemObject;
170 dt_clReleaseMemObject_t dt_clReleaseMemObject;
171 dt_clGetSupportedImageFormats_t dt_clGetSupportedImageFormats;
172 dt_clGetMemObjectInfo_t dt_clGetMemObjectInfo;
173 dt_clGetImageInfo_t dt_clGetImageInfo;
174 dt_clSetMemObjectDestructorCallback_t dt_clSetMemObjectDestructorCallback;
175 dt_clCreateSampler_t dt_clCreateSampler;
176 dt_clRetainSampler_t dt_clRetainSampler;
177 dt_clReleaseSampler_t dt_clReleaseSampler;
178 dt_clGetSamplerInfo_t dt_clGetSamplerInfo;
179 dt_clCreateProgramWithSource_t dt_clCreateProgramWithSource;
180 dt_clCreateProgramWithBinary_t dt_clCreateProgramWithBinary;
181 dt_clRetainProgram_t dt_clRetainProgram;
182 dt_clReleaseProgram_t dt_clReleaseProgram;
183 dt_clBuildProgram_t dt_clBuildProgram;
184 dt_clUnloadCompiler_t dt_clUnloadCompiler;
185 dt_clGetProgramInfo_t dt_clGetProgramInfo;
186 dt_clGetProgramBuildInfo_t dt_clGetProgramBuildInfo;
187 dt_clCreateKernel_t dt_clCreateKernel;
188 dt_clCreateKernelsInProgram_t dt_clCreateKernelsInProgram;
189 dt_clRetainKernel_t dt_clRetainKernel;
190 dt_clReleaseKernel_t dt_clReleaseKernel;
191 dt_clSetKernelArg_t dt_clSetKernelArg;
192 dt_clGetKernelInfo_t dt_clGetKernelInfo;
193 dt_clGetKernelWorkGroupInfo_t dt_clGetKernelWorkGroupInfo;
194 dt_clWaitForEvents_t dt_clWaitForEvents;
195 dt_clGetEventInfo_t dt_clGetEventInfo;
196 dt_clCreateUserEvent_t dt_clCreateUserEvent;
197 dt_clRetainEvent_t dt_clRetainEvent;
198 dt_clReleaseEvent_t dt_clReleaseEvent;
199 dt_clSetUserEventStatus_t dt_clSetUserEventStatus;
200 dt_clSetEventCallback_t dt_clSetEventCallback;
201 dt_clGetEventProfilingInfo_t dt_clGetEventProfilingInfo;
202 dt_clFlush_t dt_clFlush;
203 dt_clFinish_t dt_clFinish;
204 dt_clEnqueueReadBuffer_t dt_clEnqueueReadBuffer;
205 dt_clEnqueueReadBufferRect_t dt_clEnqueueReadBufferRect;
206 dt_clEnqueueWriteBuffer_t dt_clEnqueueWriteBuffer;
207 dt_clEnqueueWriteBufferRect_t dt_clEnqueueWriteBufferRect;
208 dt_clEnqueueCopyBuffer_t dt_clEnqueueCopyBuffer;
209 dt_clEnqueueCopyBufferRect_t dt_clEnqueueCopyBufferRect;
210 dt_clEnqueueReadImage_t dt_clEnqueueReadImage;
211 dt_clEnqueueWriteImage_t dt_clEnqueueWriteImage;
212 dt_clEnqueueCopyImage_t dt_clEnqueueCopyImage;
213 dt_clEnqueueCopyImageToBuffer_t dt_clEnqueueCopyImageToBuffer;
214 dt_clEnqueueCopyBufferToImage_t dt_clEnqueueCopyBufferToImage;
215 dt_clEnqueueMapBuffer_t dt_clEnqueueMapBuffer;
216 dt_clEnqueueMapImage_t dt_clEnqueueMapImage;
217 dt_clEnqueueUnmapMemObject_t dt_clEnqueueUnmapMemObject;
218 dt_clEnqueueNDRangeKernel_t dt_clEnqueueNDRangeKernel;
219 dt_clEnqueueTask_t dt_clEnqueueTask;
220 dt_clEnqueueNativeKernel_t dt_clEnqueueNativeKernel;
221 dt_clEnqueueMarker_t dt_clEnqueueMarker;
222 dt_clEnqueueWaitForEvents_t dt_clEnqueueWaitForEvents;
223 dt_clEnqueueBarrier_t dt_clEnqueueBarrier;
224} dt_dlopencl_symbols_t;
225
226
227
228typedef struct dt_dlopencl_t
229{
230 int have_opencl;
231 dt_dlopencl_symbols_t *symbols;
232 char *library;
233} dt_dlopencl_t;
234
235/* default noop function for all unassigned function pointers */
236void dt_dlopencl_noop(void);
237
238/* dynamically load OpenCL library and bind needed functions */
239dt_dlopencl_t *dt_dlopencl_init(const char *);
240
241#endif // HAVE_OPENCL
242
243// clang-format off
244// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
245// vim: shiftwidth=2 expandtab tabstop=2 cindent
246// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
247// clang-format on
248
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))