diff options
-rw-r--r-- | src/com/jogamp/opencl/CLDevice.java | 33 | ||||
-rw-r--r-- | src/com/jogamp/opencl/CLEvent.java | 1 | ||||
-rw-r--r-- | src/com/jogamp/opencl/CLImage.java | 1 | ||||
-rw-r--r-- | src/com/jogamp/opencl/CLPlatform.java | 84 | ||||
-rw-r--r-- | src/com/jogamp/opencl/CLSampler.java | 1 | ||||
-rw-r--r-- | src/com/jogamp/opencl/impl/CLTLAccessorFactory.java | 92 | ||||
-rw-r--r-- | src/com/jogamp/opencl/impl/CLTLInfoAccessor.java (renamed from src/com/jogamp/opencl/CLTLInfoAccessor.java) | 2 | ||||
-rw-r--r-- | src/com/jogamp/opencl/spi/CLAccessorFactory.java | 18 |
8 files changed, 156 insertions, 76 deletions
diff --git a/src/com/jogamp/opencl/CLDevice.java b/src/com/jogamp/opencl/CLDevice.java index 84a27f33..6ca4cf38 100644 --- a/src/com/jogamp/opencl/CLDevice.java +++ b/src/com/jogamp/opencl/CLDevice.java @@ -29,9 +29,7 @@ package com.jogamp.opencl; import com.jogamp.opencl.util.CLUtil; -import com.jogamp.common.nio.NativeSizeBuffer; import com.jogamp.opencl.spi.CLInfoAccessor; -import java.nio.Buffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collections; @@ -59,22 +57,16 @@ public class CLDevice extends CLObject { private final CLInfoAccessor deviceInfo; private final CLPlatform platform; - CLDevice(CL cl, CLPlatform platform, long id) { + protected CLDevice(CL cl, CLPlatform platform, long id) { super(cl, id); this.platform = platform; - this.deviceInfo = new CLDeviceInfoAccessor(cl, id); + this.deviceInfo = platform.getAccessorFactory().createDeviceInfoAccessor(cl, id); } - protected CLDevice(CL cl, CLPlatform platform, CLInfoAccessor deviceAccessor, long id) { - super(cl, id); - this.platform = platform; - this.deviceInfo = deviceAccessor; - } - - CLDevice(CLContext context, long id) { + protected CLDevice(CLContext context, long id) { super(context, id); this.platform = context.getPlatform(); - this.deviceInfo = new CLDeviceInfoAccessor(context.getCL(), id); + this.deviceInfo = platform.getAccessorFactory().createDeviceInfoAccessor(cl, id); } public CLCommandQueue createCommandQueue() { @@ -698,21 +690,8 @@ public class CLDevice extends CLObject { return CLUtil.obtainDeviceProperties(this); } - private final static class CLDeviceInfoAccessor extends CLTLInfoAccessor { - - private final CL cl; - private final long ID; - - private CLDeviceInfoAccessor(CL cl, long id) { - this.cl = cl; - this.ID = id; - } - - @Override - protected int getInfo(int name, long valueSize, Buffer value, NativeSizeBuffer valueSizeRet) { - return cl.clGetDeviceInfo(ID, name, valueSize, value, valueSizeRet); - } - + public final CLInfoAccessor getCLAccessor() { + return deviceInfo; } @Override diff --git a/src/com/jogamp/opencl/CLEvent.java b/src/com/jogamp/opencl/CLEvent.java index a48e4fef..52b316da 100644 --- a/src/com/jogamp/opencl/CLEvent.java +++ b/src/com/jogamp/opencl/CLEvent.java @@ -28,6 +28,7 @@ package com.jogamp.opencl; +import com.jogamp.opencl.impl.CLTLInfoAccessor; import com.jogamp.opencl.impl.CLEventCallback; import com.jogamp.common.nio.NativeSizeBuffer; import java.nio.Buffer; diff --git a/src/com/jogamp/opencl/CLImage.java b/src/com/jogamp/opencl/CLImage.java index 48f3934f..76993d62 100644 --- a/src/com/jogamp/opencl/CLImage.java +++ b/src/com/jogamp/opencl/CLImage.java @@ -28,6 +28,7 @@ package com.jogamp.opencl; +import com.jogamp.opencl.impl.CLTLInfoAccessor; import com.jogamp.common.nio.NativeSizeBuffer; import java.nio.Buffer; diff --git a/src/com/jogamp/opencl/CLPlatform.java b/src/com/jogamp/opencl/CLPlatform.java index 684f006b..4a87b43d 100644 --- a/src/com/jogamp/opencl/CLPlatform.java +++ b/src/com/jogamp/opencl/CLPlatform.java @@ -28,6 +28,7 @@ package com.jogamp.opencl; +import com.jogamp.opencl.impl.CLTLAccessorFactory; import com.jogamp.common.nio.Buffers; import com.jogamp.common.os.DynamicLookupHelper; import com.jogamp.common.JogampRuntimeException; @@ -38,10 +39,10 @@ import com.jogamp.opencl.spi.CLPlatformInfoAccessor; import com.jogamp.opencl.util.CLUtil; import com.jogamp.opencl.impl.CLImpl; import com.jogamp.opencl.impl.CLProcAddressTable; +import com.jogamp.opencl.spi.CLAccessorFactory; import com.jogamp.opencl.util.Filter; import com.jogamp.opencl.util.JOCLVersion; -import java.nio.Buffer; import java.nio.IntBuffer; import java.util.ArrayList; import java.util.Collections; @@ -104,22 +105,26 @@ public class CLPlatform { public final CLVersion version; protected static CL cl; + private static CLAccessorFactory defaultFactory; + private final CLAccessorFactory factory; private Set<String> extensions; protected final CLPlatformInfoAccessor info; private CLPlatform(long id) { - initialize(); - this.ID = id; - this.info = new CLTLPlatformInfoAccessor(id, cl); - this.version = new CLVersion(getInfoString(CL_PLATFORM_VERSION)); + this(id, null); } - protected CLPlatform(long id, CLPlatformInfoAccessor accessor) { + protected CLPlatform(long id, CLAccessorFactory factory) { initialize(); this.ID = id; - this.info = accessor; + if(factory == null) { + this.factory = defaultFactory; + }else{ + this.factory = factory; + } + this.info = this.factory.createPlatformInfoAccessor(cl, id); this.version = new CLVersion(getInfoString(CL_PLATFORM_VERSION)); } @@ -127,11 +132,29 @@ public class CLPlatform { * Eagerly initializes JOCL. Subsequent calls do nothing. * @throws JogampRuntimeException if something went wrong in the initialization (e.g. OpenCL lib not found). */ - public synchronized static void initialize() throws JogampRuntimeException { + public static void initialize() throws JogampRuntimeException { + initialize(null); + } + + // keep package private until SPI is stablized + /** + * Eagerly initializes JOCL. Subsequent calls do nothing. + * @param factory CLAccessorFactory used for creating the bindings. + * @throws JogampRuntimeException if something went wrong in the initialization (e.g. OpenCL lib not found). + */ + synchronized static void initialize(CLAccessorFactory factory) throws JogampRuntimeException { if(cl != null) { return; } + + if(defaultFactory == null) { + if(factory == null) { + defaultFactory = new CLTLAccessorFactory(); + }else{ + defaultFactory = factory; + } + } try { @@ -507,47 +530,12 @@ public class CLPlatform { return info.getString(key); } - private final static class CLTLPlatformInfoAccessor extends CLTLInfoAccessor implements CLPlatformInfoAccessor { - - private final long ID; - private final CL cl; - - private CLTLPlatformInfoAccessor(long id, CL cl) { - this.ID = id; - this.cl = cl; - } - - @Override - protected int getInfo(int name, long valueSize, Buffer value, NativeSizeBuffer valueSizeRet) { - return cl.clGetPlatformInfo(ID, name, valueSize, value, valueSizeRet); - } - - @Override - public long[] getDeviceIDs(long type) { - - IntBuffer buffer = getBB(4).asIntBuffer(); - int ret = cl.clGetDeviceIDs(ID, type, 0, null, buffer); - int count = buffer.get(0); - - // return an empty buffer rather than throwing an exception - if(ret == CL.CL_DEVICE_NOT_FOUND || count == 0) { - return new long[0]; - }else{ - checkForError(ret, "error while enumerating devices"); - - NativeSizeBuffer deviceIDs = NativeSizeBuffer.wrap(getBB(count*NativeSizeBuffer.elementSize())); - ret = cl.clGetDeviceIDs(ID, type, count, deviceIDs, null); - checkForError(ret, "error while enumerating devices"); - - long[] ids = new long[count]; - for (int i = 0; i < ids.length; i++) { - ids[i] = deviceIDs.get(i); - } - return ids; - } - - } + final CLAccessorFactory getAccessorFactory(){ + return factory; + } + public final CLPlatformInfoAccessor getCLAccessor(){ + return info; } @Override diff --git a/src/com/jogamp/opencl/CLSampler.java b/src/com/jogamp/opencl/CLSampler.java index 63e25cb4..015445e3 100644 --- a/src/com/jogamp/opencl/CLSampler.java +++ b/src/com/jogamp/opencl/CLSampler.java @@ -28,6 +28,7 @@ package com.jogamp.opencl; +import com.jogamp.opencl.impl.CLTLInfoAccessor; import com.jogamp.common.nio.NativeSizeBuffer; import java.nio.Buffer; diff --git a/src/com/jogamp/opencl/impl/CLTLAccessorFactory.java b/src/com/jogamp/opencl/impl/CLTLAccessorFactory.java new file mode 100644 index 00000000..1c7f9526 --- /dev/null +++ b/src/com/jogamp/opencl/impl/CLTLAccessorFactory.java @@ -0,0 +1,92 @@ +/* + * Created on Wednesday, May 25 2011 00:57 + */ +package com.jogamp.opencl.impl; + +import java.nio.IntBuffer; +import com.jogamp.common.nio.NativeSizeBuffer; +import com.jogamp.opencl.CL; +import com.jogamp.opencl.spi.CLAccessorFactory; +import com.jogamp.opencl.spi.CLInfoAccessor; +import com.jogamp.opencl.spi.CLPlatformInfoAccessor; +import java.nio.Buffer; + +import static com.jogamp.opencl.CLException.*; + +/** + * + * @author Michael Bien + */ +public class CLTLAccessorFactory implements CLAccessorFactory { + + @Override + public CLInfoAccessor createDeviceInfoAccessor(CL cl, long id) { + return new CLDeviceInfoAccessor(cl, id); + } + + @Override + public CLPlatformInfoAccessor createPlatformInfoAccessor(CL cl, long id) { + return new CLTLPlatformInfoAccessor(cl, id); + } + + private final static class CLDeviceInfoAccessor extends CLTLInfoAccessor { + + private final CL cl; + private final long ID; + + private CLDeviceInfoAccessor(CL cl, long id) { + this.cl = cl; + this.ID = id; + } + + @Override + public int getInfo(int name, long valueSize, Buffer value, NativeSizeBuffer valueSizeRet) { + return cl.clGetDeviceInfo(ID, name, valueSize, value, valueSizeRet); + } + + } + + private final static class CLTLPlatformInfoAccessor extends CLTLInfoAccessor implements CLPlatformInfoAccessor { + + private final long ID; + private final CL cl; + + private CLTLPlatformInfoAccessor(CL cl, long id) { + this.ID = id; + this.cl = cl; + } + + @Override + public int getInfo(int name, long valueSize, Buffer value, NativeSizeBuffer valueSizeRet) { + return cl.clGetPlatformInfo(ID, name, valueSize, value, valueSizeRet); + } + + @Override + public long[] getDeviceIDs(long type) { + + IntBuffer buffer = getBB(4).asIntBuffer(); + int ret = cl.clGetDeviceIDs(ID, type, 0, null, buffer); + int count = buffer.get(0); + + // return an empty buffer rather than throwing an exception + if(ret == CL.CL_DEVICE_NOT_FOUND || count == 0) { + return new long[0]; + }else{ + checkForError(ret, "error while enumerating devices"); + + NativeSizeBuffer deviceIDs = NativeSizeBuffer.wrap(getBB(count*NativeSizeBuffer.elementSize())); + ret = cl.clGetDeviceIDs(ID, type, count, deviceIDs, null); + checkForError(ret, "error while enumerating devices"); + + long[] ids = new long[count]; + for (int i = 0; i < ids.length; i++) { + ids[i] = deviceIDs.get(i); + } + return ids; + } + + } + + } + +} diff --git a/src/com/jogamp/opencl/CLTLInfoAccessor.java b/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java index 286dbe6b..ee5d0e47 100644 --- a/src/com/jogamp/opencl/CLTLInfoAccessor.java +++ b/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java @@ -26,7 +26,7 @@ * or implied, of JogAmp Community. */ -package com.jogamp.opencl; +package com.jogamp.opencl.impl; import com.jogamp.opencl.spi.CLInfoAccessor; import com.jogamp.common.nio.NativeSizeBuffer; diff --git a/src/com/jogamp/opencl/spi/CLAccessorFactory.java b/src/com/jogamp/opencl/spi/CLAccessorFactory.java new file mode 100644 index 00000000..6239bb37 --- /dev/null +++ b/src/com/jogamp/opencl/spi/CLAccessorFactory.java @@ -0,0 +1,18 @@ +/* + * Created on Wednesday, May 25 2011 00:53 + */ +package com.jogamp.opencl.spi; + +import com.jogamp.opencl.CL; + +/** + * Implementations of this interface are factories responsible for creating CLAccessors. + * @author Michael Bien + */ +public interface CLAccessorFactory { + + CLInfoAccessor createDeviceInfoAccessor(CL cl, long id); + + CLPlatformInfoAccessor createPlatformInfoAccessor(CL cl, long id); + +} |