1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/*
void checkStatus(const char* msg, int status) {
if (status != CL_SUCCESS) {
printf("%s; error: %d \n", msg, status);
exit(EXIT_FAILURE);
}
}
*/
/*
void createContextCallback(const char * c, const void * v, size_t s, void * o) {
//TODO
}
*/
/* Java->C glue code:
* Java package: com.mbien.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( 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 );
*/
//__Ljava_lang_Object_2IJLjava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2I
JNIEXPORT jlong JNICALL
Java_com_mbien_opencl_impl_CLImpl_clCreateContextFromType0(JNIEnv *env, jobject _unused,
jobject props, jint props_byte_offset, jlong device_type, jobject cb, jobject data, jobject errcode, jint errcode_byte_offset) {
intptr_t * _props_ptr = NULL;
int32_t * _errcode_ptr = NULL;
cl_context _ctx;
if (props != NULL) {
_props_ptr = (intptr_t *) (((char*) (*env)->GetDirectBufferAddress(env, props)) + props_byte_offset);
}
if (errcode != NULL) {
_errcode_ptr = (int32_t *) (((char*) (*env)->GetDirectBufferAddress(env, errcode)) + errcode_byte_offset);
}
//TODO callback; payload
_ctx = clCreateContextFromType((intptr_t *) _props_ptr, (uint64_t) device_type, NULL, NULL, (int32_t *) _errcode_ptr);
/*
printf(" - - - - test - - - - \n");
cl_uint err;
size_t deviceListSize;
// get the list of GPU devices associated with context
err = clGetContextInfo(_ctx, CL_CONTEXT_DEVICES, 0, NULL, &deviceListSize); checkStatus("getContextInfo1", err);
cl_uint count = (cl_uint)deviceListSize / sizeof(cl_device_id);
printf("devices: %d \n", count);
printf(" - - - - test end - - - - \n");
*/
return (jlong)_ctx;
}
/*
JNIEXPORT jlong JNICALL
Java_com_mbien_opencl_impl_CLImpl_clCreateContext0(JNIEnv *env, jobject _unused,
jobject props, jint props_byte_offset, jlong device_type, jobject cb, jobject data, jobject errcode, jint errcode_byte_offset) {
intptr_t * _props_ptr = NULL;
int32_t * _errcode_ptr = NULL;
void * _device_ptr = NULL;
cl_context _res;
if (props != NULL) {
_props_ptr = (intptr_t *) (((char*) (*env)->GetDirectBufferAddress(env, props)) + props_byte_offset);
}
if (device_type != NULL) {
_device_ptr = (void *) (((char*) (*env)->GetPrimitiveArrayCritical(env, device_type, NULL)));
}
_res = clCreateContext();
if (device_type != NULL) {
(*env)->ReleasePrimitiveArrayCritical(env, device_type, _device_ptr, 0);
}
return (jlong) (intptr_t) _res;
}
*/
/**
* Entry point to C language function: <code> int32_t clBuildProgram(cl_program, uint32_t, cl_device_id * , const char * , void (*pfn_notify)(cl_program, void *user_data), void * );
*/
JNIEXPORT jint JNICALL
Java_com_mbien_opencl_impl_CLImpl_clBuildProgram0(JNIEnv *env, jobject _unused,
jlong program, jint deviceCount, jobject deviceList, jint offset, jstring options, jobject cb, jobject data) {
const char* _strchars_options = NULL;
cl_int _res;
size_t * _deviceListPtr = NULL;
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)->GetPrimitiveArrayCritical(env, deviceList, NULL)) + offset);
}
// TODO payload, callback...
_res = clBuildProgram((cl_program)program, (cl_uint)deviceCount, _deviceListPtr, _strchars_options, NULL, NULL);
if (deviceList != NULL) {
(*env)->ReleasePrimitiveArrayCritical(env, deviceList, _deviceListPtr, 0);
}
if (options != NULL) {
(*env)->ReleaseStringUTFChars(env, options, _strchars_options);
}
return _res;
}
|