浏览代码

added first version of the cl wrapper in CL.java, contains a subset of the OpenCL specification

shamanDevel 9 年之前
父节点
当前提交
195a5a69be

+ 4 - 0
jme3-core/src/main/java/com/jme3/opencl/Buffer.java

@@ -127,4 +127,8 @@ public class Buffer {
 	}
 	
 	//TODO: async mapping
+	
+	//TODO: clEnqueueFillBuffer
+	
+	//TODO: image read/write
 }

+ 143 - 0
jme3-core/src/main/java/com/jme3/opencl/CL.java

@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2009-2016 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.opencl;
+
+import java.nio.*;
+
+/**
+ * Interface for OpenCL implementations
+ * @author Sebastian Weiss
+ */
+public interface CL {
+	
+	//temp buffers for argument passing
+	public static class TempBuffer {
+		/**
+		 * 16-Bytes (4 floats) of a byte buffer
+		 */
+		public final ByteBuffer b16;
+		/**
+		 * Short-buffer view on b16
+		 */
+		public final ShortBuffer b16s;
+		/**
+		 * int buffer view on b16
+		 */
+		public final IntBuffer b16i;
+		/**
+		 * long buffer view on b16
+		 */
+		public final LongBuffer b16l;
+		/**
+		 * float buffer view on b16
+		 */
+		public final FloatBuffer b16f;
+		/**
+		 * double buffer view on b16
+		 */
+		public final DoubleBuffer b16d;
+
+		public TempBuffer(ByteBuffer b16) {
+			this.b16 = b16;
+			b16.rewind();
+			this.b16s = b16.asShortBuffer();
+			this.b16i = b16.asIntBuffer();
+			this.b16l = b16.asLongBuffer();
+			this.b16f = b16.asFloatBuffer();
+			this.b16d = b16.asDoubleBuffer();
+		}
+	}
+	/**
+	 * Returns up to 4 temp buffer instances
+	 * @return 
+	 */
+	TempBuffer[] getTempBuffers();
+	
+	//entry point
+	long getContext();
+	
+	//OpenCL functions
+	long clCreateCommandQueue(long context, long device, boolean profiling);
+	void clReleaseCommandQueue(long queue);
+	
+	long clCreateBuffer(long context, MemoryAccess access, int size, ByteBuffer hostPtr);
+	long clEnqueueReadBuffer(long queue, long buffer, boolean blocking, int offset, int size, ByteBuffer ptr);
+	long clEnqueueWriteBuffer(long queue, long buffer, boolean blocking, int offset, int size, ByteBuffer ptr);
+	long clEnqueueCopyBuffer(long queue, long srcBuffer, long dstBuffer, int srcOffset, int dstOffset, int size);
+	long clEnqueueFillBuffer(long queue, long buffer, ByteBuffer pattern, int patternSize, int offset, int size);
+	long clEnqueueMapBuffer(long queue, long buffer, boolean blocking, MappingAccess flags, int offset, int size);
+	
+	long clCreateImage(long context, MemoryAccess access, Context.ImageFormat format, Context.ImageDescriptor desc, ByteBuffer ptr);
+	Context.ImageFormat[] clGetSupportedImageFormats(long context, MemoryAccess ma, Context.ImageType type);
+	
+	long clEnqueueReadImage(long queue, long image, boolean blocking, ByteBuffer origin, ByteBuffer region, int rowPitch, int slicePitch, ByteBuffer ptr);
+	long clEnqueueWriteImage(long queue, long image, boolean blocking, ByteBuffer origin, ByteBuffer region, int inputRowPitch, int intputSlicePitch, ByteBuffer ptr);
+	long clEnqueueCopyImage(long queue, long srcImage, long dstImage, ByteBuffer srcOrigin, ByteBuffer dstOrigin, ByteBuffer region);
+	long clEnqueueFillImage(long queue, long image, ByteBuffer fillColor, ByteBuffer origin, ByteBuffer region);
+	
+	long clEnqueueCopyImageToBuffer(long queue, long srcImage, long dstBuffer, ByteBuffer srcOrigin, ByteBuffer region, int dstOffset);
+	long clEnqueueCopyBufferToImage(long queue, long srcBuffer, long dstImage, int srcOffset, ByteBuffer dstOrigin, ByteBuffer region);
+	
+	long clEnqueueMapImage(long queue, long image, boolean blocking, MappingAccess ma, ByteBuffer origin, ByteBuffer region, int rowPitch, int slicePitch);
+	//TODO: clGetImageInfo
+	
+	void clReleaseMemObject(long mem);
+	long clEnqueueUnmapMemObject(long queue, long mem, ByteBuffer ptr);
+	int getMemSize(long mem); //uses clGetMemObjectInfo
+	
+	long clCreateProgramWithSource(long context, CharSequence[] sources);
+	//TODO: create from binary
+	long clReleaseProgram(long program);
+	
+	void clBuildProgram(long program, long[] devices, CharSequence optpions) throws KernelCompilationException;
+	String getKernelNames(long program); //uses clGetProgramInfo
+	
+	long clCreateKernel(long program, String kernelName);
+	void clReleaseKernel(long kernel);
+	void clSetKernelArg(long kernel, int argIndex, int argSize, ByteBuffer argValue);
+	String getKernelName(long kernel); //uses clGetKernelInfo
+	int getKernelNumArgs(long kernel); //uses clGetKernelInfo
+	//TODO: clGetKernelWorkGroupInfo
+	
+	long clEnqueueNDRangeKernel(long queue, long kernel, int workDim,
+			ByteBuffer globalWorkOffset, ByteBuffer globalWorkSize, ByteBuffer localWorkSize);
+	
+	void clWaitForEvents(long[] events);
+	void clWaitForEvent(long event);
+	boolean isEventCompleted(long event); //uses clGetEventInfo
+	void clReleaseEvent(long event);
+	
+	void clFlush(long queue);
+	void clFinish(long queue);
+	
+	
+}

