Querying the program binaries won't be supported by the Jocl binding.

See the comments inside JoclProgram.getBinary for the reason.
define_list_fix
shamanDevel 9 years ago
parent 22307257e0
commit efef3d54e1
  1. 6
      jme3-jogl/src/main/java/com/jme3/opencl/jocl/JoclContext.java
  2. 35
      jme3-jogl/src/main/java/com/jme3/opencl/jocl/JoclProgram.java

@ -222,6 +222,12 @@ public class JoclContext extends Context {
return new JoclProgram(p, this); return new JoclProgram(p, this);
} }
@Override
public Program createProgramFromBinary(ByteBuffer binaries, Device device) {
//Not supported because JoclProgram.getBinaries is also not supported.
throw new UnsupportedOperationException("No supported by Jocl");
}
private static class ReleaserImpl implements ObjectReleaser { private static class ReleaserImpl implements ObjectReleaser {
private long id; private long id;
private final List<JoclDevice> devices; private final List<JoclDevice> devices;

@ -31,12 +31,10 @@
*/ */
package com.jme3.opencl.jocl; package com.jme3.opencl.jocl;
import com.jme3.opencl.Kernel; import com.jme3.opencl.*;
import com.jme3.opencl.KernelCompilationException;
import com.jme3.opencl.OpenCLObjectManager;
import com.jme3.opencl.Program;
import com.jogamp.common.nio.PointerBuffer; import com.jogamp.common.nio.PointerBuffer;
import com.jogamp.opencl.CLPlatform; import com.jogamp.opencl.CLPlatform;
import com.jogamp.opencl.CLProgram;
import com.jogamp.opencl.llb.CL; import com.jogamp.opencl.llb.CL;
import com.jogamp.opencl.util.CLUtil; import com.jogamp.opencl.util.CLUtil;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@ -44,8 +42,6 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import static com.jogamp.common.nio.Buffers.newDirectByteBuffer; import static com.jogamp.common.nio.Buffers.newDirectByteBuffer;
import static com.jogamp.opencl.CLException.newException;
import static com.jogamp.opencl.llb.CL.CL_SUCCESS;
/** /**
* *
* @author shaman * @author shaman
@ -65,8 +61,18 @@ public class JoclProgram extends Program {
} }
@Override @Override
public void build(String args) throws KernelCompilationException { public void build(String args, Device... devices) throws KernelCompilationException {
int ret = cl.clBuildProgram(program, 0, null, args, null); PointerBuffer deviceList = null;
int deviceCount = 0;
if (devices != null) {
deviceList = PointerBuffer.allocateDirect(devices.length);
for (Device d : devices) {
deviceList.put(((JoclDevice) d).id);
}
deviceCount = devices.length;
deviceList.rewind();
}
int ret = cl.clBuildProgram(program, deviceCount, deviceList, args, null);
if (ret != CL.CL_SUCCESS) { if (ret != CL.CL_SUCCESS) {
String log = Log(); String log = Log();
LOG.log(Level.WARNING, "Unable to compile program:\n{0}", log); LOG.log(Level.WARNING, "Unable to compile program:\n{0}", log);
@ -126,6 +132,19 @@ public class JoclProgram extends Program {
return kx; return kx;
} }
@Override
public ByteBuffer getBinary(Device device) {
//There is no way to do this in Jocl:
//The low-level bindings need a buffer of adresses to buffers. For that
//the class InternalBufferUtil is used, but this class is not public.
//I also can't create a temporal instance of CLProgram because the constructor
//that takes only the native pointer is private.
//So the only way would be to create the CLProgram directly from the beginning.
//I don't want to do this because then I would have to use the whole
//bunch of garbage the CLProgram class is doing in background.
throw new UnsupportedOperationException("Jocl does not expose this operation");
}
private static class ReleaserImpl implements ObjectReleaser { private static class ReleaserImpl implements ObjectReleaser {
private long program; private long program;
private ReleaserImpl(long program) { private ReleaserImpl(long program) {

Loading…
Cancel
Save