aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Bien <[email protected]>2011-05-26 02:01:18 +0200
committerMichael Bien <[email protected]>2011-05-26 02:01:18 +0200
commit08a479b22d4ba9da9ee79fc938ac4de7fb83dc5a (patch)
tree145abdd2ebc083e7167ccceb3d13a398c57a1dd0
parentcb859fd580d3e1f5afb3c0f77cee0a5e82a394bb (diff)
introduced CLAccessorFactory spi and threadlocal default impl for CLDevice and CLPlatform.
-rw-r--r--src/com/jogamp/opencl/CLDevice.java33
-rw-r--r--src/com/jogamp/opencl/CLEvent.java1
-rw-r--r--src/com/jogamp/opencl/CLImage.java1
-rw-r--r--src/com/jogamp/opencl/CLPlatform.java84
-rw-r--r--src/com/jogamp/opencl/CLSampler.java1
-rw-r--r--src/com/jogamp/opencl/impl/CLTLAccessorFactory.java92
-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.java18
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);
+
+}