001/*
002 * To change this template, choose Tools | Templates
003 * and open the template in the editor.
004 */
005package com.nativelibs4java.opencl.proxy;
006
007import com.nativelibs4java.opencl.library.IOpenCLLibrary;
008import static com.nativelibs4java.opencl.library.IOpenCLLibrary.*;
009import com.nativelibs4java.opencl.library.OpenCLLibrary;
010import java.util.ArrayList;
011import java.util.Iterator;
012import java.util.List;
013import java.util.ServiceLoader;
014import org.bridj.BridJ;
015import org.bridj.Pointer;
016import static org.bridj.Pointer.*;
017import static com.nativelibs4java.opencl.proxy.PointerUtils.*;
018import org.bridj.SizeT;
019import org.bridj.StructObject;
020import org.bridj.ann.Field;
021import org.bridj.ann.Ptr;
022
023/**
024 *
025 * @author ochafik
026 */
027public class ProxiedOpenCLImplementation implements IOpenCLLibrary {
028    
029    private static Pointer<?> icdDispatchTable;
030    public static void setIcdDispatchTable(long icdDispatchTablePeer) {
031        ProxiedOpenCLImplementation.icdDispatchTable = pointerToAddress(icdDispatchTablePeer);
032    }
033
034    private static ProxiedOpenCLImplementation instance;
035    public static synchronized IOpenCLLibrary getInstance() {
036        if (instance == null) {
037            List<IOpenCLLibrary> platforms = new ArrayList<IOpenCLLibrary>();
038            for (Iterator<IOpenCLLibrary> it = ServiceLoader.load(IOpenCLLibrary.class).iterator(); it.hasNext();) {
039                IOpenCLLibrary platform = it.next();
040                platforms.add(platform);
041            }
042            instance = new ProxiedOpenCLImplementation(platforms);
043        }
044        return instance;
045    }
046
047    public int clCreateSubDevices(long cl_device_id1, long cl_device_partition_propertyPtr1, int cl_uint1, long cl_device_idPtr1, long cl_uintPtr1) {
048        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
049    }
050
051    public long clCreateContextFromType(long cl_context_propertiesPtr1, long cl_device_type1, long arg1, long voidPtr1, long cl_intPtr1) {
052        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
053    }
054
055    public long clCreateProgramWithBuiltInKernels(long cl_context1, int cl_uint1, long cl_device_idPtr1, long charPtr1, long cl_intPtr1) {
056        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
057    }
058
059    public int clCompileProgram(long cl_program1, int cl_uint1, long cl_device_idPtr1, long charPtr1, int cl_uint2, long cl_programPtr1, long charPtrPtr1, long arg1, long voidPtr1) {
060        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
061    }
062
063    public long clLinkProgram(long cl_context1, int cl_uint1, long cl_device_idPtr1, long charPtr1, int cl_uint2, long cl_programPtr1, long arg1, long voidPtr1, long cl_intPtr1) {
064        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
065    }
066
067    public int clEnqueueReadBufferRect(long cl_command_queue1, long cl_mem1, int cl_bool1, long size_tPtr1, long size_tPtr2, long size_tPtr3, long size_t1, long size_t2, long size_t3, long size_t4, long voidPtr1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
068        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
069    }
070
071    public int clEnqueueWriteBufferRect(long cl_command_queue1, long cl_mem1, int cl_bool1, long size_tPtr1, long size_tPtr2, long size_tPtr3, long size_t1, long size_t2, long size_t3, long size_t4, long voidPtr1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
072        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
073    }
074
075    public int clEnqueueFillBuffer(long cl_command_queue1, long cl_mem1, long voidPtr1, long size_t1, long size_t2, long size_t3, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
076        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
077    }
078
079    public int clEnqueueCopyBufferRect(long cl_command_queue1, long cl_mem1, long cl_mem2, long size_tPtr1, long size_tPtr2, long size_tPtr3, long size_t1, long size_t2, long size_t3, long size_t4, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
080        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
081    }
082
083    public int clEnqueueFillImage(long cl_command_queue1, long cl_mem1, long voidPtr1, long size_tPtr1, long size_tPtr2, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
084        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
085    }
086
087    public int clEnqueueCopyImage(long cl_command_queue1, long cl_mem1, long cl_mem2, long size_tPtr1, long size_tPtr2, long size_tPtr3, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
088        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
089    }
090
091    public int clEnqueueCopyImageToBuffer(long cl_command_queue1, long cl_mem1, long cl_mem2, long size_tPtr1, long size_tPtr2, long size_t1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
092        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
093    }
094
095    public int clEnqueueCopyBufferToImage(long cl_command_queue1, long cl_mem1, long cl_mem2, long size_t1, long size_tPtr1, long size_tPtr2, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
096        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
097    }
098
099    public int clEnqueueMigrateMemObjects(long cl_command_queue1, int cl_uint1, long cl_memPtr1, long cl_mem_migration_flags1, int cl_uint2, long cl_eventPtr1, long cl_eventPtr2) {
100        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
101    }
102
103    public int clEnqueueNativeKernel(long cl_command_queue1, long arg1, long voidPtr1, long size_t1, int cl_uint1, long cl_memPtr1, long voidPtrPtr1, int cl_uint2, long cl_eventPtr1, long cl_eventPtr2) {
104        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
105    }
106
107    public int clEnqueueMarkerWithWaitList(long cl_command_queue1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
108        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
109    }
110
111    public int clEnqueueBarrierWithWaitList(long cl_command_queue1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
112        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
113    }
114
115    public int clSetPrintfCallback(long cl_context1, long arg1, long voidPtr1) {
116        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
117    }
118
119    public long clGetExtensionFunctionAddressForPlatform(long cl_platform_id1, long charPtr1) {
120        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
121    }
122
123    public long clGetExtensionFunctionAddress(long charPtr1) {
124        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
125    }
126
127    public long clCreateEventFromGLsyncKHR(long cl_context1, long cl_GLsync1, long cl_intPtr1) {
128        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
129    }
130
131    public int clSetMemObjectDestructorAPPLE(long cl_mem1, long arg1, long voidPtr1) {
132        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
133    }
134
135    public void clLogMessagesToSystemLogAPPLE(long charPtr1, long voidPtr1, long size_t1, long voidPtr2) {
136        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
137    }
138
139    public void clLogMessagesToStdoutAPPLE(long charPtr1, long voidPtr1, long size_t1, long voidPtr2) {
140        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
141    }
142
143    public void clLogMessagesToStderrAPPLE(long charPtr1, long voidPtr1, long size_t1, long voidPtr2) {
144        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
145    }
146
147    public int clCreateSubDevicesEXT(long cl_device_id1, long cl_device_partition_property_extPtr1, int cl_uint1, long cl_device_idPtr1, long cl_uintPtr1) {
148        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
149    }
150    
151    protected static class IcdEntity extends StructObject {
152        @Field(0)
153        public Pointer<?> icdDispatchTable = ProxiedOpenCLImplementation.icdDispatchTable;
154        @Field(1)
155        public int implementationIndex;
156        @Field(2)
157        public int entityIndex;
158        
159        
160        public IcdEntity() {
161            super();
162        }
163        public IcdEntity(Pointer<? extends IcdEntity> peer, Object... targs) {
164            super(peer);
165        }
166    }
167    
168    public static IcdEntity createEntity(int implementationIndex, int entityIndex) {
169        IcdEntity entity = new IcdEntity();
170        entity.implementationIndex = implementationIndex;
171        entity.entityIndex = entityIndex;
172        BridJ.writeToNative(entity);
173        return entity;
174    }
175    
176    private final List<IOpenCLLibrary> implementations;
177    private final List<IcdEntity> platformIds;
178
179    public ProxiedOpenCLImplementation(List<IOpenCLLibrary> implementations) {
180        this.implementations = new ArrayList<IOpenCLLibrary>(implementations);
181        
182        List<IcdEntity> platformIds = new ArrayList<IcdEntity>();
183        for (IOpenCLLibrary implementation : this.implementations) {
184            int implementationIndex = implementations.size();
185            implementations.add(implementation);
186            platformIds.add(createEntity(implementationIndex, implementationIndex));
187        }
188        this.platformIds = platformIds;
189    }
190
191    
192    protected IOpenCLLibrary getImplementation(long icdEntityPeer) {
193        Pointer<IcdEntity> icdEntityPtr = getPointer(icdEntityPeer, IcdEntity.class);
194        IcdEntity icdEntity = icdEntityPtr.get();
195        if (!icdDispatchTable.equals(icdEntity.icdDispatchTable))
196            throw new IllegalArgumentException("Not an ICD entity, or different ICD dispatch table: " + icdEntityPeer);
197        IOpenCLLibrary implementation = implementations.get(icdEntity.implementationIndex);
198        return implementation;
199    }
200    
201    @Override
202    public int clGetPlatformIDs(int num_entries, @Ptr long platforms, @Ptr long num_platforms) {
203        System.out.println("Called clGetPlatformIDs");
204        if ((platforms == 0 || num_entries == 0) && num_platforms == 0) {
205            setSizeT(num_platforms, platformIds.size());
206        } else if (platforms != 0 && num_entries != 0) {
207            int numWrote = 0;
208            for (int i = 0; i < num_entries; i++) {
209                setPointerAtIndex(platforms, i, platformIds.get(i));
210                numWrote++;
211            }
212            if (num_platforms != 0) {
213                setSizeT(num_platforms, numWrote);
214            }
215        } else
216            return CL_INVALID_VALUE;
217        return CL_SUCCESS;
218    }
219    
220    @Override
221    public int clIcdGetPlatformIDsKHR(int num_entries, @Ptr long platforms, @Ptr long num_platforms) {
222        // TODO
223        return clGetPlatformIDs(num_entries, platforms, num_platforms);
224    }
225
226    
227
228    
229    @Override
230    public int clGetDeviceIDs(long cl_platform_id1, long cl_device_type1, int cl_uint1, long cl_device_idPtr1, long cl_uintPtr1) {
231        return getImplementation(cl_platform_id1).clGetDeviceIDs(cl_platform_id1, cl_device_type1, cl_uint1, cl_device_idPtr1, cl_uintPtr1);
232    }
233
234    @Override
235    public int clGetDeviceInfo(long cl_device_id1, int cl_device_info1, long size_t1, long voidPtr1, long size_tPtr1) {
236        return getImplementation(cl_device_id1).clGetDeviceInfo(cl_device_id1, cl_device_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
237    }
238
239    @Override
240    public int clGetPlatformInfo(long cl_platform_id1, int cl_platform_info1, long size_t1, long voidPtr1, long size_tPtr1) {
241        return getImplementation(cl_platform_id1).clGetPlatformInfo(cl_platform_id1, cl_platform_info1, size_t1, voidPtr1, size_tPtr1);
242    }
243
244    @Override
245    public int clBuildProgram(long cl_program1, int cl_uint1, long cl_device_idPtr1, long charPtr1, long arg1, long voidPtr1) {
246        return getImplementation(cl_program1).clBuildProgram(cl_program1, cl_uint1, cl_device_idPtr1, charPtr1, arg1, voidPtr1); //To change body of generated methods, choose Tools | Templates.
247    }
248
249    @Override
250    public long clCreateBuffer(long cl_context1, long cl_mem_flags1, long size_t1, long voidPtr1, long cl_intPtr1) {
251        return getImplementation(cl_context1).clCreateBuffer(cl_context1, cl_mem_flags1, size_t1, voidPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
252    }
253
254    @Override
255    public long clCreateCommandQueue(long cl_context1, long cl_device_id1, long cl_command_queue_properties1, long cl_intPtr1) {
256        return getImplementation(cl_context1).clCreateCommandQueue(cl_context1, cl_device_id1, cl_command_queue_properties1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
257    }
258
259    @Override
260    public long clCreateContext(long cl_context_propertiesPtr1, int cl_uint1, long cl_device_idPtr1, long arg1, long voidPtr1, long cl_intPtr1) {
261        // TODO! 
262        throw new UnsupportedOperationException();
263//        return getImplementation(cl_context_propertiesPtr1).clCreateContext(cl_context_propertiesPtr1, cl_uint1, cl_device_idPtr1, arg1, voidPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
264    }
265
266    @Override
267    public long clCreateFromGLBuffer(long cl_context1, long cl_mem_flags1, int cl_GLuint1, long intPtr1) {
268        return getImplementation(cl_context1).clCreateFromGLBuffer(cl_context1, cl_mem_flags1, cl_GLuint1, intPtr1); //To change body of generated methods, choose Tools | Templates.
269    }
270
271    @Override
272    public long clCreateFromGLRenderbuffer(long cl_context1, long cl_mem_flags1, int cl_GLuint1, long cl_intPtr1) {
273        return getImplementation(cl_context1).clCreateFromGLRenderbuffer(cl_context1, cl_mem_flags1, cl_GLuint1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
274    }
275
276    @Override
277    public long clCreateFromGLTexture(long cl_context1, long cl_mem_flags1, int cl_GLenum1, int cl_GLint1, int cl_GLuint1, long cl_intPtr1) {
278        return getImplementation(cl_context1).clCreateFromGLTexture(cl_context1, cl_mem_flags1, cl_GLenum1, cl_GLint1, cl_GLuint1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
279    }
280
281    @Override
282    public long clCreateFromGLTexture2D(long cl_context1, long cl_mem_flags1, int cl_GLenum1, int cl_GLint1, int cl_GLuint1, long cl_intPtr1) {
283        return getImplementation(cl_context1).clCreateFromGLTexture2D(cl_context1, cl_mem_flags1, cl_GLenum1, cl_GLint1, cl_GLuint1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
284    }
285
286    @Override
287    public long clCreateFromGLTexture3D(long cl_context1, long cl_mem_flags1, int cl_GLenum1, int cl_GLint1, int cl_GLuint1, long cl_intPtr1) {
288        return getImplementation(cl_context1).clCreateFromGLTexture3D(cl_context1, cl_mem_flags1, cl_GLenum1, cl_GLint1, cl_GLuint1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
289    }
290
291    @Override
292    public long clCreateImage(long cl_context1, long cl_mem_flags1, long cl_image_formatPtr1, long cl_image_descPtr1, long voidPtr1, long cl_intPtr1) {
293        return getImplementation(cl_context1).clCreateImage(cl_context1, cl_mem_flags1, cl_image_formatPtr1, cl_image_descPtr1, voidPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
294    }
295
296    @Override
297    public long clCreateImage2D(long cl_context1, long cl_mem_flags1, long cl_image_formatPtr1, long size_t1, long size_t2, long size_t3, long voidPtr1, long cl_intPtr1) {
298        return getImplementation(cl_context1).clCreateImage2D(cl_context1, cl_mem_flags1, cl_image_formatPtr1, size_t1, size_t2, size_t3, voidPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
299    }
300
301    @Override
302    public long clCreateImage3D(long cl_context1, long cl_mem_flags1, long cl_image_formatPtr1, long size_t1, long size_t2, long size_t3, long size_t4, long size_t5, long voidPtr1, long cl_intPtr1) {
303        return getImplementation(cl_context1).clCreateImage3D(cl_context1, cl_mem_flags1, cl_image_formatPtr1, size_t1, size_t2, size_t3, size_t4, size_t5, voidPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
304    }
305
306    @Override
307    public long clCreateKernel(long cl_program1, long charPtr1, long cl_intPtr1) {
308        return getImplementation(cl_program1).clCreateKernel(cl_program1, charPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
309    }
310
311    @Override
312    public int clCreateKernelsInProgram(long cl_program1, int cl_uint1, long cl_kernelPtr1, long cl_uintPtr1) {
313        return getImplementation(cl_program1).clCreateKernelsInProgram(cl_program1, cl_uint1, cl_kernelPtr1, cl_uintPtr1); //To change body of generated methods, choose Tools | Templates.
314    }
315
316    @Override
317    public long clCreateProgramWithBinary(long cl_context1, int cl_uint1, long cl_device_idPtr1, long size_tPtr1, long charPtrPtr1, long cl_intPtr1, long cl_intPtr2) {
318        return getImplementation(cl_context1).clCreateProgramWithBinary(cl_context1, cl_uint1, cl_device_idPtr1, size_tPtr1, charPtrPtr1, cl_intPtr1, cl_intPtr2); //To change body of generated methods, choose Tools | Templates.
319    }
320
321    @Override
322    public long clCreateProgramWithSource(long cl_context1, int cl_uint1, long charPtrPtr1, long size_tPtr1, long cl_intPtr1) {
323        return getImplementation(cl_context1).clCreateProgramWithSource(cl_context1, cl_uint1, charPtrPtr1, size_tPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
324    }
325
326    @Override
327    public long clCreateSampler(long cl_context1, int cl_bool1, int cl_addressing_mode1, int cl_filter_mode1, long cl_intPtr1) {
328        return getImplementation(cl_context1).clCreateSampler(cl_context1, cl_bool1, cl_addressing_mode1, cl_filter_mode1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
329    }
330
331    @Override
332    public long clCreateSubBuffer(long cl_mem1, long cl_mem_flags1, int cl_buffer_create_type1, long voidPtr1, long cl_intPtr1) {
333        return getImplementation(cl_mem1).clCreateSubBuffer(cl_mem1, cl_mem_flags1, cl_buffer_create_type1, voidPtr1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
334    }
335
336    @Override
337    public long clCreateUserEvent(long cl_context1, long cl_intPtr1) {
338        return getImplementation(cl_context1).clCreateUserEvent(cl_context1, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
339    }
340
341    @Override
342    public int clEnqueueAcquireGLObjects(long cl_command_queue1, int cl_uint1, long cl_memPtr1, int cl_uint2, long cl_eventPtr1, long cl_eventPtr2) {
343        return getImplementation(cl_command_queue1).clEnqueueAcquireGLObjects(cl_command_queue1, cl_uint1, cl_memPtr1, cl_uint2, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
344    }
345
346    @Override
347    public int clEnqueueBarrier(long cl_command_queue1) {
348        return getImplementation(cl_command_queue1).clEnqueueBarrier(cl_command_queue1); //To change body of generated methods, choose Tools | Templates.
349    }
350
351    @Override
352    public int clEnqueueCopyBuffer(long cl_command_queue1, long cl_mem1, long cl_mem2, long size_t1, long size_t2, long size_t3, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
353        return getImplementation(cl_command_queue1).clEnqueueCopyBuffer(cl_command_queue1, cl_mem1, cl_mem2, size_t1, size_t2, size_t3, cl_uint1, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
354    }
355
356    @Override
357    public long clEnqueueMapBuffer(long cl_command_queue1, long cl_mem1, int cl_bool1, long cl_map_flags1, long size_t1, long size_t2, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2, long cl_intPtr1) {
358        return getImplementation(cl_command_queue1).clEnqueueMapBuffer(cl_command_queue1, cl_mem1, cl_bool1, cl_map_flags1, size_t1, size_t2, cl_uint1, cl_eventPtr1, cl_eventPtr2, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
359    }
360
361    @Override
362    public long clEnqueueMapImage(long cl_command_queue1, long cl_mem1, int cl_bool1, long cl_map_flags1, long size_tPtr1, long size_tPtr2, long size_tPtr3, long size_tPtr4, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2, long cl_intPtr1) {
363        return getImplementation(cl_command_queue1).clEnqueueMapImage(cl_command_queue1, cl_mem1, cl_bool1, cl_map_flags1, size_tPtr1, size_tPtr2, size_tPtr3, size_tPtr4, cl_uint1, cl_eventPtr1, cl_eventPtr2, cl_intPtr1); //To change body of generated methods, choose Tools | Templates.
364    }
365
366    @Override
367    public int clEnqueueMarker(long cl_command_queue1, long cl_eventPtr1) {
368        return getImplementation(cl_command_queue1).clEnqueueMarker(cl_command_queue1, cl_eventPtr1); //To change body of generated methods, choose Tools | Templates.
369    }
370
371    @Override
372    public int clEnqueueNDRangeKernel(long cl_command_queue1, long cl_kernel1, int cl_uint1, long size_tPtr1, long size_tPtr2, long size_tPtr3, int cl_uint2, long cl_eventPtr1, long cl_eventPtr2) {
373        
374        throw new UnsupportedOperationException();
375//        return getImplementation(cl_program1).clEnqueueNDRangeKernel(cl_command_queue1, cl_kernel1, cl_uint1, size_tPtr1, size_tPtr2, size_tPtr3, cl_uint2, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
376    }
377
378    @Override
379    public int clEnqueueReadBuffer(long cl_command_queue1, long cl_mem1, int cl_bool1, long size_t1, long size_t2, long voidPtr1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
380        return getImplementation(cl_command_queue1).clEnqueueReadBuffer(cl_command_queue1, cl_mem1, cl_bool1, size_t1, size_t2, voidPtr1, cl_uint1, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
381    }
382
383    @Override
384    public int clEnqueueReadImage(long cl_command_queue1, long cl_mem1, int cl_bool1, long size_tPtr1, long size_tPtr2, long size_t1, long size_t2, long voidPtr1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
385        return getImplementation(cl_command_queue1).clEnqueueReadImage(cl_command_queue1, cl_mem1, cl_bool1, size_tPtr1, size_tPtr2, size_t1, size_t2, voidPtr1, cl_uint1, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
386    }
387
388    @Override
389    public int clEnqueueReleaseGLObjects(long cl_command_queue1, int cl_uint1, long cl_memPtr1, int cl_uint2, long cl_eventPtr1, long cl_eventPtr2) {
390        return getImplementation(cl_command_queue1).clEnqueueReleaseGLObjects(cl_command_queue1, cl_uint1, cl_memPtr1, cl_uint2, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
391    }
392
393    @Override
394    public int clEnqueueTask(long cl_command_queue1, long cl_kernel1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
395        return getImplementation(cl_command_queue1).clEnqueueTask(cl_command_queue1, cl_kernel1, cl_uint1, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
396    }
397
398    @Override
399    public int clEnqueueUnmapMemObject(long cl_command_queue1, long cl_mem1, long voidPtr1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
400        return getImplementation(cl_command_queue1).clEnqueueUnmapMemObject(cl_command_queue1, cl_mem1, voidPtr1, cl_uint1, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
401    }
402
403    @Override
404    public int clEnqueueWaitForEvents(long cl_command_queue1, int cl_uint1, long cl_eventPtr1) {
405        return getImplementation(cl_command_queue1).clEnqueueWaitForEvents(cl_command_queue1, cl_uint1, cl_eventPtr1); //To change body of generated methods, choose Tools | Templates.
406    }
407
408    @Override
409    public int clEnqueueWriteBuffer(long cl_command_queue1, long cl_mem1, int cl_bool1, long size_t1, long size_t2, long voidPtr1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
410        return getImplementation(cl_command_queue1).clEnqueueWriteBuffer(cl_command_queue1, cl_mem1, cl_bool1, size_t1, size_t2, voidPtr1, cl_uint1, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
411    }
412
413    @Override
414    public int clEnqueueWriteImage(long cl_command_queue1, long cl_mem1, int cl_bool1, long size_tPtr1, long size_tPtr2, long size_t1, long size_t2, long voidPtr1, int cl_uint1, long cl_eventPtr1, long cl_eventPtr2) {
415        return getImplementation(cl_command_queue1).clEnqueueWriteImage(cl_command_queue1, cl_mem1, cl_bool1, size_tPtr1, size_tPtr2, size_t1, size_t2, voidPtr1, cl_uint1, cl_eventPtr1, cl_eventPtr2); //To change body of generated methods, choose Tools | Templates.
416    }
417
418    @Override
419    public int clFinish(long cl_command_queue1) {
420        return getImplementation(cl_command_queue1).clFinish(cl_command_queue1); //To change body of generated methods, choose Tools | Templates.
421    }
422
423    @Override
424    public int clFlush(long cl_command_queue1) {
425        return getImplementation(cl_command_queue1).clFlush(cl_command_queue1); //To change body of generated methods, choose Tools | Templates.
426    }
427
428    @Override
429    public int clGetCommandQueueInfo(long cl_command_queue1, int cl_command_queue_info1, long size_t1, long voidPtr1, long size_tPtr1) {
430        return getImplementation(cl_command_queue1).clGetCommandQueueInfo(cl_command_queue1, cl_command_queue_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
431    }
432
433    @Override
434    public int clGetContextInfo(long cl_context1, int cl_context_info1, long size_t1, long voidPtr1, long size_tPtr1) {
435        return getImplementation(cl_context1).clGetContextInfo(cl_context1, cl_context_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
436    }
437
438    @Override
439    public int clGetEventInfo(long cl_event1, int cl_event_info1, long size_t1, long voidPtr1, long size_tPtr1) {
440        return getImplementation(cl_event1).clGetEventInfo(cl_event1, cl_event_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
441    }
442
443    @Override
444    public int clGetEventProfilingInfo(long cl_event1, int cl_profiling_info1, long size_t1, long voidPtr1, long size_tPtr1) {
445        return getImplementation(cl_event1).clGetEventProfilingInfo(cl_event1, cl_profiling_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
446    }
447
448    @Override
449    public int clGetGLContextInfoAPPLE(long cl_context1, long voidPtr1, int cl_gl_platform_info1, long size_t1, long voidPtr2, long size_tPtr1) {
450        return getImplementation(cl_context1).clGetGLContextInfoAPPLE(cl_context1, voidPtr1, cl_gl_platform_info1, size_t1, voidPtr2, size_tPtr1);
451    }
452
453    @Override
454    public int clGetGLContextInfoKHR(long cl_context_propertiesPtr1, int cl_gl_context_info1, long size_t1, long voidPtr1, long size_tPtr1) {
455        // TODO
456        throw new UnsupportedOperationException();
457//        return getImplementation(cl_program1).clGetGLContextInfoKHR(cl_context_propertiesPtr1, cl_gl_context_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
458    }
459
460    @Override
461    public int clGetGLObjectInfo(long cl_mem1, long cl_gl_object_typePtr1, long cl_GLuintPtr1) {
462        return getImplementation(cl_mem1).clGetGLObjectInfo(cl_mem1, cl_gl_object_typePtr1, cl_GLuintPtr1); //To change body of generated methods, choose Tools | Templates.
463    }
464
465    @Override
466    public int clGetGLTextureInfo(long cl_mem1, int cl_gl_texture_info1, long size_t1, long voidPtr1, long size_tPtr1) {
467        return getImplementation(cl_mem1).clGetGLTextureInfo(cl_mem1, cl_gl_texture_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
468    }
469
470    @Override
471    public int clGetImageInfo(long cl_mem1, int cl_image_info1, long size_t1, long voidPtr1, long size_tPtr1) {
472        return getImplementation(cl_mem1).clGetImageInfo(cl_mem1, cl_image_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
473    }
474
475    @Override
476    public int clGetKernelArgInfo(long cl_kernel1, int cl_uint1, int cl_kernel_arg_info1, long size_t1, long voidPtr1, long size_tPtr1) {
477        return getImplementation(cl_kernel1).clGetKernelArgInfo(cl_kernel1, cl_uint1, cl_kernel_arg_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
478    }
479
480    @Override
481    public int clGetKernelInfo(long cl_kernel1, int cl_kernel_info1, long size_t1, long voidPtr1, long size_tPtr1) {
482        return getImplementation(cl_kernel1).clGetKernelInfo(cl_kernel1, cl_kernel_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
483    }
484
485    @Override
486    public int clGetKernelWorkGroupInfo(long cl_kernel1, long cl_device_id1, int cl_kernel_work_group_info1, long size_t1, long voidPtr1, long size_tPtr1) {
487        return getImplementation(cl_kernel1).clGetKernelWorkGroupInfo(cl_kernel1, cl_device_id1, cl_kernel_work_group_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
488    }
489
490    @Override
491    public int clGetMemObjectInfo(long cl_mem1, int cl_mem_info1, long size_t1, long voidPtr1, long size_tPtr1) {
492        return getImplementation(cl_mem1).clGetMemObjectInfo(cl_mem1, cl_mem_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
493    }
494
495    @Override
496    public int clGetProgramBuildInfo(long cl_program1, long cl_device_id1, int cl_program_build_info1, long size_t1, long voidPtr1, long size_tPtr1) {
497        return getImplementation(cl_program1).clGetProgramBuildInfo(cl_program1, cl_device_id1, cl_program_build_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
498    }
499
500    @Override
501    public int clGetProgramInfo(long cl_program1, int cl_program_info1, long size_t1, long voidPtr1, long size_tPtr1) {
502        return getImplementation(cl_program1).clGetProgramInfo(cl_program1, cl_program_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
503    }
504
505    @Override
506    public int clGetSamplerInfo(long cl_sampler1, int cl_sampler_info1, long size_t1, long voidPtr1, long size_tPtr1) {
507        return getImplementation(cl_sampler1).clGetSamplerInfo(cl_sampler1, cl_sampler_info1, size_t1, voidPtr1, size_tPtr1); //To change body of generated methods, choose Tools | Templates.
508    }
509
510    @Override
511    public int clGetSupportedImageFormats(long cl_context1, long cl_mem_flags1, int cl_mem_object_type1, int cl_uint1, long cl_image_formatPtr1, long cl_uintPtr1) {
512        return getImplementation(cl_context1).clGetSupportedImageFormats(cl_context1, cl_mem_flags1, cl_mem_object_type1, cl_uint1, cl_image_formatPtr1, cl_uintPtr1); //To change body of generated methods, choose Tools | Templates.
513    }
514
515    @Override
516    public int clReleaseCommandQueue(long cl_command_queue1) {
517        return getImplementation(cl_command_queue1).clReleaseCommandQueue(cl_command_queue1); //To change body of generated methods, choose Tools | Templates.
518    }
519
520    @Override
521    public int clReleaseContext(long cl_context1) {
522        return getImplementation(cl_context1).clReleaseContext(cl_context1); //To change body of generated methods, choose Tools | Templates.
523    }
524
525    @Override
526    public int clReleaseDevice(long cl_device_id1) {
527        return getImplementation(cl_device_id1).clReleaseDevice(cl_device_id1); //To change body of generated methods, choose Tools | Templates.
528    }
529
530    @Override
531    public int clReleaseDeviceEXT(long cl_device_id1) {
532        return getImplementation(cl_device_id1).clReleaseDeviceEXT(cl_device_id1); //To change body of generated methods, choose Tools | Templates.
533    }
534
535    @Override
536    public int clReleaseEvent(long cl_event1) {
537        return getImplementation(cl_event1).clReleaseEvent(cl_event1); //To change body of generated methods, choose Tools | Templates.
538    }
539
540    @Override
541    public int clReleaseKernel(long cl_kernel1) {
542        return getImplementation(cl_kernel1).clReleaseKernel(cl_kernel1); //To change body of generated methods, choose Tools | Templates.
543    }
544
545    @Override
546    public int clReleaseMemObject(long cl_mem1) {
547        return getImplementation(cl_mem1).clReleaseMemObject(cl_mem1); //To change body of generated methods, choose Tools | Templates.
548    }
549
550    @Override
551    public int clReleaseProgram(long cl_program1) {
552        return getImplementation(cl_program1).clReleaseProgram(cl_program1); //To change body of generated methods, choose Tools | Templates.
553    }
554
555    @Override
556    public int clReleaseSampler(long cl_sampler1) {
557        return getImplementation(cl_sampler1).clReleaseSampler(cl_sampler1); //To change body of generated methods, choose Tools | Templates.
558    }
559
560    @Override
561    public int clRetainCommandQueue(long cl_command_queue1) {
562        return getImplementation(cl_command_queue1).clRetainCommandQueue(cl_command_queue1); //To change body of generated methods, choose Tools | Templates.
563    }
564
565    @Override
566    public int clRetainContext(long cl_context1) {
567        return getImplementation(cl_context1).clRetainContext(cl_context1); //To change body of generated methods, choose Tools | Templates.
568    }
569
570    @Override
571    public int clRetainDevice(long cl_device_id1) {
572        return getImplementation(cl_device_id1).clRetainDevice(cl_device_id1); //To change body of generated methods, choose Tools | Templates.
573    }
574
575    @Override
576    public int clRetainDeviceEXT(long cl_device_id1) {
577        return getImplementation(cl_device_id1).clRetainDeviceEXT(cl_device_id1); //To change body of generated methods, choose Tools | Templates.
578    }
579
580    @Override
581    public int clRetainEvent(long cl_event1) {
582        return getImplementation(cl_event1).clRetainEvent(cl_event1); //To change body of generated methods, choose Tools | Templates.
583    }
584
585    @Override
586    public int clRetainKernel(long cl_kernel1) {
587        return getImplementation(cl_kernel1).clRetainKernel(cl_kernel1); //To change body of generated methods, choose Tools | Templates.
588    }
589
590    @Override
591    public int clRetainMemObject(long cl_mem1) {
592        return getImplementation(cl_mem1).clRetainMemObject(cl_mem1); //To change body of generated methods, choose Tools | Templates.
593    }
594
595    @Override
596    public int clRetainProgram(long cl_program1) {
597        return getImplementation(cl_program1).clRetainProgram(cl_program1); //To change body of generated methods, choose Tools | Templates.
598    }
599
600    @Override
601    public int clRetainSampler(long cl_sampler1) {
602        return getImplementation(cl_sampler1).clRetainSampler(cl_sampler1); //To change body of generated methods, choose Tools | Templates.
603    }
604
605    @Override
606    public int clSetCommandQueueProperty(long cl_command_queue1, long cl_command_queue_properties1, int cl_bool1, long cl_command_queue_propertiesPtr1) {
607        return getImplementation(cl_command_queue1).clSetCommandQueueProperty(cl_command_queue1, cl_command_queue_properties1, cl_bool1, cl_command_queue_propertiesPtr1); //To change body of generated methods, choose Tools | Templates.
608    }
609
610    @Override
611    public int clSetEventCallback(long cl_event1, int cl_int1, long arg1, long voidPtr1) {
612        return getImplementation(cl_event1).clSetEventCallback(cl_event1, cl_int1, arg1, voidPtr1); //To change body of generated methods, choose Tools | Templates.
613    }
614
615    @Override
616    public int clSetKernelArg(long cl_kernel1, int cl_uint1, long size_t1, long voidPtr1) {
617        return getImplementation(cl_kernel1).clSetKernelArg(cl_kernel1, cl_uint1, size_t1, voidPtr1); //To change body of generated methods, choose Tools | Templates.
618    }
619
620    @Override
621    public int clSetMemObjectDestructorCallback(long cl_mem1, long arg1, long voidPtr1) {
622        return getImplementation(cl_mem1).clSetMemObjectDestructorCallback(cl_mem1, arg1, voidPtr1); //To change body of generated methods, choose Tools | Templates.
623    }
624
625    @Override
626    public int clSetUserEventStatus(long cl_event1, int cl_int1) {
627        return getImplementation(cl_event1).clSetUserEventStatus(cl_event1, cl_int1); //To change body of generated methods, choose Tools | Templates.
628    }
629
630    @Override
631    public int clUnloadCompiler() {
632        for (IOpenCLLibrary implementation : implementations) {
633            int res = implementation.clUnloadCompiler();
634            if (res != CL_SUCCESS)
635                return res;
636        }
637        return CL_SUCCESS;
638    }
639
640    @Override
641    public int clUnloadPlatformCompiler(long cl_platform_id1) {
642        return getImplementation(cl_platform_id1).clUnloadPlatformCompiler(cl_platform_id1); //To change body of generated methods, choose Tools | Templates.
643    }
644
645    @Override
646    public int clWaitForEvents(int cl_uint1, long cl_eventPtr1) {
647        throw new UnsupportedOperationException();
648    }
649    
650}