+ 4 - 0
jme3-core/src/main/java/com/jme3/opencl/CommandQueue.java

@@ -119,6 +119,10 @@ public final class CommandQueue {
 	
 	//TODO: async mapping
 	
+	//TODO: clEnqueueFillBuffer
+	
+	//TODO: image read/write
+	
 	public void flush() {
 		throw new UnsupportedOperationException("not supported yet");
 	}

+ 4 - 0
jme3-core/src/main/java/com/jme3/opencl/Context.java

@@ -52,6 +52,10 @@ public final class Context {
 		this.context = context;
 	}
 	
+	public List<? extends Device> getDevices() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	
 	public CommandQueue createQueue() {
 		throw new UnsupportedOperationException("not supported yet");
 	}

+ 174 - 0
jme3-core/src/main/java/com/jme3/opencl/Device.java

@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2009-2016 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.opencl;
+
+import java.util.Collection;
+
+/**
+ *
+ * @author Sebastian Weiss
+ */
+public final class Device {
+	private final long device;
+
+	public Device(long device) {
+		this.device = device;
+	}
+	
+	public static enum DeviceType {
+		DEFAULT,
+		CPU,
+		GPU,
+		ACCELEARTOR,
+		ALL
+	}
+	public DeviceType getDeviceType() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getVendorId() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean isAvailable() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getPCIeBus() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	
+	public boolean hasCompiler() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean hasDouble() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean hasHalfFloat() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean hasErrorCorrectingMemory() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean hasUnifiedMemory() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean hasImageSupport() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean hasExtension(String extension) {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public Collection<? extends String> getExtensions() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	
+	public int getComputeUnits() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getClockFrequency() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getAddressBits() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public boolean isLittleEndian() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	
+	public int getMaximumWorkItemDimensions() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int[] getMaximumWorkItemSizes() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getMaxiumWorkItemsPerGroup() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	
+	public int getMaximumSamplers() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getMaximumReadImages() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getMaximumWriteImages() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int[] getMaximumImage2DSize() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int[] getMaximumImage3DSize() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	
+	//TODO: cache, prefered sizes properties
+	
+	public String getProfile() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public String getVersion() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getVersionMajor() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getVersionMinor() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public String getCompilerVersion() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getCompilerVersionMajor() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getCompilerVersionMinor() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public String getDriverVersion() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getDriverVersionMajor() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public int getDriverVersionMinor() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public String getName() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+	public String getVendor() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+
+	@Override
+	public String toString() {
+		throw new UnsupportedOperationException("not supported yet");
+	}
+}

+ 48 - 0
jme3-core/src/main/java/com/jme3/opencl/KernelCompilationException.java

@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2009-2016 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.opencl;
+
+
+public class KernelCompilationException extends OpenCLException {
+
+	private final String log;
+	
+	public KernelCompilationException(String msg, int errorCode, String log) {
+		super(msg, errorCode);
+		this.log = log;
+	}
+
+	public String getLog() {
+		return log;
+	}
+
+}

+ 71 - 0
jme3-core/src/main/java/com/jme3/opencl/OpenCLException.java

@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2009-2016 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.opencl;
+
+/**
+ *
+ * @author Sebastian Weiss
+ */
+public class OpenCLException extends Exception {
+
+	private final int errorCode;
+	
+	/**
+	 * Creates a new instance of <code>OpenCLExceptionn</code> without detail
+	 * message.
+	 */
+	public OpenCLException() {
+		errorCode = 0;
+	}
+
+	/**
+	 * Constructs an instance of <code>OpenCLExceptionn</code> with the
+	 * specified detail message.
+	 *
+	 * @param msg the detail message.
+	 */
+	public OpenCLException(String msg) {
+		super(msg);
+		errorCode = 0;
+	}
+	
+	public OpenCLException(String msg, int errorCode) {
+		super(msg);
+		this.errorCode = errorCode;
+	}
+
+	public int getErrorCode() {
+		return errorCode;
+	}
+
+	
+}