diff options
author | Michael Bien <[email protected]> | 2010-01-22 18:02:35 +0100 |
---|---|---|
committer | Michael Bien <[email protected]> | 2010-01-22 18:02:35 +0100 |
commit | 9ca000faa6aea6771ff5cf209846ef7fb9ff227a (patch) | |
tree | 9c4494df5b3fd688a993c4e1672934950cb8919d /src | |
parent | 468928edc68896718f0a27b47d59ddad2c892967 (diff) |
dynamic dispatch via CLProcAddressTable for OpenCL extensions.
made CLProgram failsafe, updated tests.
Diffstat (limited to 'src')
-rw-r--r-- | src/com/mbien/opencl/CLProgram.java | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/com/mbien/opencl/CLProgram.java b/src/com/mbien/opencl/CLProgram.java index 306a5b66..39663e54 100644 --- a/src/com/mbien/opencl/CLProgram.java +++ b/src/com/mbien/opencl/CLProgram.java @@ -29,6 +29,7 @@ public class CLProgram implements CLResource { private Map<CLDevice, Status> buildStatusMap; private boolean executable; + private boolean released; CLProgram(CLContext context, String src) { @@ -127,10 +128,12 @@ public class CLProgram implements CLResource { } } - // TODO serialization, program build options - private final String getBuildInfoString(long device, int flag) { + if(released) { + return ""; + } + PointerBuffer pb = PointerBuffer.allocateDirect(1); int ret = cl.clGetProgramBuildInfo(ID, device, flag, 0, null, pb); @@ -146,6 +149,10 @@ public class CLProgram implements CLResource { private final String getProgramInfoString(int flag) { + if(released) { + return ""; + } + PointerBuffer pb = PointerBuffer.allocateDirect(1); int ret = cl.clGetProgramInfo(ID, flag, 0, null, pb); @@ -254,6 +261,10 @@ public class CLProgram implements CLResource { releaseKernels(); + executable = false; + released = true; + buildStatusMap = null; + int ret = cl.clReleaseProgram(ID); context.onProgramReleased(this); checkForError(ret, "can not release program"); @@ -274,6 +285,9 @@ public class CLProgram implements CLResource { * @throws IllegalArgumentException when no kernel with the specified name exists in this program. */ public CLKernel getCLKernel(String kernelName) { + if(released) { + return null; + } initKernels(); final CLKernel kernel = kernels.get(kernelName); if(kernel == null) { @@ -289,6 +303,9 @@ public class CLProgram implements CLResource { * with the kernel function names as keys. */ public Map<String, CLKernel> getCLKernels() { + if(released) { + return Collections.emptyMap(); + } initKernels(); return Collections.unmodifiableMap(kernels); } @@ -297,7 +314,9 @@ public class CLProgram implements CLResource { * Returns all devices associated with this program. */ public CLDevice[] getCLDevices() { - + if(released) { + return new CLDevice[0]; + } PointerBuffer pb = PointerBuffer.allocateDirect(1); int ret = cl.clGetProgramInfo(ID, CL_PROGRAM_DEVICES, 0, null, pb); checkForError(ret, "on clGetProgramInfo"); @@ -321,6 +340,9 @@ public class CLProgram implements CLResource { * implementation dependent. */ public String getBuildLog() { + if(released) { + return ""; + } StringBuilder sb = new StringBuilder(); CLDevice[] devices = getCLDevices(); for (int i = 0; i < devices.length; i++) { @@ -338,6 +360,9 @@ public class CLProgram implements CLResource { * Returns the build status enum of this program for each device as Map. */ public Map<CLDevice,Status> getBuildStatus() { + if(released) { + return Collections.emptyMap(); + } initBuildStatus(); return buildStatusMap; } @@ -347,6 +372,9 @@ public class CLProgram implements CLResource { * of this program exists. */ public boolean isExecutable() { + if(released) { + return false; + } initBuildStatus(); return executable; } @@ -363,6 +391,9 @@ public class CLProgram implements CLResource { * Returns the build status enum for this program on the specified device. */ public Status getBuildStatus(CLDevice device) { + if(released) { + return Status.BUILD_NONE; + } int clStatus = getBuildInfoInt(device.ID, CL_PROGRAM_BUILD_STATUS); return Status.valueOf(clStatus); } @@ -381,6 +412,10 @@ public class CLProgram implements CLResource { */ public Map<CLDevice, byte[]> getBinaries() { + if(!isExecutable()) { + return Collections.emptyMap(); + } + CLDevice[] devices = getCLDevices(); ByteBuffer sizes = ByteBuffer.allocateDirect(8*devices.length).order(ByteOrder.nativeOrder()); |