diff --git a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
index ac065de3f43d9262776da0750eda3fae017953ab..e1ef0ef4b0a43f2ea5184148a0ef535e3c3fe6d7 100644
--- a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
+++ b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
@@ -250,6 +250,34 @@ void getArg(JNIEnv *jenv, cl_context context, cl_command_queue commandQueue, cl_
}
}
+JNI_JAVA(void, OpenCLJNI, dispose)
+ (JNIEnv *jenv, jobject jobj, jobject kernelInstance) {
+ cl_kernel kernel = OpenCLKernel::getKernel(jenv, kernelInstance);
+ jobject programInstance = OpenCLKernel::getProgramInstance(jenv, kernelInstance);
+ jobjectArray argDefsArray = OpenCLKernel::getArgsArray(jenv, kernelInstance);
+
+
+ cl_context context = OpenCLProgram::getContext(jenv, programInstance);
+ cl_command_queue commandQueue = OpenCLProgram::getCommandQueue(jenv, programInstance);
+ jsize argc = jenv->GetArrayLength(argDefsArray);
+ fprintf(stderr, "dispose! argc = %d\n", argc);
+ for (jsize argIndex = 0; argIndex < argc; argIndex++){
+ jobject argDef = jenv->GetObjectArrayElement(argDefsArray, argIndex);
+ jlong argBits = OpenCLArgDescriptor::getBits(jenv, argDef);
+ if (argisset(argBits, ARRAY) && argisset(argBits, GLOBAL)){
+ jobject memInstance = OpenCLArgDescriptor::getMemInstance(jenv, argDef);
+ if (memInstance == NULL){
+ fprintf(stderr, "mem instance not set\n");
+ }else{
+ cl_mem mem = OpenCLMem::getMem(jenv, memInstance);
+ size_t sizeInBytes = OpenCLMem::getSizeInBytes(jenv, memInstance);
+ cl_int status = clReleaseMemObject(mem);
+ fprintf(stderr, "mem instance %d released!\n", sizeInBytes);
+ }
+ }
+ }
+ }
+
/**
*/
JNI_JAVA(void, OpenCLJNI, invoke)
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
index 17a2a8d888a4ed79ae502835f3e9c46f93c332a1..6e1cbc13c339dff9e97cc45a60c4ffb855bffa86 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
@@ -167,7 +167,14 @@ public class OpenCLDevice extends Device{
} else if (method.getName().equals("begin")) {
System.out.println("begin not implemented");
} else if (method.getName().equals("dispose")) {
- System.out.println("dispose not implemented");
+ System.out.println("dispose");
+ for (OpenCLKernel k:map.values()){
+ k.dispose();
+ }
+ // args = map.get(method.getName());
+ // for (OpenCLArgDescriptor argDescriptor:args){
+
+ // }
} else if (method.getName().equals("end")) {
System.out.println("end not implemented");
}
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java
index 42367320bad2b8424116d48346df4da68b69f14d..34fd7edcde8e702d56cb02a4a3b3044b88c1facf 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java
@@ -22,6 +22,8 @@ public abstract class OpenCLJNI{
protected native void invoke(OpenCLKernel openCLKernel, Object[] args);
+ protected native void dispose(OpenCLKernel openCLKernel);
+
protected native void remap(OpenCLProgram program, OpenCLMem mem, long address);
protected native byte[] getBytes(String className);
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java
index 78c3eb22379bcde90c0915d22aee7af57fbac3ca..04a95501b7dd15d36fa32a5161f2e5f9bfedc5d9 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java
@@ -56,4 +56,8 @@ public class OpenCLKernel extends OpenCLJNI{
public void invoke(Object[] _args) {
invoke(this, _args);
}
+
+ public void dispose(){
+ dispose(this);
+ }
}
diff --git a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
index d384b77ac1eaf214d70aba4932647864ac387057..cce44e44c90ca8b91f892536c37508082d2263fd 100644
--- a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
+++ b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
@@ -69,6 +69,8 @@ public class SquareExample{
for (int i = 0; i < size; i++) {
System.out.println(in[i] + " " + squares[i] + " " + quads[i]);
}
+
+ squarer.dispose();
}
}
}