From bb15931fa2c50ef16c1cd10efc7f2236478e15bc Mon Sep 17 00:00:00 2001 From: shamanDevel Date: Mon, 18 Apr 2016 18:30:32 +0200 Subject: [PATCH] started with context creation --- .../src/main/java/com/jme3/opencl/CL.java | 229 +++++++------ .../java/com/jme3/opencl/CommandQueue.java | 199 ++++++----- .../main/java/com/jme3/opencl/Context.java | 259 ++++++++------- .../src/main/java/com/jme3/opencl/Kernel.java | 314 ++++++++++-------- .../java/com/jme3/opencl/NativeCLObject.java | 50 +++ .../java/com/jme3/system/AppSettings.java | 16 +- .../main/java/com/jme3/system/JmeContext.java | 5 + .../java/com/jme3/system/NullContext.java | 6 + .../com/jme3/system/awt/AwtPanelsContext.java | 6 + .../java/jme3test/gui/opencl/HelloOpenCL.java | 67 ++++ .../com/jme3/system/jogl/JoglContext.java | 17 + .../java/com/jme3/opencl/lwjgl/LwjglCL.java | 236 +++++++++++++ .../com/jme3/system/lwjgl/LwjglContext.java | 53 +++ .../com/jme3/system/lwjgl/LwjglDisplay.java | 4 + .../com/jme3/system/lwjgl/LwjglContext.java | 19 ++ 15 files changed, 1029 insertions(+), 451 deletions(-) create mode 100644 jme3-core/src/main/java/com/jme3/opencl/NativeCLObject.java create mode 100644 jme3-examples/src/main/java/jme3test/gui/opencl/HelloOpenCL.java create mode 100644 jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglCL.java diff --git a/jme3-core/src/main/java/com/jme3/opencl/CL.java b/jme3-core/src/main/java/com/jme3/opencl/CL.java index 71ae9d5b5..b7792ac49 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/CL.java +++ b/jme3-core/src/main/java/com/jme3/opencl/CL.java @@ -35,109 +35,136 @@ 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); + + //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); - - + + 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); + } diff --git a/jme3-core/src/main/java/com/jme3/opencl/CommandQueue.java b/jme3-core/src/main/java/com/jme3/opencl/CommandQueue.java index 6354677fa..6d070143b 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/CommandQueue.java +++ b/jme3-core/src/main/java/com/jme3/opencl/CommandQueue.java @@ -37,97 +37,116 @@ import java.nio.ByteBuffer; * * @author Sebastian Weiss */ -public final class CommandQueue { - private final long queue; - - public CommandQueue(long queue) { - this.queue = queue; - } - - public void read(Buffer src, ByteBuffer dest, int size, int offset) { - throw new UnsupportedOperationException("not supported yet"); - } - public void read(Buffer src, ByteBuffer dest, int size) { - read(src, dest, size, 0); - } - public void read(Buffer src, ByteBuffer dest) { - read(src, dest, src.getSize(), 0); - } - - public Event readAsync(Buffer src, ByteBuffer dest, int size, int offset) { - throw new UnsupportedOperationException("not supported yet"); - } - public Event readAsync(Buffer src, ByteBuffer dest, int size) { - return readAsync(src, dest, size, 0); - } - public Event readAsync(Buffer src, ByteBuffer dest) { - return readAsync(src, dest, src.getSize()); - } - - public void write(ByteBuffer src, Buffer dest, int size, int offset) { - throw new UnsupportedOperationException("not supported yet"); - } - public void write(ByteBuffer src, Buffer dest, int size) { - write(src, dest, size, 0); - } - public void write(ByteBuffer src, Buffer dest) { - write(src, dest, dest.getSize()); - } - - public Event writeAsync(ByteBuffer src, Buffer dest, int size, int offset) { - throw new UnsupportedOperationException("not supported yet"); - } - public Event writeAsync(ByteBuffer src, Buffer dest, int size) { - return writeAsync(src, dest, size, 0); - } - public Event writeAsync(ByteBuffer src, Buffer dest) { - return writeAsync(src, dest, dest.getSize()); - } - - public void copyTo(Buffer src, Buffer dest, int size, int srcOffset, int destOffset) { - throw new UnsupportedOperationException("not supported yet"); - } - public void copyTo(Buffer src, Buffer dest, int size) { - copyTo(src, dest, size, 0, 0); - } - public void copyTo(Buffer src, Buffer dest) { - copyTo(src, dest, src.getSize()); - } - - public Event copyToAsync(Buffer src, Buffer dest, int size, int srcOffset, int destOffset) { - throw new UnsupportedOperationException("not supported yet"); - } - public Event copyToAsync(Buffer src, Buffer dest, int size) { - return copyToAsync(src, dest, size, 0, 0); - } - public Event copyToAsync(Buffer src, Buffer dest) { - return copyToAsync(src, dest, src.getSize()); - } - - public ByteBuffer map(Buffer src, int size, int offset, MappingAccess access) { - throw new UnsupportedOperationException("not supported yet"); - } - public ByteBuffer map(Buffer src, int size, MappingAccess access) { - return map(src, size, 0, access); - } - public ByteBuffer map(Buffer src, MappingAccess access) { - return map(src, src.getSize(), access); - } - public void unmap(Buffer src, ByteBuffer ptr) { - throw new UnsupportedOperationException("not supported yet"); - } - +public final class CommandQueue extends NativeCLObject { + + private final long queue; + + public CommandQueue(long queue) { + this.queue = queue; + } + + public void read(Buffer src, ByteBuffer dest, int size, int offset) { + throw new UnsupportedOperationException("not supported yet"); + } + + public void read(Buffer src, ByteBuffer dest, int size) { + read(src, dest, size, 0); + } + + public void read(Buffer src, ByteBuffer dest) { + read(src, dest, src.getSize(), 0); + } + + public Event readAsync(Buffer src, ByteBuffer dest, int size, int offset) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Event readAsync(Buffer src, ByteBuffer dest, int size) { + return readAsync(src, dest, size, 0); + } + + public Event readAsync(Buffer src, ByteBuffer dest) { + return readAsync(src, dest, src.getSize()); + } + + public void write(ByteBuffer src, Buffer dest, int size, int offset) { + throw new UnsupportedOperationException("not supported yet"); + } + + public void write(ByteBuffer src, Buffer dest, int size) { + write(src, dest, size, 0); + } + + public void write(ByteBuffer src, Buffer dest) { + write(src, dest, dest.getSize()); + } + + public Event writeAsync(ByteBuffer src, Buffer dest, int size, int offset) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Event writeAsync(ByteBuffer src, Buffer dest, int size) { + return writeAsync(src, dest, size, 0); + } + + public Event writeAsync(ByteBuffer src, Buffer dest) { + return writeAsync(src, dest, dest.getSize()); + } + + public void copyTo(Buffer src, Buffer dest, int size, int srcOffset, int destOffset) { + throw new UnsupportedOperationException("not supported yet"); + } + + public void copyTo(Buffer src, Buffer dest, int size) { + copyTo(src, dest, size, 0, 0); + } + + public void copyTo(Buffer src, Buffer dest) { + copyTo(src, dest, src.getSize()); + } + + public Event copyToAsync(Buffer src, Buffer dest, int size, int srcOffset, int destOffset) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Event copyToAsync(Buffer src, Buffer dest, int size) { + return copyToAsync(src, dest, size, 0, 0); + } + + public Event copyToAsync(Buffer src, Buffer dest) { + return copyToAsync(src, dest, src.getSize()); + } + + public ByteBuffer map(Buffer src, int size, int offset, MappingAccess access) { + throw new UnsupportedOperationException("not supported yet"); + } + + public ByteBuffer map(Buffer src, int size, MappingAccess access) { + return map(src, size, 0, access); + } + + public ByteBuffer map(Buffer src, MappingAccess access) { + return map(src, src.getSize(), access); + } + + public void unmap(Buffer src, ByteBuffer ptr) { + throw new UnsupportedOperationException("not supported yet"); + } + //TODO: async mapping - //TODO: clEnqueueFillBuffer - //TODO: image read/write - - public void flush() { - throw new UnsupportedOperationException("not supported yet"); - } - public void finish() { - throw new UnsupportedOperationException("not supported yet"); - } - + public void flush() { + throw new UnsupportedOperationException("not supported yet"); + } + + public void finish() { + throw new UnsupportedOperationException("not supported yet"); + } + + @Override + public void deleteObject() { + throw new UnsupportedOperationException("Not supported yet."); + } + } diff --git a/jme3-core/src/main/java/com/jme3/opencl/Context.java b/jme3-core/src/main/java/com/jme3/opencl/Context.java index 4e3063fc9..4cd181d10 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/Context.java +++ b/jme3-core/src/main/java/com/jme3/opencl/Context.java @@ -42,127 +42,150 @@ import java.util.List; /** * The central OpenCL context. Every actions start from here. + * * @author Sebastian Weiss */ -public final class Context { - - private final long context; - - public Context(long context) { - this.context = context; - } - - public List getDevices() { - throw new UnsupportedOperationException("not supported yet"); - } - - public CommandQueue createQueue() { - throw new UnsupportedOperationException("not supported yet"); - } +public final class Context extends NativeCLObject { + + private final long context; + + public Context(long context) { + this.context = context; + } + + public List getDevices() { + throw new UnsupportedOperationException("not supported yet"); + } + + public CommandQueue createQueue() { + throw new UnsupportedOperationException("not supported yet"); + } //TODO: constructor with specific device and properties - - public Buffer createBuffer(int size, MemoryAccess access) { - throw new UnsupportedOperationException("not supported yet"); - } - public Buffer createBuffer(int size) { - return createBuffer(size, MemoryAccess.READ_WRITE); - } - - public Buffer useHostBuffer(ByteBuffer data, int size, MemoryAccess access) { - throw new UnsupportedOperationException("not supported yet"); - } - public Buffer useHostBuffer(ByteBuffer data, int size) { - return useHostBuffer(data, size, MemoryAccess.READ_WRITE); - } - - public static enum ImageChannelOrder { - R, Rx, A, - INTENSITY, - LUMINANCE, - RG, RGx, RA, - RGB, RGBx, - RGBA, - ARGB, BGRA - } - public static enum ImageChannelType { - SNORM_INT8, - SNORM_INT16, - UNORM_INT8, - UNROM_INT16, - UNORM_SHORT_565, - UNROM_SHORT_555, - UNORM_INT_101010, - SIGNED_INT8, - SIGNED_INT16, - SIGNED_INT32, - UNSIGNED_INT8, - UNSIGNED_INT16, - UNSIGNED_INT32, - HALF_FLOAT, - FLOAT - } - public static class ImageFormat { //Struct - public ImageChannelOrder channelOrder; - public ImageChannelType channelType; - } - public static enum ImageType { - IMAGE_1D, - IMAGE_1D_BUFFER, - IMAGE_2D, - IMAGE_3D, - IMAGE_1D_ARRAY, - IMAGE_2D_ARRAY - } - public static class ImageDescriptor { //Struct - public ImageType type; - public int width; - public int height; - public int depth; - public int arraySize; - public int rowPitch; - public int slicePitch; - public int numMipLevels; - public int numSamples; - public Buffer buffer; - } - public Buffer createImage(MemoryAccess access, ImageFormat format, ImageDescriptor descr, ByteBuffer hostPtr) { - throw new UnsupportedOperationException("not supported yet"); - } + + public Buffer createBuffer(int size, MemoryAccess access) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Buffer createBuffer(int size) { + return createBuffer(size, MemoryAccess.READ_WRITE); + } + + public Buffer useHostBuffer(ByteBuffer data, int size, MemoryAccess access) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Buffer useHostBuffer(ByteBuffer data, int size) { + return useHostBuffer(data, size, MemoryAccess.READ_WRITE); + } + + @Override + public void deleteObject() { + throw new UnsupportedOperationException("Not supported yet."); + } + + public static enum ImageChannelOrder { + + R, Rx, A, + INTENSITY, + LUMINANCE, + RG, RGx, RA, + RGB, RGBx, + RGBA, + ARGB, BGRA + } + + public static enum ImageChannelType { + + SNORM_INT8, + SNORM_INT16, + UNORM_INT8, + UNROM_INT16, + UNORM_SHORT_565, + UNROM_SHORT_555, + UNORM_INT_101010, + SIGNED_INT8, + SIGNED_INT16, + SIGNED_INT32, + UNSIGNED_INT8, + UNSIGNED_INT16, + UNSIGNED_INT32, + HALF_FLOAT, + FLOAT + } + + public static class ImageFormat { //Struct + + public ImageChannelOrder channelOrder; + public ImageChannelType channelType; + } + + public static enum ImageType { + + IMAGE_1D, + IMAGE_1D_BUFFER, + IMAGE_2D, + IMAGE_3D, + IMAGE_1D_ARRAY, + IMAGE_2D_ARRAY + } + + public static class ImageDescriptor { //Struct + + public ImageType type; + public int width; + public int height; + public int depth; + public int arraySize; + public int rowPitch; + public int slicePitch; + public int numMipLevels; + public int numSamples; + public Buffer buffer; + } + + public Buffer createImage(MemoryAccess access, ImageFormat format, ImageDescriptor descr, ByteBuffer hostPtr) { + throw new UnsupportedOperationException("not supported yet"); + } //TODO: add simplified methods for 1D, 2D, 3D textures - + //Interop - - public Buffer bindVertexBuffer(VertexBuffer vb) { - throw new UnsupportedOperationException("not supported yet"); - } - public Buffer bindIndexBuffer(IndexBuffer ib) { - if (!(ib instanceof IndexByteBuffer) - && !(ib instanceof IndexShortBuffer) - && !(ib instanceof IndexIntBuffer)) { - throw new IllegalArgumentException("Index buffer must be an IndexByteBuffer, IndexShortBuffer or IndexIntBuffer"); - } - throw new UnsupportedOperationException("not supported yet"); - } - public Buffer bindImage(Image image) { - throw new UnsupportedOperationException("not supported yet"); - } - - public Program createProgramFromSourceCode(String sourceCode) { - throw new UnsupportedOperationException("not supported yet"); - } - public Program createProgramFromSourceFilesWithInclude( - String include, String... resources) { - //TODO: load resources - throw new UnsupportedOperationException("not implemented yet"); - } - public Program createProgramFormSourcesWithInclude(String include, List resources) { - return createProgramFromSourceFilesWithInclude(include, resources.toArray(new String[resources.size()])); - } - public Program createProgramFromSources(String... resources) { - return createProgramFromSourceFilesWithInclude(null, resources); - } - public Program createProgramFromSources(List resources) { - return createProgramFormSourcesWithInclude(null, resources); - } - + public Buffer bindVertexBuffer(VertexBuffer vb) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Buffer bindIndexBuffer(IndexBuffer ib) { + if (!(ib instanceof IndexByteBuffer) + && !(ib instanceof IndexShortBuffer) + && !(ib instanceof IndexIntBuffer)) { + throw new IllegalArgumentException("Index buffer must be an IndexByteBuffer, IndexShortBuffer or IndexIntBuffer"); + } + throw new UnsupportedOperationException("not supported yet"); + } + + public Buffer bindImage(Image image) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Program createProgramFromSourceCode(String sourceCode) { + throw new UnsupportedOperationException("not supported yet"); + } + + public Program createProgramFromSourceFilesWithInclude( + String include, String... resources) { + //TODO: load resources + throw new UnsupportedOperationException("not implemented yet"); + } + + public Program createProgramFormSourcesWithInclude(String include, List resources) { + return createProgramFromSourceFilesWithInclude(include, resources.toArray(new String[resources.size()])); + } + + public Program createProgramFromSources(String... resources) { + return createProgramFromSourceFilesWithInclude(null, resources); + } + + public Program createProgramFromSources(List resources) { + return createProgramFormSourcesWithInclude(null, resources); + } + } diff --git a/jme3-core/src/main/java/com/jme3/opencl/Kernel.java b/jme3-core/src/main/java/com/jme3/opencl/Kernel.java index 4da0668f8..7716284ca 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/Kernel.java +++ b/jme3-core/src/main/java/com/jme3/opencl/Kernel.java @@ -39,145 +39,177 @@ import com.jme3.math.Vector4f; * * @author Sebastian Weiss */ -public final class Kernel { - private final WorkSize globalWorkSize; - private final WorkSize workGroupSize; - private final long kernel; - - public Kernel(long kernel) { - this.kernel = kernel; - this.globalWorkSize = new WorkSize(0); - this.workGroupSize = new WorkSize(0); - } - - public String getName() { - throw new UnsupportedOperationException("not supported yet"); - } - public int getArgCount() { - throw new UnsupportedOperationException("not supported yet"); - } - - public WorkSize getGlobalWorkSize() { - return globalWorkSize; - } - public void setGlobalWorkSize(WorkSize ws) { - globalWorkSize.set(ws); - } - public void setGlobalWorkSize(int size) { - globalWorkSize.set(1, size); - } - public void setGlobalWorkSize(int width, int height) { - globalWorkSize.set(2, width, height); - } - public void setGlobalWorkSize(int width, int height, int depth) { - globalWorkSize.set(3, width, height, depth); - } - - public WorkSize getWorkGroupSize() { - return workGroupSize; - } - public void setWorkGroupSize(WorkSize ws) { - workGroupSize.set(ws); - } - public void setWorkGroupSize(int size) { - workGroupSize.set(1, size); - } - public void setWorkGroupSize(int width, int height) { - workGroupSize.set(2, width, height); - } - public void setWorkGroupSize(int width, int height, int depth) { - workGroupSize.set(3, width, height, depth); - } - public void setWorkGroupSizeToNull() { - workGroupSize.set(1, 0); - } - - public void setArg(int index, LocalMemPerElement t) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, LocalMem t) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, Buffer t) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, byte b) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, short s) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, int i) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, long l) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, float f) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, double d) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, Vector2f v) { - throw new UnsupportedOperationException("not supported yet"); - } - //Vector3f not supported because cl_float3 is the same as a float4 - public void setArg(int index, Vector4f v) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, Quaternion q) { - throw new UnsupportedOperationException("not supported yet"); - } - public void setArg(int index, Object arg) { - if (arg instanceof Byte) { - setArg(index, (byte) arg); - } else if (arg instanceof Short) { - setArg(index, (short) arg); - } else if (arg instanceof Integer) { - setArg(index, (int) arg); - } else if (arg instanceof Long) { - setArg(index, (long) arg); - } else if (arg instanceof Float) { - setArg(index, (float) arg); - } else if (arg instanceof Double) { - setArg(index, (double) arg); - } else if (arg instanceof Vector2f) { - setArg(index, (Vector2f) arg); - } else if (arg instanceof Vector4f) { - setArg(index, (Vector4f) arg); - } else if (arg instanceof Quaternion) { - setArg(index, (Quaternion) arg); - } else if (arg instanceof LocalMemPerElement) { - setArg(index, (LocalMemPerElement) arg); - } else if (arg instanceof LocalMem) { - setArg(index, (LocalMem) arg); - } else if (arg instanceof Buffer) { - setArg(index, (Buffer) arg); - } else { - throw new IllegalArgumentException("unknown kernel argument type: "+arg); - } - } - private void setArgs(Object... args) { - for (int i=0; i { defaults.put("GammaCorrection", false); defaults.put("Resizable", false); defaults.put("SwapBuffers", true); - // defaults.put("Icons", null); + defaults.put("OpenCL", false); + // defaults.put("Icons", null); } /** @@ -1019,4 +1020,17 @@ public final class AppSettings extends HashMap { public boolean isSwapBuffers() { return getBoolean("SwapBuffers"); } + + /** + * True to enable the creation of an OpenCL context. + * + * @param support + */ + public void setOpenCLSupport(boolean support) { + putBoolean("OpenCL", support); + } + + public boolean isOpenCLSupport() { + return getBoolean("OpenCL"); + } } diff --git a/jme3-core/src/main/java/com/jme3/system/JmeContext.java b/jme3-core/src/main/java/com/jme3/system/JmeContext.java index f4f47ae67..36aaa44a8 100644 --- a/jme3-core/src/main/java/com/jme3/system/JmeContext.java +++ b/jme3-core/src/main/java/com/jme3/system/JmeContext.java @@ -110,6 +110,11 @@ public interface JmeContext { */ public Renderer getRenderer(); + /** + * @return The OpenCL context if available. + */ + public com.jme3.opencl.Context getOpenCLContext(); + /** * @return Mouse input implementation. May be null if not available. */ diff --git a/jme3-core/src/main/java/com/jme3/system/NullContext.java b/jme3-core/src/main/java/com/jme3/system/NullContext.java index 54ee59c42..e7969c89e 100644 --- a/jme3-core/src/main/java/com/jme3/system/NullContext.java +++ b/jme3-core/src/main/java/com/jme3/system/NullContext.java @@ -37,6 +37,7 @@ import com.jme3.input.MouseInput; import com.jme3.input.TouchInput; import com.jme3.input.dummy.DummyKeyInput; import com.jme3.input.dummy.DummyMouseInput; +import com.jme3.opencl.Context; import com.jme3.renderer.Renderer; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; @@ -229,4 +230,9 @@ public class NullContext implements JmeContext, Runnable { return true; // Doesn't really matter if true or false. Either way // RenderManager won't render anything. } + + @Override + public Context getOpenCLContext() { + return null; + } } diff --git a/jme3-desktop/src/main/java/com/jme3/system/awt/AwtPanelsContext.java b/jme3-desktop/src/main/java/com/jme3/system/awt/AwtPanelsContext.java index 897632a00..ee41ea569 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/awt/AwtPanelsContext.java +++ b/jme3-desktop/src/main/java/com/jme3/system/awt/AwtPanelsContext.java @@ -37,6 +37,7 @@ import com.jme3.input.MouseInput; import com.jme3.input.TouchInput; import com.jme3.input.awt.AwtKeyInput; import com.jme3.input.awt.AwtMouseInput; +import com.jme3.opencl.Context; import com.jme3.renderer.Renderer; import com.jme3.system.*; import java.util.ArrayList; @@ -145,6 +146,11 @@ public class AwtPanelsContext implements JmeContext { return actualContext != null && actualContext.isRenderable(); } + @Override + public Context getOpenCLContext() { + return actualContext.getOpenCLContext(); + } + public AwtPanelsContext(){ } diff --git a/jme3-examples/src/main/java/jme3test/gui/opencl/HelloOpenCL.java b/jme3-examples/src/main/java/jme3test/gui/opencl/HelloOpenCL.java new file mode 100644 index 000000000..66635420f --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/gui/opencl/HelloOpenCL.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2009-2012 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 jme3test.gui.opencl; + +import jme3test.helloworld.*; +import com.jme3.app.SimpleApplication; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; +import com.jme3.math.Vector3f; +import com.jme3.scene.Geometry; +import com.jme3.scene.shape.Box; +import com.jme3.system.AppSettings; + +/** Sample 1 - how to get started with the most simple JME 3 application. + * Display a blue 3D cube and view from all sides by + * moving the mouse and pressing the WASD keys. */ +public class HelloOpenCL extends SimpleApplication { + + public static void main(String[] args){ + HelloOpenCL app = new HelloOpenCL(); + AppSettings settings = new AppSettings(true); + settings.setOpenCLSupport(true); + app.setSettings(settings); + app.start(); // start the game + } + + @Override + public void simpleInitApp() { + Box b = new Box(1, 1, 1); // create cube shape + Geometry geom = new Geometry("Box", b); // create cube geometry from the shape + Material mat = new Material(assetManager, + "Common/MatDefs/Misc/Unshaded.j3md"); // create a simple material + mat.setColor("Color", ColorRGBA.Blue); // set color of material to blue + geom.setMaterial(mat); // set the cube's material + rootNode.attachChild(geom); // make the cube appear in the scene + } +} \ No newline at end of file diff --git a/jme3-jogl/src/main/java/com/jme3/system/jogl/JoglContext.java b/jme3-jogl/src/main/java/com/jme3/system/jogl/JoglContext.java index 24a647ef6..602298bb9 100644 --- a/jme3-jogl/src/main/java/com/jme3/system/jogl/JoglContext.java +++ b/jme3-jogl/src/main/java/com/jme3/system/jogl/JoglContext.java @@ -35,6 +35,7 @@ package com.jme3.system.jogl; import com.jme3.input.JoyInput; import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; +import com.jme3.opencl.Context; import com.jme3.renderer.Renderer; import com.jme3.renderer.RendererException; import com.jme3.renderer.jogl.JoglGL; @@ -84,6 +85,8 @@ public abstract class JoglContext implements JmeContext { protected MouseInput mouseInput; protected JoyInput joyInput; + protected com.jme3.opencl.Context clContext; + @Override public void setSystemListener(SystemListener listener){ this.listener = listener; @@ -209,6 +212,14 @@ public abstract class JoglContext implements JmeContext { if (joyInput != null) { joyInput.initialize(); } + + if (settings.isOpenCLSupport()) { + initOpenCL(); + } + } + + protected void initOpenCL() { + logger.info("Initialize OpenCL with JOGL"); } public void internalCreate() { @@ -266,4 +277,10 @@ public abstract class JoglContext implements JmeContext { } return samples; } + + @Override + public Context getOpenCLContext() { + return clContext; + } + } diff --git a/jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglCL.java b/jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglCL.java new file mode 100644 index 000000000..d1aa2a25b --- /dev/null +++ b/jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglCL.java @@ -0,0 +1,236 @@ +/* + * 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.lwjgl; + +import com.jme3.opencl.Context; +import com.jme3.opencl.KernelCompilationException; +import com.jme3.opencl.MappingAccess; +import com.jme3.opencl.MemoryAccess; +import java.nio.ByteBuffer; + +/** + * + * @author Sebastian Weiss + */ +public class LwjglCL implements com.jme3.opencl.CL { + + @Override + public TempBuffer[] getTempBuffers() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long getContext() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clCreateCommandQueue(long context, long device, boolean profiling) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clReleaseCommandQueue(long queue) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clCreateBuffer(long context, MemoryAccess access, int size, ByteBuffer hostPtr) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueReadBuffer(long queue, long buffer, boolean blocking, int offset, int size, ByteBuffer ptr) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueWriteBuffer(long queue, long buffer, boolean blocking, int offset, int size, ByteBuffer ptr) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueCopyBuffer(long queue, long srcBuffer, long dstBuffer, int srcOffset, int dstOffset, int size) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueFillBuffer(long queue, long buffer, ByteBuffer pattern, int patternSize, int offset, int size) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueMapBuffer(long queue, long buffer, boolean blocking, MappingAccess flags, int offset, int size) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clCreateImage(long context, MemoryAccess access, Context.ImageFormat format, Context.ImageDescriptor desc, ByteBuffer ptr) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Context.ImageFormat[] clGetSupportedImageFormats(long context, MemoryAccess ma, Context.ImageType type) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueReadImage(long queue, long image, boolean blocking, ByteBuffer origin, ByteBuffer region, int rowPitch, int slicePitch, ByteBuffer ptr) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueWriteImage(long queue, long image, boolean blocking, ByteBuffer origin, ByteBuffer region, int inputRowPitch, int intputSlicePitch, ByteBuffer ptr) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueCopyImage(long queue, long srcImage, long dstImage, ByteBuffer srcOrigin, ByteBuffer dstOrigin, ByteBuffer region) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueFillImage(long queue, long image, ByteBuffer fillColor, ByteBuffer origin, ByteBuffer region) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueCopyImageToBuffer(long queue, long srcImage, long dstBuffer, ByteBuffer srcOrigin, ByteBuffer region, int dstOffset) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueCopyBufferToImage(long queue, long srcBuffer, long dstImage, int srcOffset, ByteBuffer dstOrigin, ByteBuffer region) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueMapImage(long queue, long image, boolean blocking, MappingAccess ma, ByteBuffer origin, ByteBuffer region, int rowPitch, int slicePitch) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clReleaseMemObject(long mem) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueUnmapMemObject(long queue, long mem, ByteBuffer ptr) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getMemSize(long mem) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clCreateProgramWithSource(long context, CharSequence[] sources) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clReleaseProgram(long program) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clBuildProgram(long program, long[] devices, CharSequence optpions) throws KernelCompilationException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getKernelNames(long program) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clCreateKernel(long program, String kernelName) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clReleaseKernel(long kernel) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clSetKernelArg(long kernel, int argIndex, int argSize, ByteBuffer argValue) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getKernelName(long kernel) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getKernelNumArgs(long kernel) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long clEnqueueNDRangeKernel(long queue, long kernel, int workDim, ByteBuffer globalWorkOffset, ByteBuffer globalWorkSize, ByteBuffer localWorkSize) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clWaitForEvents(long[] events) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clWaitForEvent(long event) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isEventCompleted(long event) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clReleaseEvent(long event) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clFlush(long queue) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clFinish(long queue) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglContext.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglContext.java index be3014da5..e15688a43 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglContext.java +++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglContext.java @@ -35,6 +35,7 @@ package com.jme3.system.lwjgl; import com.jme3.input.lwjgl.JInputJoyInput; import com.jme3.input.lwjgl.LwjglKeyInput; import com.jme3.input.lwjgl.LwjglMouseInput; +import com.jme3.opencl.lwjgl.LwjglCL; import com.jme3.renderer.Renderer; import com.jme3.renderer.RendererException; import com.jme3.renderer.lwjgl.LwjglGL; @@ -54,12 +55,17 @@ import com.jme3.renderer.opengl.GLTimingState; import com.jme3.renderer.opengl.GLTracer; import com.jme3.system.*; import java.io.File; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import org.lwjgl.LWJGLException; import org.lwjgl.Sys; +import org.lwjgl.opencl.CL; +import org.lwjgl.opencl.CL10; +import org.lwjgl.opencl.CLPlatform; import org.lwjgl.opengl.*; /** @@ -81,6 +87,10 @@ public abstract class LwjglContext implements JmeContext { protected JInputJoyInput joyInput; protected Timer timer; protected SystemListener listener; + + protected LwjglCL clImpl; + protected CLPlatform clPlatform; + protected com.jme3.opencl.Context context; public void setSystemListener(SystemListener listener) { this.listener = listener; @@ -245,8 +255,47 @@ public abstract class LwjglContext implements JmeContext { if (joyInput != null) { joyInput.initialize(); } + } + protected void initOpenCL() { + logger.info("Initialize OpenCL wiht LWJGL2"); + + try { + CL.create(); + } catch (LWJGLException ex) { + logger.log(Level.SEVERE, "Unable to initialize OpenCL", ex); + return; + } + + List platforms = CLPlatform.getPlatforms(); + StringBuilder platformInfos = new StringBuilder(); + platformInfos.append("Available OpenCL platforms:\n"); + ArrayList possiblePlatforms = new ArrayList(); + for (int i=0; i