diff options
author | Wade Walker <[email protected]> | 2015-09-19 15:20:23 -0500 |
---|---|---|
committer | Wade Walker <[email protected]> | 2015-11-08 14:05:29 -0600 |
commit | 4638f4b3fdf4c946bda0b290a83652e4db00edea (patch) | |
tree | 7d027b893fbf1d55d578e2f156186075a092810c /make/config | |
parent | 9a90181ed1fb596275fee9ebca0f3d1093722ca9 (diff) |
Factor out common custom C and Java code to reduce duplication
Consolidated C custom code so common functions are only defined once in
the 1.1 version, then are called from the 1.2 and 2.0 version. Pulled
common code in CLImpl up into the autogenerated implementation class and
removed the hand-written implementation (since it was left empty).
Factored custom Java code out so there was as little duplication as
possible across the three CLImpl versions, with common code for all
three versions in clImplCustomCode.java.
Diffstat (limited to 'make/config')
-rw-r--r-- | make/config/cl-impl-11.cfg | 30 | ||||
-rw-r--r-- | make/config/cl-impl-12.cfg | 31 | ||||
-rw-r--r-- | make/config/cl-impl-20.cfg | 31 | ||||
-rw-r--r-- | make/config/clImplCustomCode.c | 31 | ||||
-rw-r--r-- | make/config/clImplCustomCode.java | 258 | ||||
-rw-r--r-- | make/config/clImplCustomCode11.c | 2 | ||||
-rw-r--r-- | make/config/clImplCustomCode11.java | 55 | ||||
-rw-r--r-- | make/config/clImplCustomCode12.c | 317 | ||||
-rw-r--r-- | make/config/clImplCustomCode12.java | 54 | ||||
-rw-r--r-- | make/config/clImplCustomCode20.c | 317 | ||||
-rw-r--r-- | make/config/clImplCustomCode20.java | 54 |
11 files changed, 398 insertions, 782 deletions
diff --git a/make/config/cl-impl-11.cfg b/make/config/cl-impl-11.cfg index 9a49ea64..34d48424 100644 --- a/make/config/cl-impl-11.cfg +++ b/make/config/cl-impl-11.cfg @@ -7,15 +7,22 @@ Style ImplOnly Import com.jogamp.opencl.llb.gl.CLGL Import java.security.AccessController Import java.security.PrivilegedAction - -ClassJavadoc CLAbstractImpl11 /** -ClassJavadoc CLAbstractImpl11 * Java bindings to OpenCL, the Open Computing Language (generated). -ClassJavadoc CLAbstractImpl11 * @author Michael Bien, GlueGen, et al. -ClassJavadoc CLAbstractImpl11 */ - -ImplJavaClass CLAbstractImpl11 -AccessControl CLAbstractImpl11 PUBLIC_ABSTRACT -Implements CLAbstractImpl11 CLGL +Import com.jogamp.common.nio.PointerBuffer +Import com.jogamp.common.util.LongLongHashMap +Import com.jogamp.opencl.CLErrorHandler +Import com.jogamp.opencl.CLException +Import java.nio.ByteBuffer +Import java.nio.IntBuffer +Import com.jogamp.common.nio.Buffers + +ClassJavadoc CLImpl11 /** +ClassJavadoc CLImpl11 * Java bindings to OpenCL, the Open Computing Language (generated). +ClassJavadoc CLImpl11 * @author Michael Bien, GlueGen, et al. +ClassJavadoc CLImpl11 */ + +ImplJavaClass CLImpl11 +AccessControl CLImpl11 PUBLIC +Implements CLImpl11 CLGL LocalProcAddressCallingConvention __ALL__ CL_API_CALL @@ -93,7 +100,8 @@ ManuallyImplement clEnqueueMapImage ForceProcAddressGen clEnqueueMapImage #include custom code -IncludeAs CustomJavaCode CLAbstractImpl11 clImplCustomCode11.java -ManualStaticInitCall CLAbstractImpl11 +IncludeAs CustomJavaCode CLImpl11 clImplCustomCode11.java +IncludeAs CustomJavaCode CLImpl11 clImplCustomCode.java +ManualStaticInitCall CLImpl11 IncludeAs CustomCCode clImplCustomCode11.c diff --git a/make/config/cl-impl-12.cfg b/make/config/cl-impl-12.cfg index 01b9ea28..2f8e8dd1 100644 --- a/make/config/cl-impl-12.cfg +++ b/make/config/cl-impl-12.cfg @@ -7,15 +7,22 @@ Style ImplOnly Import com.jogamp.opencl.llb.gl.CLGL Import java.security.AccessController Import java.security.PrivilegedAction - -ClassJavadoc CLAbstractImpl12 /** -ClassJavadoc CLAbstractImpl12 * Java bindings to OpenCL, the Open Computing Language (generated). -ClassJavadoc CLAbstractImpl12 * @author Michael Bien, GlueGen, et al. -ClassJavadoc CLAbstractImpl12 */ - -ImplJavaClass CLAbstractImpl12 -AccessControl CLAbstractImpl12 PUBLIC_ABSTRACT -Implements CLAbstractImpl12 CLGL +Import com.jogamp.common.nio.PointerBuffer +Import com.jogamp.common.util.LongLongHashMap +Import com.jogamp.opencl.CLErrorHandler +Import com.jogamp.opencl.CLException +Import java.nio.ByteBuffer +Import java.nio.IntBuffer +Import com.jogamp.common.nio.Buffers + +ClassJavadoc CLImpl12 /** +ClassJavadoc CLImpl12 * Java bindings to OpenCL, the Open Computing Language (generated). +ClassJavadoc CLImpl12 * @author Michael Bien, GlueGen, et al. +ClassJavadoc CLImpl12 */ + +ImplJavaClass CLImpl12 +AccessControl CLImpl12 PUBLIC +Implements CLImpl12 CLGL LocalProcAddressCallingConvention __ALL__ CL_API_CALL @@ -99,7 +106,9 @@ ManuallyImplement clEnqueueMapImage ForceProcAddressGen clEnqueueMapImage #include custom code -IncludeAs CustomJavaCode CLAbstractImpl12 clImplCustomCode12.java -ManualStaticInitCall CLAbstractImpl12 +IncludeAs CustomJavaCode CLImpl12 clImplCustomCode12.java +IncludeAs CustomJavaCode CLImpl12 clImplCustomCode.java +ManualStaticInitCall CLImpl12 +IncludeAs CustomCCode clImplCustomCode.c IncludeAs CustomCCode clImplCustomCode12.c diff --git a/make/config/cl-impl-20.cfg b/make/config/cl-impl-20.cfg index 5b0a9125..8f8358ed 100644 --- a/make/config/cl-impl-20.cfg +++ b/make/config/cl-impl-20.cfg @@ -7,15 +7,22 @@ Style ImplOnly Import com.jogamp.opencl.llb.gl.CLGL Import java.security.AccessController Import java.security.PrivilegedAction - -ClassJavadoc CLAbstractImpl20 /** -ClassJavadoc CLAbstractImpl20 * Java bindings to OpenCL, the Open Computing Language (generated). -ClassJavadoc CLAbstractImpl20 * @author Michael Bien, GlueGen, et al. -ClassJavadoc CLAbstractImpl20 */ - -ImplJavaClass CLAbstractImpl20 -AccessControl CLAbstractImpl20 PUBLIC_ABSTRACT -Implements CLAbstractImpl20 CLGL +Import com.jogamp.common.nio.PointerBuffer +Import com.jogamp.common.util.LongLongHashMap +Import com.jogamp.opencl.CLErrorHandler +Import com.jogamp.opencl.CLException +Import java.nio.ByteBuffer +Import java.nio.IntBuffer +Import com.jogamp.common.nio.Buffers + +ClassJavadoc CLImpl20 /** +ClassJavadoc CLImpl20 * Java bindings to OpenCL, the Open Computing Language (generated). +ClassJavadoc CLImpl20 * @author Michael Bien, GlueGen, et al. +ClassJavadoc CLImpl20 */ + +ImplJavaClass CLImpl20 +AccessControl CLImpl20 PUBLIC +Implements CLImpl20 CLGL LocalProcAddressCallingConvention __ALL__ CL_API_CALL @@ -99,7 +106,9 @@ ManuallyImplement clEnqueueMapImage ForceProcAddressGen clEnqueueMapImage #include custom code -IncludeAs CustomJavaCode CLAbstractImpl20 clImplCustomCode20.java -ManualStaticInitCall CLAbstractImpl20 +IncludeAs CustomJavaCode CLImpl20 clImplCustomCode20.java +IncludeAs CustomJavaCode CLImpl20 clImplCustomCode.java +ManualStaticInitCall CLImpl20 +IncludeAs CustomCCode clImplCustomCode.c IncludeAs CustomCCode clImplCustomCode20.c diff --git a/make/config/clImplCustomCode.c b/make/config/clImplCustomCode.c new file mode 100644 index 00000000..30c55363 --- /dev/null +++ b/make/config/clImplCustomCode.c @@ -0,0 +1,31 @@ +// Extern declarations of functions. The earliest version of OpenCL defines them, and the later versions use them. + +extern JNIEXPORT jlong JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_dispatch_1clGetExtensionFunctionAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress); + +extern JNIEXPORT jlong JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_clCreateContextFromType0(JNIEnv *env, jobject _unused, jobject props, jint props_byte_offset, jlong device_type, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress); + +extern JNIEXPORT jlong JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_clCreateContext0(JNIEnv *env, jobject _unused, jobject props, jint props_byte_offset, jint numDevices, jobject deviceList, jint device_type_offset, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress); + +extern JNIEXPORT jint JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_clReleaseContextImpl(JNIEnv *env, jobject _unused, jlong context, jlong global, jlong procAddress); + +extern JNIEXPORT jint JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_clBuildProgram0(JNIEnv *env, jobject _unused, jlong program, jint deviceCount, jobject deviceList, jint device_type_offset, jstring options, jobject cb, jlong procAddress); + +extern JNIEXPORT jobject JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_clEnqueueMapImage0__JJIJLjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2IILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2I(JNIEnv *env, jobject _unused, + jlong command_queue, jlong image, jint blocking_map, jlong map_flags, + jobject origin, jint origin_byte_offset, jobject range, jint range_byte_offset, + jobject image_row_pitch, jint image_row_pitch_byte_offset, jobject image_slice_pitch, + jint image_slice_pitch_byte_offset, jint num_events_in_wait_list, jobject event_wait_list, + jint event_wait_list_byte_offset, jobject event, jint event_byte_offset, jobject errcode_ret, jint errcode_ret_byte_offset, + jlong imageInfoAddress, jlong mapImageAddress); + +extern JNIEXPORT jint JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_clSetEventCallback0(JNIEnv *env, jobject _unused, jlong event, jint trigger, jobject listener, jlong procAddress); + +extern JNIEXPORT jint JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_clSetMemObjectDestructorCallback0(JNIEnv *env, jobject _unused, jlong mem, jobject listener, jlong procAddress); diff --git a/make/config/clImplCustomCode.java b/make/config/clImplCustomCode.java new file mode 100644 index 00000000..a863bffb --- /dev/null +++ b/make/config/clImplCustomCode.java @@ -0,0 +1,258 @@ +/** If null, OpenCL is not available on this machine. */ + static final DynamicLibraryBundle dynamicLookupHelper; + + static { + dynamicLookupHelper = AccessController.doPrivileged(new PrivilegedAction<DynamicLibraryBundle>() { + public DynamicLibraryBundle run() { + final DynamicLibraryBundle bundle = new DynamicLibraryBundle(new CLDynamicLibraryBundleInfo()); + if(!bundle.isToolLibLoaded()) { + // couldn't load native CL library + // TODO: log this? + return null; + } + if(!bundle.isLibComplete()) { + System.err.println("Couln't load native CL/JNI glue library"); + return null; + } + addressTable.reset(bundle); + /** Not required nor forced + if( !initializeImpl() ) { + System.err.println("Native initialization failure of CL/JNI glue library"); + return null; + } */ + return bundle; + } } ); + } + + // maps the context id to its error handler's global object pointer + private final LongLongHashMap contextCallbackMap = new LongLongHashMap(); + + // to use in subclass constructors + protected void init() { + this.contextCallbackMap.setKeyNotFoundValue(0); + } + + /** + * Accessor. + * @returns true if OpenCL is available on this machine. + */ + public static boolean isAvailable() { return dynamicLookupHelper != null; } + + static long clGetExtensionFunctionAddress(long clGetExtensionFunctionAddressHandle, java.lang.String procname) + { + if (clGetExtensionFunctionAddressHandle == 0) { + throw new RuntimeException("Passed null pointer for method \"clGetExtensionFunctionAddress\""); + } + return dispatch_clGetExtensionFunctionAddressStatic(procname, clGetExtensionFunctionAddressHandle); + } + + /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ + long clGetExtensionFunctionAddress(String fname) { + + final long __addr_ = addressTable._addressof_clGetExtensionFunctionAddress; + if (__addr_ == 0) { + throw new UnsupportedOperationException("Method \"clGetExtensionFunctionAddress\" not available"); + } + return dispatch_clGetExtensionFunctionAddressStatic(fname, __addr_); + } + + /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ + private static native long dispatch_clGetExtensionFunctionAddressStatic(String fname, long procAddress); + + @Override + public long clCreateContext(final PointerBuffer properties, final PointerBuffer devices, final CLErrorHandler pfn_notify, final IntBuffer errcode_ret) { + + if (properties != null && !properties.isDirect()) { + throw new RuntimeException("Argument \"properties\" was not a direct buffer"); + } + + if (errcode_ret != null && !errcode_ret.isDirect()) { + throw new RuntimeException("Argument \"errcode_ret\" was not a direct buffer"); + } + + final long address = addressTable._addressof_clCreateContext; + if (address == 0) { + throw new UnsupportedOperationException("Method not available"); + } + + final long[] global = new long[1]; + final long ctx = this.clCreateContext0( + properties != null ? properties.getBuffer() : null, Buffers.getDirectBufferByteOffset(properties), + devices != null ? devices.remaining() : 0, devices != null ? devices.getBuffer() : null, Buffers.getDirectBufferByteOffset(devices), + pfn_notify, global, errcode_ret, Buffers.getDirectBufferByteOffset(errcode_ret), address); + + if (pfn_notify != null && global[0] != 0) { + synchronized (contextCallbackMap) { + contextCallbackMap.put(ctx, global[0]); + } + } + return ctx; + } + + private native long clCreateContext0(Object cl_context_properties, int props_offset, int numDevices, Object devices, int devices_offset, Object pfn_notify, long[] global, Object errcode_ret, int err_offset, long address); + + @Override + public long clCreateContextFromType(final PointerBuffer properties, final long device_type, final CLErrorHandler pfn_notify, final IntBuffer errcode_ret) { + if (properties != null && !properties.isDirect()) { + throw new RuntimeException("Argument \"properties\" was not a direct buffer"); + } + + if (errcode_ret != null && !errcode_ret.isDirect()) { + throw new RuntimeException("Argument \"errcode_ret\" was not a direct buffer"); + } + + final long address = addressTable._addressof_clCreateContextFromType; + if (address == 0) { + throw new UnsupportedOperationException("Method not available"); + } + + final long[] global = new long[1]; + final long ctx = this.clCreateContextFromType0( + properties != null ? properties.getBuffer() : null, Buffers.getDirectBufferByteOffset(properties), + device_type, pfn_notify, global, errcode_ret, Buffers.getDirectBufferByteOffset(errcode_ret), address); + + if (pfn_notify != null && global[0] != 0) { + synchronized (contextCallbackMap) { + contextCallbackMap.put(ctx, global[0]); + } + } + return ctx; + } + + private native long clCreateContextFromType0(Object properties, int props_offset, long device_type, Object pfn_notify, long[] global, Object errcode_ret, int err_offset, long address); + + @Override + public int clReleaseContext(final long context) { + long global = 0; + synchronized (contextCallbackMap) { + global = contextCallbackMap.remove(context); + } + + final long address = addressTable._addressof_clReleaseContext; + if (address == 0) { + throw new UnsupportedOperationException("Method not available"); + } + return clReleaseContextImpl(context, global, address); + } + + /** Interface to C language function: <br> <code> int32_t {@native clReleaseContext}(cl_context context); </code> */ + public native int clReleaseContextImpl(long context, long global, long address); + + /** Interface to C language function: <br> <code> int32_t clBuildProgram(cl_program, uint32_t, cl_device_id * , const char * , void * ); </code> */ + @Override + public int clBuildProgram(final long program, final int deviceCount, final PointerBuffer deviceList, final String options, final BuildProgramCallback cb) { + if (deviceList != null && !deviceList.isDirect()) { + throw new RuntimeException("Argument \"properties\" was not a direct buffer"); + } + + final long address = addressTable._addressof_clBuildProgram; + if (address == 0) { + throw new UnsupportedOperationException("Method not available"); + } + return clBuildProgram0(program, deviceCount, deviceList != null ? deviceList.getBuffer() : null, + Buffers.getDirectBufferByteOffset(deviceList), options, cb, address); + } + + /** Entry point to C language function: <code> int32_t clBuildProgram(cl_program, uint32_t, cl_device_id * , const char * , void * ); </code> */ + private native int clBuildProgram0(long program, int deviceCount, Object deviceList, int deviceListOffset, String options, BuildProgramCallback cb, long address); + + + @Override + public int clSetEventCallback(final long event, final int trigger, final CLEventCallback callback) { + final long address = addressTable._addressof_clSetEventCallback; + if (address == 0) { + throw new UnsupportedOperationException("Method not available"); + } + return clSetEventCallback0(event, trigger, callback, address); + } + + private native int clSetEventCallback0(long event, int type, CLEventCallback cb, long address); + + + @Override + public int clSetMemObjectDestructorCallback(final long memObjID, final CLMemObjectDestructorCallback cb) { + final long address = addressTable._addressof_clSetMemObjectDestructorCallback; + if (address == 0) { + throw new UnsupportedOperationException("Method not available"); + } + return clSetMemObjectDestructorCallback0(memObjID, cb, address); + } + + private native int clSetMemObjectDestructorCallback0(long memObjID, CLMemObjectDestructorCallback cb, long address); + + + /** Interface to C language function: <br> <code> void * {@native clEnqueueMapImage}(cl_command_queue command_queue, cl_mem image, uint32_t blocking_map, uint64_t map_flags, const size_t * , const size_t * , size_t * image_row_pitch, size_t * image_slice_pitch, uint32_t num_events_in_wait_list, cl_event * event_wait_list, cl_event * event, int32_t * errcode_ret); </code> + @param origin a direct {@link com.jogamp.common.nio.PointerBuffer} + @param range a direct {@link com.jogamp.common.nio.PointerBuffer} + @param image_row_pitch a direct {@link com.jogamp.common.nio.PointerBuffer} + @param image_slice_pitch a direct {@link com.jogamp.common.nio.PointerBuffer} + @param event_wait_list a direct {@link com.jogamp.common.nio.PointerBuffer} + @param event a direct {@link com.jogamp.common.nio.PointerBuffer} + @param errcode_ret a direct {@link java.nio.IntBuffer} */ + @Override + public ByteBuffer clEnqueueMapImage(final long command_queue, final long image, final int blocking_map, final long map_flags, + final PointerBuffer origin, final PointerBuffer range, + final PointerBuffer image_row_pitch, final PointerBuffer image_slice_pitch, + final int num_events_in_wait_list, + final PointerBuffer event_wait_list, final PointerBuffer event, final IntBuffer errcode_ret) { + + if (origin != null && !origin.isDirect()) { + throw new CLException("Argument \"origin\" was not a direct buffer"); + } + if (range != null && !range.isDirect()) { + throw new CLException("Argument \"range\" was not a direct buffer"); + } + if (image_row_pitch != null && !image_row_pitch.isDirect()) { + throw new CLException("Argument \"image_row_pitch\" was not a direct buffer"); + } + if (image_slice_pitch != null && !image_slice_pitch.isDirect()) { + throw new CLException("Argument \"image_slice_pitch\" was not a direct buffer"); + } + if (event_wait_list != null && !event_wait_list.isDirect()) { + throw new CLException("Argument \"event_wait_list\" was not a direct buffer"); + } + if (event != null && !event.isDirect()) { + throw new CLException("Argument \"event\" was not a direct buffer"); + } + if (errcode_ret != null && !errcode_ret.isDirect()) { + throw new CLException("Argument \"errcode_ret\" was not a direct buffer"); + } + + final long getImageInfoAddress = addressTable._addressof_clGetImageInfo; + if (getImageInfoAddress == 0) { + throw new UnsupportedOperationException("Method not available"); + } + final long mapImageAddress = addressTable._addressof_clEnqueueMapImage; + if (mapImageAddress == 0) { + throw new UnsupportedOperationException("Method not available"); + } + ByteBuffer _res; + _res = clEnqueueMapImage0(command_queue, image, blocking_map, map_flags, origin != null ? origin.getBuffer() : null, + Buffers.getDirectBufferByteOffset(origin), range != null ? range.getBuffer() : null, + Buffers.getDirectBufferByteOffset(range), image_row_pitch != null ? image_row_pitch.getBuffer() : null, + Buffers.getDirectBufferByteOffset(image_row_pitch), image_slice_pitch != null ? image_slice_pitch.getBuffer() : null, + Buffers.getDirectBufferByteOffset(image_slice_pitch), num_events_in_wait_list, + event_wait_list != null ? event_wait_list.getBuffer() : null, Buffers.getDirectBufferByteOffset(event_wait_list), + event != null ? event.getBuffer() : null, Buffers.getDirectBufferByteOffset(event), errcode_ret, + Buffers.getDirectBufferByteOffset(errcode_ret), getImageInfoAddress, mapImageAddress); + if (_res == null) { + return null; + } + Buffers.nativeOrder(_res); + return _res; + } + + /** Entry point to C language function: <code> void * {@native clEnqueueMapImage}(cl_command_queue command_queue, cl_mem image, uint32_t blocking_map, uint64_t map_flags, const size_t * , const size_t * , size_t * image_row_pitch, size_t * image_slice_pitch, uint32_t num_events_in_wait_list, cl_event * event_wait_list, cl_event * event, int32_t * errcode_ret); </code> + @param origin a direct {@link com.jogamp.common.nio.PointerBuffer} + @param range a direct {@link com.jogamp.common.nio.PointerBuffer} + @param image_row_pitch a direct {@link com.jogamp.common.nio.PointerBuffer} + @param image_slice_pitch a direct {@link com.jogamp.common.nio.PointerBuffer} + @param event_wait_list a direct {@link com.jogamp.common.nio.PointerBuffer} + @param event a direct {@link com.jogamp.common.nio.PointerBuffer} + @param errcode_ret a direct {@link java.nio.IntBuffer} */ + private native ByteBuffer clEnqueueMapImage0(long command_queue, long image, int blocking_map, long map_flags, + Object origin, int origin_byte_offset, Object range, int range_byte_offset, Object image_row_pitch, + int image_row_pitch_byte_offset, Object image_slice_pitch, int image_slice_pitch_byte_offset, + int num_events_in_wait_list, Object event_wait_list, int event_wait_list_byte_offset, Object event, + int event_byte_offset, Object errcode_ret, int errcode_ret_byte_offset, + long getImageInfoAddress, long mapImageAddress);
\ No newline at end of file diff --git a/make/config/clImplCustomCode11.c b/make/config/clImplCustomCode11.c index 1e772d9e..243e73cb 100644 --- a/make/config/clImplCustomCode11.c +++ b/make/config/clImplCustomCode11.c @@ -115,7 +115,7 @@ CL_CALLBACK void memObjDestructorCallback(cl_mem mem, void * object) { // extern CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddress(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; JNIEXPORT jlong JNICALL -Java_com_jogamp_opencl_llb_impl_CLAbstractImpl11_dispatch_1clGetExtensionFunctionAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress) { +Java_com_jogamp_opencl_llb_impl_CLImpl11_dispatch_1clGetExtensionFunctionAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress) { typedef void* (CL_API_CALL * _local_LPCLGETPROCADDRESS)(const char * fname); _local_LPCLGETPROCADDRESS ptr_clGetExtensionFunctionAddress; const char* _strchars_fname = NULL; diff --git a/make/config/clImplCustomCode11.java b/make/config/clImplCustomCode11.java index 0dcb770f..bc1cfdda 100644 --- a/make/config/clImplCustomCode11.java +++ b/make/config/clImplCustomCode11.java @@ -1,60 +1,11 @@ - - /** If null, OpenCL is not available on this machine. */ - static final DynamicLibraryBundle dynamicLookupHelper; protected static final CLProcAddressTable11 addressTable; static { addressTable = new CLProcAddressTable11(); - dynamicLookupHelper = AccessController.doPrivileged(new PrivilegedAction<DynamicLibraryBundle>() { - public DynamicLibraryBundle run() { - final DynamicLibraryBundle bundle = new DynamicLibraryBundle(new CLDynamicLibraryBundleInfo()); - if(!bundle.isToolLibLoaded()) { - // couldn't load native CL library - // TODO: log this? - return null; - } - if(!bundle.isLibComplete()) { - System.err.println("Couln't load native CL/JNI glue library"); - return null; - } - addressTable.reset(bundle); - /** Not required nor forced - if( !initializeImpl() ) { - System.err.println("Native initialization failure of CL/JNI glue library"); - return null; - } */ - return bundle; - } } ); - } - - /** - * Accessor. - * @returns true if OpenCL is available on this machine. - */ - public static boolean isAvailable() { return dynamicLookupHelper != null; } - public static CLProcAddressTable11 getCLProcAddressTable() { return addressTable; } - - static long clGetExtensionFunctionAddress(long clGetExtensionFunctionAddressHandle, java.lang.String procname) - { - if (clGetExtensionFunctionAddressHandle == 0) { - throw new RuntimeException("Passed null pointer for method \"clGetExtensionFunctionAddress\""); - } - return dispatch_clGetExtensionFunctionAddressStatic(procname, clGetExtensionFunctionAddressHandle); } - public CLAbstractImpl11() { - } - - /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ - long clGetExtensionFunctionAddress(String fname) { + public static CLProcAddressTable11 getAddressTable() { return addressTable; } - final long __addr_ = addressTable._addressof_clGetExtensionFunctionAddress; - if (__addr_ == 0) { - throw new UnsupportedOperationException("Method \"clGetExtensionFunctionAddress\" not available"); - } - return dispatch_clGetExtensionFunctionAddressStatic(fname, __addr_); + public CLImpl11() { + init(); } - - /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ - private static native long dispatch_clGetExtensionFunctionAddressStatic(String fname, long procAddress); - diff --git a/make/config/clImplCustomCode12.c b/make/config/clImplCustomCode12.c index bea531a1..6bdae621 100644 --- a/make/config/clImplCustomCode12.c +++ b/make/config/clImplCustomCode12.c @@ -1,224 +1,28 @@ -// callbacks -typedef void (CL_CALLBACK * cccallback)(const char *, const void *, size_t, void *); -typedef void (CL_CALLBACK * bpcallback)(cl_program, void *); - -CL_CALLBACK void buildProgramCallback(cl_program id, void * object); -CL_CALLBACK void createContextCallback(const char * errinfo, const void * private_info, size_t cb, void * object); -CL_CALLBACK void eventCallback(cl_event event, cl_int status, void * object); -CL_CALLBACK void memObjDestructorCallback(cl_mem mem, void * object); - JNIEXPORT jlong JNICALL -Java_com_jogamp_opencl_llb_impl_CLAbstractImpl12_dispatch_1clGetExtensionFunctionAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress) { - typedef void* (CL_API_CALL * _local_LPCLGETPROCADDRESS)(const char * fname); - _local_LPCLGETPROCADDRESS ptr_clGetExtensionFunctionAddress; - const char* _strchars_fname = NULL; - void* _res; - if ( NULL != fname ) { - _strchars_fname = (*env)->GetStringUTFChars(env, fname, (jboolean*)NULL); - if ( NULL == _strchars_fname ) { - (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"), - "Failed to get UTF-8 chars for argument \"fname\" in native dispatcher for \"dispatch_clGetExtensionFunctionAddress\""); - return 0; - } - } - ptr_clGetExtensionFunctionAddress = (_local_LPCLGETPROCADDRESS) (intptr_t) procAddress; - assert(ptr_clGetExtensionFunctionAddress != NULL); - _res = (* ptr_clGetExtensionFunctionAddress) (_strchars_fname); - if ( NULL != fname ) { - (*env)->ReleaseStringUTFChars(env, fname, _strchars_fname); - } - return (jlong) (intptr_t) _res; +Java_com_jogamp_opencl_llb_impl_CLImpl12_dispatch_1clGetExtensionFunctionAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_dispatch_1clGetExtensionFunctionAddressStatic(env, _unused, fname, procAddress); } -/* Java->C glue code: - * Java package: com.jogamp.opencl.impl.CLImpl - * Java method: long clCreateContextFromType(java.nio.IntBuffer props, long device_type, CreateContextCallback pfn_notify, Object userData, IntBuffer errcode_ret) - * C function: 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); - */ JNIEXPORT jlong JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl12_clCreateContextFromType0(JNIEnv *env, jobject _unused, - jobject props, jint props_byte_offset, jlong device_type, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { - - cl_context_properties* _props_ptr = NULL; - cl_int * _errcode_ptr = NULL; - cl_context _ctx = NULL; - cccallback _pfn_notify = NULL; - jobject globalCB = NULL; - - typedef cl_context (*function)(const cl_context_properties *, cl_device_type, void (*pfn_notify)(const char *, const void *, size_t, void *), void *, cl_int *); - function clCreateContextFromType = (function)(intptr_t) procAddress; - - if (props != NULL) { - _props_ptr = (cl_context_properties*) (((char*) (*env)->GetDirectBufferAddress(env, props)) + props_byte_offset); - } - - if (errcode != NULL) { - _errcode_ptr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, errcode)) + errcode_byte_offset); - } - - if (cb != NULL) { - _pfn_notify = &createContextCallback; - globalCB = (*env)->NewGlobalRef(env, cb); - } - - _ctx = (*clCreateContextFromType)(_props_ptr, (uint64_t) device_type, _pfn_notify, globalCB, _errcode_ptr); - - if(globalCB != NULL) { - jlong *g = (*env)->GetPrimitiveArrayCritical(env, global, NULL); - // if something went wrong - if(_ctx == NULL) { - g[0] = 0; - (*env)->DeleteGlobalRef(env, globalCB); - }else{ - g[0] = (jlong)globalCB; - } - (*env)->ReleasePrimitiveArrayCritical(env, global, g, 0); - } - - return (jlong) (intptr_t)_ctx; +Java_com_jogamp_opencl_llb_impl_CLImpl12_clCreateContextFromType0(JNIEnv *env, jobject _unused, jobject props, jint props_byte_offset, jlong device_type, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clCreateContextFromType0(env, _unused, props, props_byte_offset, device_type, cb, global, errcode, errcode_byte_offset, procAddress); } -/* - * Entry point to C language function: - *extern CL_API_ENTRY cl_context CL_API_CALL - *clCreateContext(cl_context_properties * properties , - * cl_uint num_devices , - * const cl_device_id * devices , - * void (*pfn_notify)(const char *, const void *, size_t, void *) pfn_notify , - * void * user_data , - * cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0; - */ JNIEXPORT jlong JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl12_clCreateContext0(JNIEnv *env, jobject _unused, - jobject props, jint props_byte_offset, jint numDevices, jobject deviceList, jint device_type_offset, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { - - cl_context_properties* _props_ptr = NULL; - cl_int * _errcode_ptr = NULL; - cl_device_id * _deviceListPtr = NULL; - cl_context _ctx = NULL; - cccallback _pfn_notify = NULL; - jobject globalCB = NULL; - - typedef cl_context (CL_API_CALL * function)(cl_context_properties *, cl_uint, const cl_device_id *, void (*pfn_notify)(const char *, const void *, size_t, void *), void *, cl_int *); - function clCreateContext = (function)(intptr_t) procAddress; - - if (props != NULL) { - _props_ptr = (cl_context_properties*) (((char*) (*env)->GetDirectBufferAddress(env, props)) + props_byte_offset); - } - if (deviceList != NULL) { - _deviceListPtr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, deviceList)) + device_type_offset); - } - if (errcode != NULL) { - _errcode_ptr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, errcode)) + errcode_byte_offset); - } - - if (cb != NULL) { - _pfn_notify = &createContextCallback; - globalCB = (*env)->NewGlobalRef(env, cb); - } - - _ctx = (*clCreateContext)(_props_ptr, numDevices, _deviceListPtr, _pfn_notify, globalCB, _errcode_ptr); - - if(globalCB != NULL) { - jlong *g = (*env)->GetPrimitiveArrayCritical(env, global, NULL); - // if something went wrong - if(_ctx == NULL) { - g[0] = 0; - (*env)->DeleteGlobalRef(env, globalCB); - }else{ - g[0] = (jlong)globalCB; - } - (*env)->ReleasePrimitiveArrayCritical(env, global, g, 0); - } - - return (jlong) (intptr_t)_ctx; +Java_com_jogamp_opencl_llb_impl_CLImpl12_clCreateContext0(JNIEnv *env, jobject _unused, jobject props, jint props_byte_offset, jint numDevices, jobject deviceList, jint device_type_offset, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clCreateContext0(env, _unused, props, props_byte_offset, numDevices, deviceList, device_type_offset, cb, global, errcode, errcode_byte_offset, procAddress); } -/* Java->C glue code: - * Java package: com.jogamp.opencl.impl.CLImpl - * Java method: int clReleaseContextImpl(long context) - * C function: int32_t clReleaseContextImpl(cl_context context); - */ JNIEXPORT jint JNICALL Java_com_jogamp_opencl_llb_impl_CLImpl12_clReleaseContextImpl(JNIEnv *env, jobject _unused, jlong context, jlong global, jlong procAddress) { - - int32_t _res; - typedef int32_t (*function)(cl_context); - function clReleaseContext = (function)(intptr_t) procAddress; - - _res = (*clReleaseContext)((cl_context) (intptr_t) context); - // TODO deal with retains - if (global != 0) { - (*env)->DeleteGlobalRef(env, (jobject) global); - } - return _res; + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clReleaseContextImpl(env, _unused, context, global, procAddress); } - -/** - * Entry point to C language function: - * extern CL_API_ENTRY cl_int CL_API_CALL - *clBuildProgram(cl_program program , - * cl_uint num_devices , - * const cl_device_id * device_list , - * const char * options , - * void (*pfn_notify)(cl_program program , void * user_data ), - * void * user_data ) CL_API_SUFFIX__VERSION_1_0; - */ JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl12_clBuildProgram0(JNIEnv *env, jobject _unused, - jlong program, jint deviceCount, jobject deviceList, jint device_type_offset, jstring options, jobject cb, jlong procAddress) { - - const char* _strchars_options = NULL; - cl_int _res; - cl_device_id * _deviceListPtr = NULL; - bpcallback _pfn_notify = NULL; - jobject globalCB = NULL; - - typedef cl_int (CL_API_CALL * function)(cl_program, cl_uint, const cl_device_id *, const char *, void (CL_CALLBACK *)(cl_program, void *), void *); - function clBuildProgram = (function)(intptr_t)procAddress; - - if (options != NULL) { - _strchars_options = (*env)->GetStringUTFChars(env, options, (jboolean*)NULL); - if (_strchars_options == NULL) { - (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"), - "Failed to get UTF-8 chars for argument \"options\" in native dispatcher for \"clBuildProgram\""); - return CL_FALSE; - } - } - - if (deviceList != NULL) { - _deviceListPtr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, deviceList)) + device_type_offset); - } - - if (cb != NULL) { - _pfn_notify = &buildProgramCallback; - globalCB = (*env)->NewGlobalRef(env, cb); - } - - _res = (*clBuildProgram)((cl_program)(intptr_t)program, (cl_uint)deviceCount, (cl_device_id *)_deviceListPtr, _strchars_options, _pfn_notify, globalCB); - - // if something went wrong - if(_res != CL_SUCCESS && globalCB != NULL) { - (*env)->DeleteGlobalRef(env, globalCB); - } - - if (options != NULL) { - (*env)->ReleaseStringUTFChars(env, options, _strchars_options); - } - - return (jint)_res; +Java_com_jogamp_opencl_llb_impl_CLImpl12_clBuildProgram0(JNIEnv *env, jobject _unused, jlong program, jint deviceCount, jobject deviceList, jint device_type_offset, jstring options, jobject cb, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clBuildProgram0(env, _unused, program, deviceCount, deviceList, device_type_offset, options, cb, procAddress); } -/* Java->C glue code: - * Java package: com.jogamp.opencl.impl.CLImpl - * Java method: java.nio.ByteBuffer clEnqueueMapImage(long command_queue, long image, int blocking_map, long map_flags, com.jogamp.gluegen.common.nio.PointerBuffer origin, com.jogamp.gluegen.common.nio.PointerBuffer range, com.jogamp.gluegen.common.nio.PointerBuffer image_row_pitch, com.jogamp.gluegen.common.nio.PointerBuffer image_slice_pitch, int num_events_in_wait_list, com.jogamp.gluegen.common.nio.PointerBuffer event_wait_list, com.jogamp.gluegen.common.nio.PointerBuffer event, java.nio.IntBuffer errcode_ret) - * C function: void * clEnqueueMapImage(cl_command_queue command_queue, cl_mem image, uint32_t blocking_map, uint64_t map_flags, const size_t * , const size_t * , size_t * image_row_pitch, size_t * image_slice_pitch, uint32_t num_events_in_wait_list, cl_event * event_wait_list, cl_event * event, int32_t * errcode_ret); - */ JNIEXPORT jobject JNICALL Java_com_jogamp_opencl_llb_impl_CLImpl12_clEnqueueMapImage0__JJIJLjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2IILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2I(JNIEnv *env, jobject _unused, jlong command_queue, jlong image, jint blocking_map, jlong map_flags, @@ -227,102 +31,21 @@ Java_com_jogamp_opencl_llb_impl_CLImpl12_clEnqueueMapImage0__JJIJLjava_lang_Obje jint image_slice_pitch_byte_offset, jint num_events_in_wait_list, jobject event_wait_list, jint event_wait_list_byte_offset, jobject event, jint event_byte_offset, jobject errcode_ret, jint errcode_ret_byte_offset, jlong imageInfoAddress, jlong mapImageAddress) { - - size_t * _origin_ptr = NULL; - size_t * _range_ptr = NULL; - size_t * _image_row_pitch_ptr = NULL; - size_t * _image_slice_pitch_ptr = NULL; - cl_event * _event_wait_list_ptr = NULL; - cl_event * _event_ptr = NULL; - int32_t * _errcode_ret_ptr = NULL; - size_t * elements = NULL; - size_t * depth = NULL; - size_t pixels; - cl_int status; - - typedef int32_t (*imageInfoFunctionType)(cl_mem, uint32_t, size_t, void *, size_t *); - imageInfoFunctionType clGetImageInfo = (imageInfoFunctionType)(intptr_t)imageInfoAddress; - - typedef void* (*mapInfoFunctionType)(cl_command_queue, cl_mem, uint32_t, uint64_t, const size_t *, - const size_t *, size_t *, size_t *, uint32_t, cl_event *, cl_event *, int32_t *); - mapInfoFunctionType clEnqueueMapImage = (mapInfoFunctionType)(intptr_t)mapImageAddress; - - void * _res; - - if (origin != NULL) { - _origin_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, origin)) + origin_byte_offset); - } - if (range != NULL) { - _range_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, range)) + range_byte_offset); - } - if (image_row_pitch != NULL) { - _image_row_pitch_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, image_row_pitch)) + image_row_pitch_byte_offset); - } - if (image_slice_pitch != NULL) { - _image_slice_pitch_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, image_slice_pitch)) + image_slice_pitch_byte_offset); - } - if (event_wait_list != NULL) { - _event_wait_list_ptr = (cl_event *) (((char*) (*env)->GetDirectBufferAddress(env, event_wait_list)) + event_wait_list_byte_offset); - } - if (event != NULL) { - _event_ptr = (cl_event *) (((char*) (*env)->GetDirectBufferAddress(env, event)) + event_byte_offset); - } - if (errcode_ret != NULL) { - _errcode_ret_ptr = (int32_t *) (((char*) (*env)->GetDirectBufferAddress(env, errcode_ret)) + errcode_ret_byte_offset); - } - - _res = (*clEnqueueMapImage)((cl_command_queue) (intptr_t) command_queue, (cl_mem) (intptr_t) image, - (uint32_t) blocking_map, (uint64_t) map_flags, (size_t *) _origin_ptr, (size_t *) _range_ptr, - (size_t *) _image_row_pitch_ptr, (size_t *) _image_slice_pitch_ptr, (uint32_t) num_events_in_wait_list, - (cl_event *) _event_wait_list_ptr, (cl_event *) _event_ptr, (int32_t *) _errcode_ret_ptr); - if (_res == NULL) return NULL; - - // calculate buffer size - status = (*clGetImageInfo)((cl_mem) (intptr_t) image, CL_IMAGE_ELEMENT_SIZE, sizeof(size_t), (void *) elements, NULL); - status |= (*clGetImageInfo)((cl_mem) (intptr_t) image, CL_IMAGE_DEPTH, sizeof(size_t), (void *) depth, NULL); - - if(status != CL_SUCCESS) { - return NULL; - } - - if(*depth == 0) { // 2D - pixels = (*_image_row_pitch_ptr) * _range_ptr[1] + _range_ptr[0]; - }else{ // 3D - pixels = (*_image_slice_pitch_ptr) * _range_ptr[2] - + (*_image_row_pitch_ptr) * _range_ptr[1] + _range_ptr[0]; - } - - return (*env)->NewDirectByteBuffer(env, _res, pixels * (*elements)); - + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clEnqueueMapImage0__JJIJLjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2IILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2I(env, _unused, + command_queue, image, blocking_map, map_flags, + origin, origin_byte_offset, range, range_byte_offset, + image_row_pitch, image_row_pitch_byte_offset, image_slice_pitch, + image_slice_pitch_byte_offset, num_events_in_wait_list, event_wait_list, + event_wait_list_byte_offset, event, event_byte_offset, errcode_ret, errcode_ret_byte_offset, + imageInfoAddress, mapImageAddress); } JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl12_clSetEventCallback0(JNIEnv *env, jobject _unused, - jlong event, jint trigger, jobject listener, jlong procAddress) { - - cl_event _event = (cl_event)event; - cl_int _trigger = trigger; - cl_int _res; - typedef int32_t (*function)(cl_event, cl_int, void (*pfn_event_notify) (cl_event, cl_int, void *), void *); - function clSetEventCallback = (function)(intptr_t) procAddress; - - jobject cb = (*env)->NewGlobalRef(env, listener); - _res = (*clSetEventCallback)(_event, _trigger, &eventCallback, cb); - - return _res; +Java_com_jogamp_opencl_llb_impl_CLImpl12_clSetEventCallback0(JNIEnv *env, jobject _unused, jlong event, jint trigger, jobject listener, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clSetEventCallback0(env, _unused, event, trigger, listener, procAddress); } JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl12_clSetMemObjectDestructorCallback0(JNIEnv *env, jobject _unused, - jlong mem, jobject listener, jlong procAddress) { - - cl_mem _mem = (cl_mem)mem; - cl_int _res; - typedef int32_t (*function)(cl_mem, void (*pfn_event_notify) (cl_mem, void *), void *); - function clSetMemObjectDestructorCallback = (function)(intptr_t) procAddress; - - jobject cb = (*env)->NewGlobalRef(env, listener); - _res = (*clSetMemObjectDestructorCallback)(_mem, &memObjDestructorCallback, cb); - - return _res; +Java_com_jogamp_opencl_llb_impl_CLImpl12_clSetMemObjectDestructorCallback0(JNIEnv *env, jobject _unused, jlong mem, jobject listener, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clSetMemObjectDestructorCallback0(env, _unused, mem, listener, procAddress); } diff --git a/make/config/clImplCustomCode12.java b/make/config/clImplCustomCode12.java index ff29d5e5..3181749d 100644 --- a/make/config/clImplCustomCode12.java +++ b/make/config/clImplCustomCode12.java @@ -1,60 +1,12 @@ - /** If null, OpenCL is not available on this machine. */ - static final DynamicLibraryBundle dynamicLookupHelper; protected static final CLProcAddressTable12 addressTable; static { addressTable = new CLProcAddressTable12(); - dynamicLookupHelper = AccessController.doPrivileged(new PrivilegedAction<DynamicLibraryBundle>() { - public DynamicLibraryBundle run() { - final DynamicLibraryBundle bundle = new DynamicLibraryBundle(new CLDynamicLibraryBundleInfo()); - if(!bundle.isToolLibLoaded()) { - // couldn't load native CL library - // TODO: log this? - return null; - } - if(!bundle.isLibComplete()) { - System.err.println("Couln't load native CL/JNI glue library"); - return null; - } - addressTable.reset(bundle); - /** Not required nor forced - if( !initializeImpl() ) { - System.err.println("Native initialization failure of CL/JNI glue library"); - return null; - } */ - return bundle; - } } ); } - /** - * Accessor. - * @returns true if OpenCL is available on this machine. - */ - public static boolean isAvailable() { return dynamicLookupHelper != null; } - public static CLProcAddressTable12 getCLProcAddressTable() { return addressTable; } + public static CLProcAddressTable12 getAddressTable() { return addressTable; } - static long clGetExtensionFunctionAddress(long clGetExtensionFunctionAddressHandle, java.lang.String procname) - { - if (clGetExtensionFunctionAddressHandle == 0) { - throw new RuntimeException("Passed null pointer for method \"clGetExtensionFunctionAddress\""); - } - return dispatch_clGetExtensionFunctionAddressStatic(procname, clGetExtensionFunctionAddressHandle); + public CLImpl12() { + init(); } - - public CLAbstractImpl12() { - } - - /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ - long clGetExtensionFunctionAddress(String fname) { - - final long __addr_ = addressTable._addressof_clGetExtensionFunctionAddress; - if (__addr_ == 0) { - throw new UnsupportedOperationException("Method \"clGetExtensionFunctionAddress\" not available"); - } - return dispatch_clGetExtensionFunctionAddressStatic(fname, __addr_); - } - - /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ - private static native long dispatch_clGetExtensionFunctionAddressStatic(String fname, long procAddress); - diff --git a/make/config/clImplCustomCode20.c b/make/config/clImplCustomCode20.c index 065aad31..897faec6 100644 --- a/make/config/clImplCustomCode20.c +++ b/make/config/clImplCustomCode20.c @@ -1,224 +1,28 @@ -// callbacks -typedef void (CL_CALLBACK * cccallback)(const char *, const void *, size_t, void *); -typedef void (CL_CALLBACK * bpcallback)(cl_program, void *); - -CL_CALLBACK void buildProgramCallback(cl_program id, void * object); -CL_CALLBACK void createContextCallback(const char * errinfo, const void * private_info, size_t cb, void * object); -CL_CALLBACK void eventCallback(cl_event event, cl_int status, void * object); -CL_CALLBACK void memObjDestructorCallback(cl_mem mem, void * object); - JNIEXPORT jlong JNICALL -Java_com_jogamp_opencl_llb_impl_CLAbstractImpl20_dispatch_1clGetExtensionFunctionAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress) { - typedef void* (CL_API_CALL * _local_LPCLGETPROCADDRESS)(const char * fname); - _local_LPCLGETPROCADDRESS ptr_clGetExtensionFunctionAddress; - const char* _strchars_fname = NULL; - void* _res; - if ( NULL != fname ) { - _strchars_fname = (*env)->GetStringUTFChars(env, fname, (jboolean*)NULL); - if ( NULL == _strchars_fname ) { - (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"), - "Failed to get UTF-8 chars for argument \"fname\" in native dispatcher for \"dispatch_clGetExtensionFunctionAddress\""); - return 0; - } - } - ptr_clGetExtensionFunctionAddress = (_local_LPCLGETPROCADDRESS) (intptr_t) procAddress; - assert(ptr_clGetExtensionFunctionAddress != NULL); - _res = (* ptr_clGetExtensionFunctionAddress) (_strchars_fname); - if ( NULL != fname ) { - (*env)->ReleaseStringUTFChars(env, fname, _strchars_fname); - } - return (jlong) (intptr_t) _res; +Java_com_jogamp_opencl_llb_impl_CLImpl20_dispatch_1clGetExtensionFunctionAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_dispatch_1clGetExtensionFunctionAddressStatic(env, _unused, fname, procAddress); } -/* Java->C glue code: - * Java package: com.jogamp.opencl.impl.CLImpl - * Java method: long clCreateContextFromType(java.nio.IntBuffer props, long device_type, CreateContextCallback pfn_notify, Object userData, IntBuffer errcode_ret) - * C function: 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); - */ JNIEXPORT jlong JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl20_clCreateContextFromType0(JNIEnv *env, jobject _unused, - jobject props, jint props_byte_offset, jlong device_type, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { - - cl_context_properties* _props_ptr = NULL; - cl_int * _errcode_ptr = NULL; - cl_context _ctx = NULL; - cccallback _pfn_notify = NULL; - jobject globalCB = NULL; - - typedef cl_context (*function)(const cl_context_properties *, cl_device_type, void (*pfn_notify)(const char *, const void *, size_t, void *), void *, cl_int *); - function clCreateContextFromType = (function)(intptr_t) procAddress; - - if (props != NULL) { - _props_ptr = (cl_context_properties*) (((char*) (*env)->GetDirectBufferAddress(env, props)) + props_byte_offset); - } - - if (errcode != NULL) { - _errcode_ptr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, errcode)) + errcode_byte_offset); - } - - if (cb != NULL) { - _pfn_notify = &createContextCallback; - globalCB = (*env)->NewGlobalRef(env, cb); - } - - _ctx = (*clCreateContextFromType)(_props_ptr, (uint64_t) device_type, _pfn_notify, globalCB, _errcode_ptr); - - if(globalCB != NULL) { - jlong *g = (*env)->GetPrimitiveArrayCritical(env, global, NULL); - // if something went wrong - if(_ctx == NULL) { - g[0] = 0; - (*env)->DeleteGlobalRef(env, globalCB); - }else{ - g[0] = (jlong)globalCB; - } - (*env)->ReleasePrimitiveArrayCritical(env, global, g, 0); - } - - return (jlong) (intptr_t)_ctx; +Java_com_jogamp_opencl_llb_impl_CLImpl20_clCreateContextFromType0(JNIEnv *env, jobject _unused, jobject props, jint props_byte_offset, jlong device_type, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clCreateContextFromType0(env, _unused, props, props_byte_offset, device_type, cb, global, errcode, errcode_byte_offset, procAddress); } -/* - * Entry point to C language function: - *extern CL_API_ENTRY cl_context CL_API_CALL - *clCreateContext(cl_context_properties * properties , - * cl_uint num_devices , - * const cl_device_id * devices , - * void (*pfn_notify)(const char *, const void *, size_t, void *) pfn_notify , - * void * user_data , - * cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0; - */ JNIEXPORT jlong JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl20_clCreateContext0(JNIEnv *env, jobject _unused, - jobject props, jint props_byte_offset, jint numDevices, jobject deviceList, jint device_type_offset, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { - - cl_context_properties* _props_ptr = NULL; - cl_int * _errcode_ptr = NULL; - cl_device_id * _deviceListPtr = NULL; - cl_context _ctx = NULL; - cccallback _pfn_notify = NULL; - jobject globalCB = NULL; - - typedef cl_context (CL_API_CALL * function)(cl_context_properties *, cl_uint, const cl_device_id *, void (*pfn_notify)(const char *, const void *, size_t, void *), void *, cl_int *); - function clCreateContext = (function)(intptr_t) procAddress; - - if (props != NULL) { - _props_ptr = (cl_context_properties*) (((char*) (*env)->GetDirectBufferAddress(env, props)) + props_byte_offset); - } - if (deviceList != NULL) { - _deviceListPtr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, deviceList)) + device_type_offset); - } - if (errcode != NULL) { - _errcode_ptr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, errcode)) + errcode_byte_offset); - } - - if (cb != NULL) { - _pfn_notify = &createContextCallback; - globalCB = (*env)->NewGlobalRef(env, cb); - } - - _ctx = (*clCreateContext)(_props_ptr, numDevices, _deviceListPtr, _pfn_notify, globalCB, _errcode_ptr); - - if(globalCB != NULL) { - jlong *g = (*env)->GetPrimitiveArrayCritical(env, global, NULL); - // if something went wrong - if(_ctx == NULL) { - g[0] = 0; - (*env)->DeleteGlobalRef(env, globalCB); - }else{ - g[0] = (jlong)globalCB; - } - (*env)->ReleasePrimitiveArrayCritical(env, global, g, 0); - } - - return (jlong) (intptr_t)_ctx; +Java_com_jogamp_opencl_llb_impl_CLImpl20_clCreateContext0(JNIEnv *env, jobject _unused, jobject props, jint props_byte_offset, jint numDevices, jobject deviceList, jint device_type_offset, jobject cb, jobject global, jobject errcode, jint errcode_byte_offset, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clCreateContext0(env, _unused, props, props_byte_offset, numDevices, deviceList, device_type_offset, cb, global, errcode, errcode_byte_offset, procAddress); } -/* Java->C glue code: - * Java package: com.jogamp.opencl.impl.CLImpl - * Java method: int clReleaseContextImpl(long context) - * C function: int32_t clReleaseContextImpl(cl_context context); - */ JNIEXPORT jint JNICALL Java_com_jogamp_opencl_llb_impl_CLImpl20_clReleaseContextImpl(JNIEnv *env, jobject _unused, jlong context, jlong global, jlong procAddress) { - - int32_t _res; - typedef int32_t (*function)(cl_context); - function clReleaseContext = (function)(intptr_t) procAddress; - - _res = (*clReleaseContext)((cl_context) (intptr_t) context); - // TODO deal with retains - if (global != 0) { - (*env)->DeleteGlobalRef(env, (jobject) global); - } - return _res; + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clReleaseContextImpl(env, _unused, context, global, procAddress); } - -/** - * Entry point to C language function: - * extern CL_API_ENTRY cl_int CL_API_CALL - *clBuildProgram(cl_program program , - * cl_uint num_devices , - * const cl_device_id * device_list , - * const char * options , - * void (*pfn_notify)(cl_program program , void * user_data ), - * void * user_data ) CL_API_SUFFIX__VERSION_1_0; - */ JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl20_clBuildProgram0(JNIEnv *env, jobject _unused, - jlong program, jint deviceCount, jobject deviceList, jint device_type_offset, jstring options, jobject cb, jlong procAddress) { - - const char* _strchars_options = NULL; - cl_int _res; - cl_device_id * _deviceListPtr = NULL; - bpcallback _pfn_notify = NULL; - jobject globalCB = NULL; - - typedef cl_int (CL_API_CALL * function)(cl_program, cl_uint, const cl_device_id *, const char *, void (CL_CALLBACK *)(cl_program, void *), void *); - function clBuildProgram = (function)(intptr_t)procAddress; - - if (options != NULL) { - _strchars_options = (*env)->GetStringUTFChars(env, options, (jboolean*)NULL); - if (_strchars_options == NULL) { - (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"), - "Failed to get UTF-8 chars for argument \"options\" in native dispatcher for \"clBuildProgram\""); - return CL_FALSE; - } - } - - if (deviceList != NULL) { - _deviceListPtr = (void *) (((char*) (*env)->GetDirectBufferAddress(env, deviceList)) + device_type_offset); - } - - if (cb != NULL) { - _pfn_notify = &buildProgramCallback; - globalCB = (*env)->NewGlobalRef(env, cb); - } - - _res = (*clBuildProgram)((cl_program)(intptr_t)program, (cl_uint)deviceCount, (cl_device_id *)_deviceListPtr, _strchars_options, _pfn_notify, globalCB); - - // if something went wrong - if(_res != CL_SUCCESS && globalCB != NULL) { - (*env)->DeleteGlobalRef(env, globalCB); - } - - if (options != NULL) { - (*env)->ReleaseStringUTFChars(env, options, _strchars_options); - } - - return (jint)_res; +Java_com_jogamp_opencl_llb_impl_CLImpl20_clBuildProgram0(JNIEnv *env, jobject _unused, jlong program, jint deviceCount, jobject deviceList, jint device_type_offset, jstring options, jobject cb, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clBuildProgram0(env, _unused, program, deviceCount, deviceList, device_type_offset, options, cb, procAddress); } -/* Java->C glue code: - * Java package: com.jogamp.opencl.impl.CLImpl - * Java method: java.nio.ByteBuffer clEnqueueMapImage(long command_queue, long image, int blocking_map, long map_flags, com.jogamp.gluegen.common.nio.PointerBuffer origin, com.jogamp.gluegen.common.nio.PointerBuffer range, com.jogamp.gluegen.common.nio.PointerBuffer image_row_pitch, com.jogamp.gluegen.common.nio.PointerBuffer image_slice_pitch, int num_events_in_wait_list, com.jogamp.gluegen.common.nio.PointerBuffer event_wait_list, com.jogamp.gluegen.common.nio.PointerBuffer event, java.nio.IntBuffer errcode_ret) - * C function: void * clEnqueueMapImage(cl_command_queue command_queue, cl_mem image, uint32_t blocking_map, uint64_t map_flags, const size_t * , const size_t * , size_t * image_row_pitch, size_t * image_slice_pitch, uint32_t num_events_in_wait_list, cl_event * event_wait_list, cl_event * event, int32_t * errcode_ret); - */ JNIEXPORT jobject JNICALL Java_com_jogamp_opencl_llb_impl_CLImpl20_clEnqueueMapImage0__JJIJLjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2IILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2I(JNIEnv *env, jobject _unused, jlong command_queue, jlong image, jint blocking_map, jlong map_flags, @@ -227,102 +31,21 @@ Java_com_jogamp_opencl_llb_impl_CLImpl20_clEnqueueMapImage0__JJIJLjava_lang_Obje jint image_slice_pitch_byte_offset, jint num_events_in_wait_list, jobject event_wait_list, jint event_wait_list_byte_offset, jobject event, jint event_byte_offset, jobject errcode_ret, jint errcode_ret_byte_offset, jlong imageInfoAddress, jlong mapImageAddress) { - - size_t * _origin_ptr = NULL; - size_t * _range_ptr = NULL; - size_t * _image_row_pitch_ptr = NULL; - size_t * _image_slice_pitch_ptr = NULL; - cl_event * _event_wait_list_ptr = NULL; - cl_event * _event_ptr = NULL; - int32_t * _errcode_ret_ptr = NULL; - size_t * elements = NULL; - size_t * depth = NULL; - size_t pixels; - cl_int status; - - typedef int32_t (*imageInfoFunctionType)(cl_mem, uint32_t, size_t, void *, size_t *); - imageInfoFunctionType clGetImageInfo = (imageInfoFunctionType)(intptr_t)imageInfoAddress; - - typedef void* (*mapInfoFunctionType)(cl_command_queue, cl_mem, uint32_t, uint64_t, const size_t *, - const size_t *, size_t *, size_t *, uint32_t, cl_event *, cl_event *, int32_t *); - mapInfoFunctionType clEnqueueMapImage = (mapInfoFunctionType)(intptr_t)mapImageAddress; - - void * _res; - - if (origin != NULL) { - _origin_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, origin)) + origin_byte_offset); - } - if (range != NULL) { - _range_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, range)) + range_byte_offset); - } - if (image_row_pitch != NULL) { - _image_row_pitch_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, image_row_pitch)) + image_row_pitch_byte_offset); - } - if (image_slice_pitch != NULL) { - _image_slice_pitch_ptr = (size_t *) (((char*) (*env)->GetDirectBufferAddress(env, image_slice_pitch)) + image_slice_pitch_byte_offset); - } - if (event_wait_list != NULL) { - _event_wait_list_ptr = (cl_event *) (((char*) (*env)->GetDirectBufferAddress(env, event_wait_list)) + event_wait_list_byte_offset); - } - if (event != NULL) { - _event_ptr = (cl_event *) (((char*) (*env)->GetDirectBufferAddress(env, event)) + event_byte_offset); - } - if (errcode_ret != NULL) { - _errcode_ret_ptr = (int32_t *) (((char*) (*env)->GetDirectBufferAddress(env, errcode_ret)) + errcode_ret_byte_offset); - } - - _res = (*clEnqueueMapImage)((cl_command_queue) (intptr_t) command_queue, (cl_mem) (intptr_t) image, - (uint32_t) blocking_map, (uint64_t) map_flags, (size_t *) _origin_ptr, (size_t *) _range_ptr, - (size_t *) _image_row_pitch_ptr, (size_t *) _image_slice_pitch_ptr, (uint32_t) num_events_in_wait_list, - (cl_event *) _event_wait_list_ptr, (cl_event *) _event_ptr, (int32_t *) _errcode_ret_ptr); - if (_res == NULL) return NULL; - - // calculate buffer size - status = (*clGetImageInfo)((cl_mem) (intptr_t) image, CL_IMAGE_ELEMENT_SIZE, sizeof(size_t), (void *) elements, NULL); - status |= (*clGetImageInfo)((cl_mem) (intptr_t) image, CL_IMAGE_DEPTH, sizeof(size_t), (void *) depth, NULL); - - if(status != CL_SUCCESS) { - return NULL; - } - - if(*depth == 0) { // 2D - pixels = (*_image_row_pitch_ptr) * _range_ptr[1] + _range_ptr[0]; - }else{ // 3D - pixels = (*_image_slice_pitch_ptr) * _range_ptr[2] - + (*_image_row_pitch_ptr) * _range_ptr[1] + _range_ptr[0]; - } - - return (*env)->NewDirectByteBuffer(env, _res, pixels * (*elements)); - + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clEnqueueMapImage0__JJIJLjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2IILjava_lang_Object_2ILjava_lang_Object_2ILjava_lang_Object_2I(env, _unused, + command_queue, image, blocking_map, map_flags, + origin, origin_byte_offset, range, range_byte_offset, + image_row_pitch, image_row_pitch_byte_offset, image_slice_pitch, + image_slice_pitch_byte_offset, num_events_in_wait_list, event_wait_list, + event_wait_list_byte_offset, event, event_byte_offset, errcode_ret, errcode_ret_byte_offset, + imageInfoAddress, mapImageAddress); } JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl20_clSetEventCallback0(JNIEnv *env, jobject _unused, - jlong event, jint trigger, jobject listener, jlong procAddress) { - - cl_event _event = (cl_event)event; - cl_int _trigger = trigger; - cl_int _res; - typedef int32_t (*function)(cl_event, cl_int, void (*pfn_event_notify) (cl_event, cl_int, void *), void *); - function clSetEventCallback = (function)(intptr_t) procAddress; - - jobject cb = (*env)->NewGlobalRef(env, listener); - _res = (*clSetEventCallback)(_event, _trigger, &eventCallback, cb); - - return _res; +Java_com_jogamp_opencl_llb_impl_CLImpl20_clSetEventCallback0(JNIEnv *env, jobject _unused, jlong event, jint trigger, jobject listener, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clSetEventCallback0(env, _unused, event, trigger, listener, procAddress); } JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl20_clSetMemObjectDestructorCallback0(JNIEnv *env, jobject _unused, - jlong mem, jobject listener, jlong procAddress) { - - cl_mem _mem = (cl_mem)mem; - cl_int _res; - typedef int32_t (*function)(cl_mem, void (*pfn_event_notify) (cl_mem, void *), void *); - function clSetMemObjectDestructorCallback = (function)(intptr_t) procAddress; - - jobject cb = (*env)->NewGlobalRef(env, listener); - _res = (*clSetMemObjectDestructorCallback)(_mem, &memObjDestructorCallback, cb); - - return _res; +Java_com_jogamp_opencl_llb_impl_CLImpl20_clSetMemObjectDestructorCallback0(JNIEnv *env, jobject _unused, jlong mem, jobject listener, jlong procAddress) { + return Java_com_jogamp_opencl_llb_impl_CLImpl11_clSetMemObjectDestructorCallback0(env, _unused, mem, listener, procAddress); } diff --git a/make/config/clImplCustomCode20.java b/make/config/clImplCustomCode20.java index e6c8071c..6247dd6c 100644 --- a/make/config/clImplCustomCode20.java +++ b/make/config/clImplCustomCode20.java @@ -1,60 +1,12 @@ - /** If null, OpenCL is not available on this machine. */ - static final DynamicLibraryBundle dynamicLookupHelper; protected static final CLProcAddressTable20 addressTable; static { addressTable = new CLProcAddressTable20(); - dynamicLookupHelper = AccessController.doPrivileged(new PrivilegedAction<DynamicLibraryBundle>() { - public DynamicLibraryBundle run() { - final DynamicLibraryBundle bundle = new DynamicLibraryBundle(new CLDynamicLibraryBundleInfo()); - if(!bundle.isToolLibLoaded()) { - // couldn't load native CL library - // TODO: log this? - return null; - } - if(!bundle.isLibComplete()) { - System.err.println("Couln't load native CL/JNI glue library"); - return null; - } - addressTable.reset(bundle); - /** Not required nor forced - if( !initializeImpl() ) { - System.err.println("Native initialization failure of CL/JNI glue library"); - return null; - } */ - return bundle; - } } ); } - /** - * Accessor. - * @returns true if OpenCL is available on this machine. - */ - public static boolean isAvailable() { return dynamicLookupHelper != null; } - public static CLProcAddressTable20 getCLProcAddressTable() { return addressTable; } + public static CLProcAddressTable20 getAddressTable() { return addressTable; } - static long clGetExtensionFunctionAddress(long clGetExtensionFunctionAddressHandle, java.lang.String procname) - { - if (clGetExtensionFunctionAddressHandle == 0) { - throw new RuntimeException("Passed null pointer for method \"clGetExtensionFunctionAddress\""); - } - return dispatch_clGetExtensionFunctionAddressStatic(procname, clGetExtensionFunctionAddressHandle); + public CLImpl20() { + init(); } - - public CLAbstractImpl20() { - } - - /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ - long clGetExtensionFunctionAddress(String fname) { - - final long __addr_ = addressTable._addressof_clGetExtensionFunctionAddress; - if (__addr_ == 0) { - throw new UnsupportedOperationException("Method \"clGetExtensionFunctionAddress\" not available"); - } - return dispatch_clGetExtensionFunctionAddressStatic(fname, __addr_); - } - - /** Entry point (through function pointer) to C language function: <br> <code> void* clGetExtensionFunctionAddress(const char * fname); </code> */ - private static native long dispatch_clGetExtensionFunctionAddressStatic(String fname, long procAddress); - |