From 9a90181ed1fb596275fee9ebca0f3d1093722ca9 Mon Sep 17 00:00:00 2001 From: Wade Walker Date: Sat, 12 Sep 2015 14:28:16 -0500 Subject: Add explicit version number to original CL impl classes. This makes all three versions (1.1, 1.2, and 2.0) use the same naming convention, and sets me up to use the unversioned name to factor out code common to all three. --- make/config/cl-impl-11.cfg | 99 ++++++++ make/config/cl-impl.cfg | 99 -------- make/config/clImplCustomCode.c | 435 ------------------------------------ make/config/clImplCustomCode.java | 60 ----- make/config/clImplCustomCode11.c | 435 ++++++++++++++++++++++++++++++++++++ make/config/clImplCustomCode11.java | 60 +++++ 6 files changed, 594 insertions(+), 594 deletions(-) create mode 100644 make/config/cl-impl-11.cfg delete mode 100644 make/config/cl-impl.cfg delete mode 100644 make/config/clImplCustomCode.c delete mode 100644 make/config/clImplCustomCode.java create mode 100644 make/config/clImplCustomCode11.c create mode 100644 make/config/clImplCustomCode11.java (limited to 'make/config') diff --git a/make/config/cl-impl-11.cfg b/make/config/cl-impl-11.cfg new file mode 100644 index 00000000..9a49ea64 --- /dev/null +++ b/make/config/cl-impl-11.cfg @@ -0,0 +1,99 @@ +Include cl-common.cfg +NativeOutputDir gensrc/native/jocl11 + +Style ImplOnly + +#imports for all generated java files +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 + +LocalProcAddressCallingConvention __ALL__ CL_API_CALL + +EmitProcAddressTable true +ProcAddressTableClassName CLProcAddressTable11 +GetProcAddressTableExpr addressTable +ProcAddressNameExpr $UpperCase(arg) +ForceProcAddressGen __ALL__ + +#dynamic binding for OpenGL specific functions... +#ForceProcAddressGen clGetGLContextInfoKHR +#ForceProcAddressGen clCreateFromGLBuffer +#ForceProcAddressGen clCreateFromGLRenderbuffer +#ForceProcAddressGen clCreateFromGLTexture2D +#ForceProcAddressGen clCreateFromGLTexture3D +#ForceProcAddressGen clEnqueueAcquireGLObjects +#ForceProcAddressGen clEnqueueReleaseGLObjects +#ForceProcAddressGen clGetGLObjectInfo +#ForceProcAddressGen clGetGLTextureInfo +#ForceProcAddressGen clCreateEventFromGLsyncKHR +#ForceProcAddressGen clIcdGetPlatformIDsKHR +#ForceProcAddressGen clCreateSubBuffer +#ForceProcAddressGen clCreateSubDevicesEXT +#ForceProcAddressGen clCreateUserEvent +#ForceProcAddressGen clEnqueueCopyBufferRect +#ForceProcAddressGen clEnqueueReadBufferRect +#ForceProcAddressGen clEnqueueWriteBufferRect +#ForceProcAddressGen clReleaseDeviceEXT +#ForceProcAddressGen clRetainDeviceEXT +#ForceProcAddressGen clSetUserEventStatus + +#...or force all +ForceProcAddressGen __ALL__ + +# +# extern CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddress(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; +# +Ignore clGetExtensionFunctionAddress +ForceProcAddressGen clGetExtensionFunctionAddress + +#append to generated c files +CustomCCode #include +CustomCCode #include +CustomCCode #include +CustomCCode #include +CustomCCode #include + +# implement manually via custom code +Ignore clCreateContext +ForceProcAddressGen clCreateContext + +Ignore clCreateContextFromType +ForceProcAddressGen clCreateContextFromType + +Ignore clBuildProgram +ForceProcAddressGen clBuildProgram + +Ignore clEnqueueNativeKernel +ForceProcAddressGen clEnqueueNativeKernel + +Ignore clReleaseContext +ForceProcAddressGen clReleaseContext + +Ignore clSetEventCallback +ForceProcAddressGen clSetEventCallback + +Ignore clSetMemObjectDestructorCallback +ForceProcAddressGen clSetMemObjectDestructorCallback + +#take buffer capacity from input param 5 +ReturnValueCapacity clEnqueueMapBuffer {5} + +#this one is more complicated, we have to calculate the capacity with custom code +ManuallyImplement clEnqueueMapImage +ForceProcAddressGen clEnqueueMapImage + +#include custom code +IncludeAs CustomJavaCode CLAbstractImpl11 clImplCustomCode11.java +ManualStaticInitCall CLAbstractImpl11 +IncludeAs CustomCCode clImplCustomCode11.c + diff --git a/make/config/cl-impl.cfg b/make/config/cl-impl.cfg deleted file mode 100644 index f7850662..00000000 --- a/make/config/cl-impl.cfg +++ /dev/null @@ -1,99 +0,0 @@ -Include cl-common.cfg -NativeOutputDir gensrc/native/jocl11 - -Style ImplOnly - -#imports for all generated java files -Import com.jogamp.opencl.llb.gl.CLGL -Import java.security.AccessController -Import java.security.PrivilegedAction - -ClassJavadoc CLAbstractImpl /** -ClassJavadoc CLAbstractImpl * Java bindings to OpenCL, the Open Computing Language (generated). -ClassJavadoc CLAbstractImpl * @author Michael Bien, GlueGen, et al. -ClassJavadoc CLAbstractImpl */ - -ImplJavaClass CLAbstractImpl -AccessControl CLAbstractImpl PUBLIC_ABSTRACT -Implements CLAbstractImpl CLGL - -LocalProcAddressCallingConvention __ALL__ CL_API_CALL - -EmitProcAddressTable true -ProcAddressTableClassName CLProcAddressTable -GetProcAddressTableExpr addressTable -ProcAddressNameExpr $UpperCase(arg) -ForceProcAddressGen __ALL__ - -#dynamic binding for OpenGL specific functions... -#ForceProcAddressGen clGetGLContextInfoKHR -#ForceProcAddressGen clCreateFromGLBuffer -#ForceProcAddressGen clCreateFromGLRenderbuffer -#ForceProcAddressGen clCreateFromGLTexture2D -#ForceProcAddressGen clCreateFromGLTexture3D -#ForceProcAddressGen clEnqueueAcquireGLObjects -#ForceProcAddressGen clEnqueueReleaseGLObjects -#ForceProcAddressGen clGetGLObjectInfo -#ForceProcAddressGen clGetGLTextureInfo -#ForceProcAddressGen clCreateEventFromGLsyncKHR -#ForceProcAddressGen clIcdGetPlatformIDsKHR -#ForceProcAddressGen clCreateSubBuffer -#ForceProcAddressGen clCreateSubDevicesEXT -#ForceProcAddressGen clCreateUserEvent -#ForceProcAddressGen clEnqueueCopyBufferRect -#ForceProcAddressGen clEnqueueReadBufferRect -#ForceProcAddressGen clEnqueueWriteBufferRect -#ForceProcAddressGen clReleaseDeviceEXT -#ForceProcAddressGen clRetainDeviceEXT -#ForceProcAddressGen clSetUserEventStatus - -#...or force all -ForceProcAddressGen __ALL__ - -# -# extern CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddress(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; -# -Ignore clGetExtensionFunctionAddress -ForceProcAddressGen clGetExtensionFunctionAddress - -#append to generated c files -CustomCCode #include -CustomCCode #include -CustomCCode #include -CustomCCode #include -CustomCCode #include - -# implement manually via custom code -Ignore clCreateContext -ForceProcAddressGen clCreateContext - -Ignore clCreateContextFromType -ForceProcAddressGen clCreateContextFromType - -Ignore clBuildProgram -ForceProcAddressGen clBuildProgram - -Ignore clEnqueueNativeKernel -ForceProcAddressGen clEnqueueNativeKernel - -Ignore clReleaseContext -ForceProcAddressGen clReleaseContext - -Ignore clSetEventCallback -ForceProcAddressGen clSetEventCallback - -Ignore clSetMemObjectDestructorCallback -ForceProcAddressGen clSetMemObjectDestructorCallback - -#take buffer capacity from input param 5 -ReturnValueCapacity clEnqueueMapBuffer {5} - -#this one is more complicated, we have to calculate the capacity with custom code -ManuallyImplement clEnqueueMapImage -ForceProcAddressGen clEnqueueMapImage - -#include custom code -IncludeAs CustomJavaCode CLAbstractImpl clImplCustomCode.java -ManualStaticInitCall CLAbstractImpl -IncludeAs CustomCCode clImplCustomCode.c - diff --git a/make/config/clImplCustomCode.c b/make/config/clImplCustomCode.c deleted file mode 100644 index 1d640863..00000000 --- a/make/config/clImplCustomCode.c +++ /dev/null @@ -1,435 +0,0 @@ -/* -void checkStatus(const char* msg, int status) { - if (status != CL_SUCCESS) { - printf("%s; error: %d \n", msg, status); - exit(EXIT_FAILURE); - } -} -*/ - -JavaVM * jvm; - -jmethodID buildCB_mid; -jmethodID contextCB_mid; -jmethodID eventCB_mid; -jmethodID memObjCB_mid; - - -JNIEXPORT jint JNICALL -JNI_OnLoad(JavaVM * _jvm, void *reserved) { - - JNIEnv *env; - jvm = _jvm; - - if ((*jvm)->GetEnv(_jvm, (void **)&env, JNI_VERSION_1_2)) { - return JNI_ERR; - } - - // throws ClassNotFoundException (or other reflection stuff) - jclass buildCBClassID = (*env)->FindClass(env, "com/jogamp/opencl/llb/impl/BuildProgramCallback"); - jclass errorHandlerClassID = (*env)->FindClass(env, "com/jogamp/opencl/CLErrorHandler"); - jclass eventCBClassID = (*env)->FindClass(env, "com/jogamp/opencl/llb/impl/CLEventCallback"); - jclass memObjCBClassID = (*env)->FindClass(env, "com/jogamp/opencl/llb/impl/CLMemObjectDestructorCallback"); - - // throws even more reflection Exceptions - // IDs are unique and do not change - if (buildCBClassID != NULL) { - buildCB_mid = (*env)->GetMethodID(env, buildCBClassID, "buildFinished", "(J)V"); - } - if (errorHandlerClassID != NULL) { - contextCB_mid = (*env)->GetMethodID(env, errorHandlerClassID, "onError", "(Ljava/lang/String;Ljava/nio/ByteBuffer;J)V"); - } - if (eventCBClassID != NULL) { - eventCB_mid = (*env)->GetMethodID(env, eventCBClassID, "eventStateChanged", "(JI)V"); - } - if (memObjCBClassID != NULL) { - memObjCB_mid = (*env)->GetMethodID(env, memObjCBClassID, "memoryDeallocated", "(J)V"); - } - - return JNI_VERSION_1_2; -} - - -// callbacks -typedef void (CL_CALLBACK * cccallback)(const char *, const void *, size_t, void *); -typedef void (CL_CALLBACK * bpcallback)(cl_program, void *); -typedef void (CL_CALLBACK * evcallback)(cl_event, cl_int, void *); -typedef void (CL_CALLBACK * mocallback)(cl_mem, void *); - -CL_CALLBACK void buildProgramCallback(cl_program id, void * object) { - - JNIEnv *env; - jobject obj = (jobject)object; - - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - - (*env)->CallVoidMethod(env, obj, buildCB_mid, (jlong)(intptr_t)id); - (*env)->DeleteGlobalRef(env, obj); - - (*jvm)->DetachCurrentThread(jvm); - -} - -CL_CALLBACK void createContextCallback(const char * errinfo, const void * private_info, size_t cb, void * object) { - - JNIEnv *env; - jobject obj = (jobject)object; - - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - - jstring errorString = (*env)->NewStringUTF(env, errinfo); - - //TODO private_info - (*env)->CallVoidMethod(env, obj, contextCB_mid, errorString, NULL, 0); - - (*jvm)->DetachCurrentThread(jvm); - -} - -CL_CALLBACK void eventCallback(cl_event event, cl_int status, void * object) { - - JNIEnv *env; - jobject obj = (jobject)object; - - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - - (*env)->CallVoidMethod(env, obj, eventCB_mid, event, status); - (*env)->DeleteGlobalRef(env, obj); // events can only fire once - - (*jvm)->DetachCurrentThread(jvm); -} - -CL_CALLBACK void memObjDestructorCallback(cl_mem mem, void * object) { - - JNIEnv *env; - jobject obj = (jobject)object; - - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - - (*env)->CallVoidMethod(env, obj, memObjCB_mid, mem); - (*env)->DeleteGlobalRef(env, obj); - - (*jvm)->DetachCurrentThread(jvm); -} - -// 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_CLAbstractImpl_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->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_CLImpl_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; -} - -/* - * 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_CLImpl_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->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_CLImpl_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; -} - - -/** - * 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_CLImpl_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->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_CLImpl_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) { - - 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)); - -} - -JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl_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; -} - -JNIEXPORT jint JNICALL -Java_com_jogamp_opencl_llb_impl_CLImpl_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; -} diff --git a/make/config/clImplCustomCode.java b/make/config/clImplCustomCode.java deleted file mode 100644 index e4fd2dcf..00000000 --- a/make/config/clImplCustomCode.java +++ /dev/null @@ -1,60 +0,0 @@ - - /** If null, OpenCL is not available on this machine. */ - static final DynamicLibraryBundle dynamicLookupHelper; - protected static final CLProcAddressTable addressTable; - - static { - addressTable = new CLProcAddressTable(); - dynamicLookupHelper = AccessController.doPrivileged(new PrivilegedAction() { - 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 CLProcAddressTable 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 CLAbstractImpl() { - } - - /** Entry point (through function pointer) to C language function:
void* clGetExtensionFunctionAddress(const char * fname); */ - 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:
void* clGetExtensionFunctionAddress(const char * fname); */ - private static native long dispatch_clGetExtensionFunctionAddressStatic(String fname, long procAddress); - diff --git a/make/config/clImplCustomCode11.c b/make/config/clImplCustomCode11.c new file mode 100644 index 00000000..1e772d9e --- /dev/null +++ b/make/config/clImplCustomCode11.c @@ -0,0 +1,435 @@ +/* +void checkStatus(const char* msg, int status) { + if (status != CL_SUCCESS) { + printf("%s; error: %d \n", msg, status); + exit(EXIT_FAILURE); + } +} +*/ + +JavaVM * jvm; + +jmethodID buildCB_mid; +jmethodID contextCB_mid; +jmethodID eventCB_mid; +jmethodID memObjCB_mid; + + +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM * _jvm, void *reserved) { + + JNIEnv *env; + jvm = _jvm; + + if ((*jvm)->GetEnv(_jvm, (void **)&env, JNI_VERSION_1_2)) { + return JNI_ERR; + } + + // throws ClassNotFoundException (or other reflection stuff) + jclass buildCBClassID = (*env)->FindClass(env, "com/jogamp/opencl/llb/impl/BuildProgramCallback"); + jclass errorHandlerClassID = (*env)->FindClass(env, "com/jogamp/opencl/CLErrorHandler"); + jclass eventCBClassID = (*env)->FindClass(env, "com/jogamp/opencl/llb/impl/CLEventCallback"); + jclass memObjCBClassID = (*env)->FindClass(env, "com/jogamp/opencl/llb/impl/CLMemObjectDestructorCallback"); + + // throws even more reflection Exceptions + // IDs are unique and do not change + if (buildCBClassID != NULL) { + buildCB_mid = (*env)->GetMethodID(env, buildCBClassID, "buildFinished", "(J)V"); + } + if (errorHandlerClassID != NULL) { + contextCB_mid = (*env)->GetMethodID(env, errorHandlerClassID, "onError", "(Ljava/lang/String;Ljava/nio/ByteBuffer;J)V"); + } + if (eventCBClassID != NULL) { + eventCB_mid = (*env)->GetMethodID(env, eventCBClassID, "eventStateChanged", "(JI)V"); + } + if (memObjCBClassID != NULL) { + memObjCB_mid = (*env)->GetMethodID(env, memObjCBClassID, "memoryDeallocated", "(J)V"); + } + + return JNI_VERSION_1_2; +} + + +// callbacks +typedef void (CL_CALLBACK * cccallback)(const char *, const void *, size_t, void *); +typedef void (CL_CALLBACK * bpcallback)(cl_program, void *); +typedef void (CL_CALLBACK * evcallback)(cl_event, cl_int, void *); +typedef void (CL_CALLBACK * mocallback)(cl_mem, void *); + +CL_CALLBACK void buildProgramCallback(cl_program id, void * object) { + + JNIEnv *env; + jobject obj = (jobject)object; + + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + + (*env)->CallVoidMethod(env, obj, buildCB_mid, (jlong)(intptr_t)id); + (*env)->DeleteGlobalRef(env, obj); + + (*jvm)->DetachCurrentThread(jvm); + +} + +CL_CALLBACK void createContextCallback(const char * errinfo, const void * private_info, size_t cb, void * object) { + + JNIEnv *env; + jobject obj = (jobject)object; + + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + + jstring errorString = (*env)->NewStringUTF(env, errinfo); + + //TODO private_info + (*env)->CallVoidMethod(env, obj, contextCB_mid, errorString, NULL, 0); + + (*jvm)->DetachCurrentThread(jvm); + +} + +CL_CALLBACK void eventCallback(cl_event event, cl_int status, void * object) { + + JNIEnv *env; + jobject obj = (jobject)object; + + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + + (*env)->CallVoidMethod(env, obj, eventCB_mid, event, status); + (*env)->DeleteGlobalRef(env, obj); // events can only fire once + + (*jvm)->DetachCurrentThread(jvm); +} + +CL_CALLBACK void memObjDestructorCallback(cl_mem mem, void * object) { + + JNIEnv *env; + jobject obj = (jobject)object; + + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + + (*env)->CallVoidMethod(env, obj, memObjCB_mid, mem); + (*env)->DeleteGlobalRef(env, obj); + + (*jvm)->DetachCurrentThread(jvm); +} + +// 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) { + 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->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_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) { + + 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; +} + +/* + * 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_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) { + + 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->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_CLImpl11_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; +} + + +/** + * 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_CLImpl11_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->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_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) { + + 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)); + +} + +JNIEXPORT jint JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_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; +} + +JNIEXPORT jint JNICALL +Java_com_jogamp_opencl_llb_impl_CLImpl11_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; +} diff --git a/make/config/clImplCustomCode11.java b/make/config/clImplCustomCode11.java new file mode 100644 index 00000000..0dcb770f --- /dev/null +++ b/make/config/clImplCustomCode11.java @@ -0,0 +1,60 @@ + + /** 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() { + 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:
void* clGetExtensionFunctionAddress(const char * fname); */ + 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:
void* clGetExtensionFunctionAddress(const char * fname); */ + private static native long dispatch_clGetExtensionFunctionAddressStatic(String fname, long procAddress); + -- cgit v1.2.3