diff options
author | Michael Bien <[email protected]> | 2010-06-24 23:05:04 +0200 |
---|---|---|
committer | Michael Bien <[email protected]> | 2010-06-24 23:05:04 +0200 |
commit | 735c9cbbec16457358eee7424a0533fcc1b8c64c (patch) | |
tree | 8014ee2ea69ec05f6dc25802bb0ab7f260cdc2d5 | |
parent | 9560f296e01e120279a01ad06189f71cd662ed42 (diff) |
added CLVersion utility class and corresponding API.
version checks in unit tests.
GLProfile.initSingleton() workaround in CLGLTest.
-rw-r--r-- | src/com/jogamp/opencl/CLPlatform.java | 40 | ||||
-rw-r--r-- | src/com/jogamp/opencl/CLVersion.java | 141 | ||||
-rw-r--r-- | src/com/jogamp/opencl/util/CLUtil.java | 3 | ||||
-rw-r--r-- | test/com/jogamp/opencl/CLCommandQueueTest.java | 24 | ||||
-rw-r--r-- | test/com/jogamp/opencl/HighLevelBindingTest.java | 3 | ||||
-rw-r--r-- | test/com/jogamp/opencl/gl/CLGLTest.java | 2 |
6 files changed, 207 insertions, 6 deletions
diff --git a/src/com/jogamp/opencl/CLPlatform.java b/src/com/jogamp/opencl/CLPlatform.java index 46715feb..84d6497f 100644 --- a/src/com/jogamp/opencl/CLPlatform.java +++ b/src/com/jogamp/opencl/CLPlatform.java @@ -39,6 +39,11 @@ public final class CLPlatform { */ public final long ID; + /** + * Version of this OpenCL platform. + */ + public final CLVersion version; + private static final CL cl; private Set<String> extensions; @@ -90,6 +95,7 @@ public final class CLPlatform { private CLPlatform(long id) { this.ID = id; + this.version = new CLVersion(getInfoString(CL_PLATFORM_VERSION)); } /** @@ -248,10 +254,31 @@ public final class CLPlatform { } /** - * Returns the platform version. + * Returns the OpenCL version supported by this platform. + */ + public CLVersion getVersion() { + return version; + } + + /** + * Returns the OpenCL Specification version supported by this platform. */ - public String getVersion() { - return getInfoString(CL_PLATFORM_VERSION); + public String getSpecVersion() { + return version.getSpecVersion(); + } + + /** + * @see CLVersion#isAtLeast(com.jogamp.opencl.CLVersion) + */ + public boolean isAtLeast(CLVersion other) { + return version.isAtLeast(other); + } + + /** + * @see CLVersion#isAtLeast(int, int) + */ + public boolean isAtLeast(int major, int minor) { + return version.isAtLeast(major, minor); } /** @@ -269,6 +296,13 @@ public final class CLPlatform { } /** + * Returns the ICD suffix. + */ + public String getICDSuffix() { + return getInfoString(CL_PLATFORM_ICD_SUFFIX_KHR); + } + + /** * Returns true if the extension is supported on this platform. */ public boolean isExtensionAvailable(String extension) { diff --git a/src/com/jogamp/opencl/CLVersion.java b/src/com/jogamp/opencl/CLVersion.java new file mode 100644 index 00000000..e8a7e79c --- /dev/null +++ b/src/com/jogamp/opencl/CLVersion.java @@ -0,0 +1,141 @@ +/* + * Created on Thursday, June 24 2010 05:38 + */ +package com.jogamp.opencl; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Version of an OpenCL Implementation. + * All comparison operations use the {@link #getSpecVersion()} for comparison. + * @author Michael Bien + */ +public class CLVersion implements Comparable<CLVersion> { + + private final static Pattern pattern = Pattern.compile("OpenCL (\\d+)\\.(\\d+)(.*)"); + + public final static CLVersion CL_1_0 = new CLVersion("OpenCL 1.0"); + public final static CLVersion CL_1_1 = new CLVersion("OpenCL 1.1"); + + /** + * The full version String is defined as: + * <code>OpenCL[space][major_version].[minor_version][space][platform-specific information]</code> + */ + public final String fullversion; + /** + * The platform specific part of the version string. + * @see #fullversion + */ + public final String implversion; + /** + * Minor version number. + * @see #fullversion + */ + public final short minor; + /** + * Mayor version number. + * @see #fullversion + */ + public final short major; + + protected CLVersion(String version) { + this.fullversion = version; + Matcher matcher = pattern.matcher(version); + matcher.matches(); + major = Short.parseShort(matcher.group(1)); + minor = Short.parseShort(matcher.group(2)); + + if(matcher.groupCount() == 4) {//first group == whole string + implversion = matcher.group(3).substring(1); + }else{ + implversion = ""; + } + } + + public int compareTo(CLVersion other) { + return compareTo(other.major, other.minor); + } + + private int compareTo(int otherMajor, int otherMinor) { + if(otherMajor == major && otherMinor == minor) { + return 0; + }else if(this.major > otherMajor || (this.major == otherMajor && this.minor > otherMinor)) { + return 1; + }else{ + return -1; + } + } + + public boolean isAtLeast(CLVersion other) { + return this.compareTo(other) >= 0; + } + + public boolean isAtLeast(int major, int minor) { + return this.compareTo(major, minor) >= 0; + } + + public boolean isEqual(CLVersion other) { + return this.isEqual(other.major, other.minor); + } + + public boolean isEqual(int major, int minor) { + return this.major == major && this.minor == minor; + } + + /** + * Returns <code>'"OpenCL " + major + "." + minor'</code>. + */ + public String getSpecVersion() { + return "OpenCL " + major + '.' + minor; + } + + /** + * Returns the full, unfiltered version string. + * @see #fullversion + */ + public String getFullVersion() { + return fullversion; + } + + /** + * @see #implversion + */ + public String getImplVersion() { + return implversion; + } + + /** + * @see #major + */ + public short getMajor() { + return major; + } + + /** + * @see #minor + */ + public short getMinor() { + return minor; + } + + @Override + public String toString() { + return getFullVersion(); + } + + @Override + public int hashCode() { + return fullversion.hashCode(); + } + + /** + * Returns true if both {@link #fullversion} Strings match. + */ + @Override + public boolean equals(Object obj) { + return obj != null && fullversion.equals(obj); + } + + +} diff --git a/src/com/jogamp/opencl/util/CLUtil.java b/src/com/jogamp/opencl/util/CLUtil.java index 6649698c..973c0dc9 100644 --- a/src/com/jogamp/opencl/util/CLUtil.java +++ b/src/com/jogamp/opencl/util/CLUtil.java @@ -47,8 +47,9 @@ public class CLUtil { Map<String, String> map = new LinkedHashMap<String, String>(); map.put("CL_PLATFORM_NAME", platform.getName()); map.put("CL_PLATFORM_PROFILE", platform.getProfile()); - map.put("CL_PLATFORM_VERSION", platform.getVersion()); + map.put("CL_PLATFORM_VERSION", platform.getVersion().toString()); map.put("CL_PLATFORM_VENDOR", platform.getVendor()); + map.put("CL_PLATFORM_ICD_SUFFIX", platform.getICDSuffix()); map.put("CL_PLATFORM_EXTENSIONS", platform.getExtensions().toString()); // map.put("fastest device (estimated)", platform.getMaxFlopsDevice().toString()); diff --git a/test/com/jogamp/opencl/CLCommandQueueTest.java b/test/com/jogamp/opencl/CLCommandQueueTest.java index 3df894e5..0ea1cae4 100644 --- a/test/com/jogamp/opencl/CLCommandQueueTest.java +++ b/test/com/jogamp/opencl/CLCommandQueueTest.java @@ -12,6 +12,7 @@ import static org.junit.Assert.*; import static java.lang.System.*; import static com.jogamp.opencl.TestUtils.*; import static com.jogamp.opencl.CLEvent.*; +import static com.jogamp.opencl.CLVersion.*; import static com.jogamp.common.nio.Buffers.*; /** @@ -167,7 +168,28 @@ public class CLCommandQueueTest { final int elements = roundUp(groupSize, ONE_MB / SIZEOF_INT * 5); // 5MB per buffer - final CLContext context = CLContext.create(); + // 5MB per buffer + CLPlatform[] platforms = CLPlatform.listCLPlatforms(); + CLPlatform theChosenOne = platforms[0]; + for (CLPlatform platform : platforms) { + if(platform.isAtLeast(CL_1_1)) { + theChosenOne = platform; + break; + } + } + + final CLContext context = CLContext.create(theChosenOne); + + // we expect an UOE if CL 1.1 is not supported + if(!theChosenOne.isAtLeast(CL_1_1)) { + try{ + CLUserEvent.create(context); + fail(""); + }catch(UnsupportedOperationException ex) { + out.println("test dissabled, required CLVersion: "+CL_1_1+" available: "+theChosenOne.getVersion()); + return; + } + } try{ diff --git a/test/com/jogamp/opencl/HighLevelBindingTest.java b/test/com/jogamp/opencl/HighLevelBindingTest.java index e08fadc7..588be480 100644 --- a/test/com/jogamp/opencl/HighLevelBindingTest.java +++ b/test/com/jogamp/opencl/HighLevelBindingTest.java @@ -108,7 +108,8 @@ public class HighLevelBindingTest { out.println(" name: "+platform.getName()); out.println(" id: "+platform.ID); out.println(" profile: "+platform.getProfile()); - out.println(" version: "+platform.getVersion()); + out.println(" spec version: "+platform.getSpecVersion()); + out.println(" impl version: "+platform.getVersion().getImplVersion()); out.println(" vendor: "+platform.getVendor()); out.println(" max FLOPS device: "+platform.getMaxFlopsDevice()); out.println(" extensions: "+platform.getExtensions()); diff --git a/test/com/jogamp/opencl/gl/CLGLTest.java b/test/com/jogamp/opencl/gl/CLGLTest.java index b7dfe1dc..1fa582b8 100644 --- a/test/com/jogamp/opencl/gl/CLGLTest.java +++ b/test/com/jogamp/opencl/gl/CLGLTest.java @@ -34,6 +34,8 @@ public class CLGLTest { @BeforeClass public static void init() { + GLProfile.initSingleton(); + Display display = NewtFactory.createDisplay(null); // local display assertNotNull(display); |