implemented LwjglCommandQueue, LwjglBuffer and LwjglEvent, added buffer test to HelloOpenCL
This commit is contained in:
parent
e02eec0abd
commit
e469af2ebc
@ -51,8 +51,8 @@ public interface Context {
|
|||||||
Buffer createBuffer(int size, MemoryAccess access);
|
Buffer createBuffer(int size, MemoryAccess access);
|
||||||
Buffer createBuffer(int size);
|
Buffer createBuffer(int size);
|
||||||
|
|
||||||
Buffer useHostBuffer(ByteBuffer data, int size, MemoryAccess access);
|
Buffer createBufferFromHost(ByteBuffer data, MemoryAccess access);
|
||||||
Buffer useHostBuffer(ByteBuffer data, int size);
|
Buffer createBufferFromHost(ByteBuffer data);
|
||||||
|
|
||||||
public static enum ImageChannelOrder {
|
public static enum ImageChannelOrder {
|
||||||
|
|
||||||
|
@ -35,18 +35,9 @@ package com.jme3.opencl;
|
|||||||
*
|
*
|
||||||
* @author Sebastian Weiss
|
* @author Sebastian Weiss
|
||||||
*/
|
*/
|
||||||
public final class Event {
|
public interface Event {
|
||||||
private final long event;
|
|
||||||
|
|
||||||
public Event(long event) {
|
void waitForFinished();
|
||||||
this.event = event;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void waitForFinished() {
|
boolean isCompleted();
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isCompleted() {
|
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -34,30 +34,24 @@ package com.jme3.opencl;
|
|||||||
import com.jme3.math.Quaternion;
|
import com.jme3.math.Quaternion;
|
||||||
import com.jme3.math.Vector2f;
|
import com.jme3.math.Vector2f;
|
||||||
import com.jme3.math.Vector4f;
|
import com.jme3.math.Vector4f;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Sebastian Weiss
|
* @author Sebastian Weiss
|
||||||
*/
|
*/
|
||||||
public final class Kernel {
|
public abstract class Kernel {
|
||||||
/*
|
|
||||||
private final WorkSize globalWorkSize;
|
private final WorkSize globalWorkSize;
|
||||||
private final WorkSize workGroupSize;
|
private final WorkSize workGroupSize;
|
||||||
private final long kernel;
|
|
||||||
|
|
||||||
public Kernel(long kernel) {
|
protected Kernel() {
|
||||||
this.kernel = kernel;
|
|
||||||
this.globalWorkSize = new WorkSize(0);
|
this.globalWorkSize = new WorkSize(0);
|
||||||
this.workGroupSize = new WorkSize(0);
|
this.workGroupSize = new WorkSize(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public abstract String getName();
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getArgCount() {
|
public abstract int getArgCount();
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorkSize getGlobalWorkSize() {
|
public WorkSize getGlobalWorkSize() {
|
||||||
return globalWorkSize;
|
return globalWorkSize;
|
||||||
@ -103,55 +97,31 @@ public final class Kernel {
|
|||||||
workGroupSize.set(1, 0);
|
workGroupSize.set(1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setArg(int index, LocalMemPerElement t) {
|
public abstract void setArg(int index, LocalMemPerElement t);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, LocalMem t) {
|
public abstract void setArg(int index, LocalMem t);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, Buffer t) {
|
public abstract void setArg(int index, Buffer t);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, byte b) {
|
public abstract void setArg(int index, byte b);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, short s) {
|
public abstract void setArg(int index, short s);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, int i) {
|
public abstract void setArg(int index, int i);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, long l) {
|
public abstract void setArg(int index, long l);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, float f) {
|
public abstract void setArg(int index, float f);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, double d) {
|
public abstract void setArg(int index, double d);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, Vector2f v) {
|
public abstract 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 abstract void setArg(int index, Vector4f v);
|
||||||
|
|
||||||
public void setArg(int index, Vector4f v) {
|
public abstract void setArg(int index, Quaternion q);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, Quaternion q) {
|
public abstract void setArg(int index, ByteBuffer buffer, long size);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setArg(int index, Object arg) {
|
public void setArg(int index, Object arg) {
|
||||||
if (arg instanceof Byte) {
|
if (arg instanceof Byte) {
|
||||||
@ -189,9 +159,7 @@ public final class Kernel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Event Run(CommandQueue queue) {
|
public abstract Event Run(CommandQueue queue);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
public Event Run1(CommandQueue queue, WorkSize globalWorkSize, Object... args) {
|
public Event Run1(CommandQueue queue, WorkSize globalWorkSize, Object... args) {
|
||||||
setGlobalWorkSize(globalWorkSize);
|
setGlobalWorkSize(globalWorkSize);
|
||||||
@ -208,9 +176,4 @@ public final class Kernel {
|
|||||||
return Run(queue);
|
return Run(queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteObject() {
|
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ package com.jme3.opencl;
|
|||||||
*
|
*
|
||||||
* @author Sebastian Weiss
|
* @author Sebastian Weiss
|
||||||
*/
|
*/
|
||||||
public class OpenCLException extends Exception {
|
public class OpenCLException extends RuntimeException {
|
||||||
|
|
||||||
private final int errorCode;
|
private final int errorCode;
|
||||||
|
|
||||||
|
@ -35,22 +35,11 @@ package com.jme3.opencl;
|
|||||||
*
|
*
|
||||||
* @author Sebastian Weiss
|
* @author Sebastian Weiss
|
||||||
*/
|
*/
|
||||||
public final class Program {
|
public interface Program {
|
||||||
private final long program;
|
|
||||||
|
|
||||||
public Program(long program) {
|
void build(String args) throws KernelCompilationException;
|
||||||
this.program = program;
|
void build() throws KernelCompilationException;
|
||||||
}
|
|
||||||
|
|
||||||
public void build(String args) {
|
Kernel createKernel(String name);
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
public void build() {
|
|
||||||
build(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Kernel createKernel(String name) {
|
|
||||||
throw new UnsupportedOperationException("not supported yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -32,19 +32,24 @@
|
|||||||
|
|
||||||
package jme3test.gui.opencl;
|
package jme3test.gui.opencl;
|
||||||
|
|
||||||
import jme3test.helloworld.*;
|
|
||||||
import com.jme3.app.SimpleApplication;
|
import com.jme3.app.SimpleApplication;
|
||||||
import com.jme3.material.Material;
|
import com.jme3.font.BitmapFont;
|
||||||
import com.jme3.math.ColorRGBA;
|
import com.jme3.font.BitmapText;
|
||||||
import com.jme3.math.Vector3f;
|
import com.jme3.opencl.Buffer;
|
||||||
import com.jme3.scene.Geometry;
|
import com.jme3.opencl.CommandQueue;
|
||||||
import com.jme3.scene.shape.Box;
|
import com.jme3.opencl.Context;
|
||||||
|
import com.jme3.opencl.Event;
|
||||||
import com.jme3.system.AppSettings;
|
import com.jme3.system.AppSettings;
|
||||||
|
import com.jme3.util.BufferUtils;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/** Sample 1 - how to get started with the most simple JME 3 application.
|
/** Sample 1 - how to get started with the most simple JME 3 application.
|
||||||
* Display a blue 3D cube and view from all sides by
|
* Display a blue 3D cube and view from all sides by
|
||||||
* moving the mouse and pressing the WASD keys. */
|
* moving the mouse and pressing the WASD keys. */
|
||||||
public class HelloOpenCL extends SimpleApplication {
|
public class HelloOpenCL extends SimpleApplication {
|
||||||
|
private static final Logger LOG = Logger.getLogger(HelloOpenCL.class.getName());
|
||||||
|
|
||||||
public static void main(String[] args){
|
public static void main(String[] args){
|
||||||
HelloOpenCL app = new HelloOpenCL();
|
HelloOpenCL app = new HelloOpenCL();
|
||||||
@ -56,12 +61,80 @@ public class HelloOpenCL extends SimpleApplication {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void simpleInitApp() {
|
public void simpleInitApp() {
|
||||||
Box b = new Box(1, 1, 1); // create cube shape
|
BitmapFont fnt = assetManager.loadFont("Interface/Fonts/Default.fnt");
|
||||||
Geometry geom = new Geometry("Box", b); // create cube geometry from the shape
|
Context clContext = context.getOpenCLContext();
|
||||||
Material mat = new Material(assetManager,
|
if (clContext == null) {
|
||||||
"Common/MatDefs/Misc/Unshaded.j3md"); // create a simple material
|
BitmapText txt = new BitmapText(fnt);
|
||||||
mat.setColor("Color", ColorRGBA.Blue); // set color of material to blue
|
txt.setText("No OpenCL Context created!\nSee output log for details.");
|
||||||
geom.setMaterial(mat); // set the cube's material
|
txt.setLocalTranslation(5, settings.getHeight() - 5, 0);
|
||||||
rootNode.attachChild(geom); // make the cube appear in the scene
|
guiNode.attachChild(txt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CommandQueue clQueue = clContext.createQueue();
|
||||||
|
|
||||||
|
StringBuilder str = new StringBuilder();
|
||||||
|
str.append("OpenCL Context created:\n Platform: ")
|
||||||
|
.append(clContext.getDevices().get(0).getPlatform().getName())
|
||||||
|
.append("\n Devices: ").append(clContext.getDevices());
|
||||||
|
str.append("\nTests:");
|
||||||
|
str.append("\n Buffers: ").append(testBuffer(clContext, clQueue));
|
||||||
|
|
||||||
|
BitmapText txt1 = new BitmapText(fnt);
|
||||||
|
txt1.setText(str.toString());
|
||||||
|
txt1.setLocalTranslation(5, settings.getHeight() - 5, 0);
|
||||||
|
guiNode.attachChild(txt1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean testBuffer(Context clContext, CommandQueue clQueue) {
|
||||||
|
try {
|
||||||
|
//create two buffers
|
||||||
|
ByteBuffer h1 = BufferUtils.createByteBuffer(256);
|
||||||
|
Buffer b1 = clContext.createBuffer(256);
|
||||||
|
ByteBuffer h2 = BufferUtils.createByteBuffer(256);
|
||||||
|
Buffer b2 = clContext.createBuffer(256);
|
||||||
|
|
||||||
|
//fill buffer
|
||||||
|
h2.rewind();
|
||||||
|
for (int i=0; i<256; ++i) {
|
||||||
|
h2.put((byte)i);
|
||||||
|
}
|
||||||
|
h2.rewind();
|
||||||
|
b2.write(clQueue, h2);
|
||||||
|
|
||||||
|
//copy b2 to b1
|
||||||
|
b2.copyTo(clQueue, b1);
|
||||||
|
|
||||||
|
//read buffer
|
||||||
|
h1.rewind();
|
||||||
|
b1.read(clQueue, h1);
|
||||||
|
h1.rewind();
|
||||||
|
for (int i=0; i<256; ++i) {
|
||||||
|
byte b = h1.get();
|
||||||
|
if (b != (byte)i) {
|
||||||
|
System.err.println("Wrong byte read: expected="+i+", actual="+b);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//read buffer with offset
|
||||||
|
int low = 26;
|
||||||
|
int high = 184;
|
||||||
|
h1.position(5);
|
||||||
|
Event event = b1.readAsync(clQueue, h1, high-low, low);
|
||||||
|
event.waitForFinished();
|
||||||
|
h1.position(5);
|
||||||
|
for (int i=0; i<high-low; ++i) {
|
||||||
|
byte b = h1.get();
|
||||||
|
if (b != (byte)(i+low)) {
|
||||||
|
System.err.println("Wrong byte read: expected="+(i+low)+", actual="+b);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LOG.log(Level.SEVERE, "Buffer test failed with:", ex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
220
jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglBuffer.java
Normal file
220
jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglBuffer.java
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
/*
|
||||||
|
* 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.*;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import org.lwjgl.opencl.CL10;
|
||||||
|
import org.lwjgl.opencl.CLCommandQueue;
|
||||||
|
import org.lwjgl.opencl.CLEvent;
|
||||||
|
import org.lwjgl.opencl.CLMem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Sebastian Weiss
|
||||||
|
*/
|
||||||
|
public class LwjglBuffer implements Buffer {
|
||||||
|
|
||||||
|
private final CLMem buffer;
|
||||||
|
|
||||||
|
public LwjglBuffer(CLMem buffer) {
|
||||||
|
this.buffer = buffer;
|
||||||
|
}
|
||||||
|
public CLMem getBuffer() {
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize() {
|
||||||
|
return buffer.getInfoInt(CL10.CL_MEM_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MemoryAccess getMemoryAccessFlags() {
|
||||||
|
return Utils.getMemoryAccessFromFlag(buffer.getInfoLong(CL10.CL_MEM_FLAGS));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(CommandQueue queue, ByteBuffer dest, int size, int offset) {
|
||||||
|
//Note: LWJGL does not support the size parameter, I have to set the buffer limit
|
||||||
|
dest.limit(dest.position() + size);
|
||||||
|
int ret = CL10.clEnqueueReadBuffer(((LwjglCommandQueue)queue).getQueue(),
|
||||||
|
buffer, CL10.CL_TRUE, offset, dest, null, null);
|
||||||
|
Utils.checkError(ret, "clEnqueueReadBuffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(CommandQueue queue, ByteBuffer dest, int size) {
|
||||||
|
read(queue, dest, size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(CommandQueue queue, ByteBuffer dest) {
|
||||||
|
read(queue, dest, getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event readAsync(CommandQueue queue, ByteBuffer dest, int size, int offset) {
|
||||||
|
//Note: LWJGL does not support the size parameter, I have to set the buffer limit
|
||||||
|
dest.limit(dest.position() + size);
|
||||||
|
Utils.pointerBuffers[0].rewind();
|
||||||
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
||||||
|
int ret = CL10.clEnqueueReadBuffer(q, buffer, CL10.CL_FALSE, offset, dest, null, Utils.pointerBuffers[0]);
|
||||||
|
Utils.checkError(ret, "clEnqueueReadBuffer");
|
||||||
|
long event = Utils.pointerBuffers[0].get(0);
|
||||||
|
return new LwjglEvent(q.getCLEvent(event));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event readAsync(CommandQueue queue, ByteBuffer dest, int size) {
|
||||||
|
return readAsync(queue, dest, size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event readAsync(CommandQueue queue, ByteBuffer dest) {
|
||||||
|
return readAsync(queue, dest, getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(CommandQueue queue, ByteBuffer src, int size, int offset) {
|
||||||
|
//Note: LWJGL does not support the size parameter, I have to set the buffer limit
|
||||||
|
src.limit(src.position() + size);
|
||||||
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
||||||
|
int ret = CL10.clEnqueueWriteBuffer(q, buffer, CL10.CL_TRUE, offset, src, null, null);
|
||||||
|
Utils.checkError(ret, "clEnqueueWriteBuffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(CommandQueue queue, ByteBuffer src, int size) {
|
||||||
|
write(queue, src, size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(CommandQueue queue, ByteBuffer src) {
|
||||||
|
write(queue, src, getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event writeAsync(CommandQueue queue, ByteBuffer src, int size, int offset) {
|
||||||
|
//Note: LWJGL does not support the size parameter, I have to set the buffer limit
|
||||||
|
src.limit(src.position() + size);
|
||||||
|
Utils.pointerBuffers[0].rewind();
|
||||||
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
||||||
|
int ret = CL10.clEnqueueWriteBuffer(q, buffer, CL10.CL_FALSE, offset, src, null, Utils.pointerBuffers[0]);
|
||||||
|
Utils.checkError(ret, "clEnqueueWriteBuffer");
|
||||||
|
long event = Utils.pointerBuffers[0].get(0);
|
||||||
|
return new LwjglEvent(q.getCLEvent(event));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event writeAsync(CommandQueue queue, ByteBuffer src, int size) {
|
||||||
|
return writeAsync(queue, src, size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event writeAsync(CommandQueue queue, ByteBuffer src) {
|
||||||
|
return writeAsync(queue, src, getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void copyTo(CommandQueue queue, Buffer dest, int size, int srcOffset, int destOffset) {
|
||||||
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
||||||
|
Utils.pointerBuffers[0].rewind();
|
||||||
|
int ret = CL10.clEnqueueCopyBuffer(q, buffer, ((LwjglBuffer) dest).buffer, srcOffset, destOffset, size, null, Utils.pointerBuffers[0]);
|
||||||
|
Utils.checkError(ret, "clEnqueueCopyBuffer");
|
||||||
|
long event = Utils.pointerBuffers[0].get(0);
|
||||||
|
ret = CL10.clWaitForEvents(q.getCLEvent(event));
|
||||||
|
Utils.checkError(ret, "clWaitForEvents");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void copyTo(CommandQueue queue, Buffer dest, int size) {
|
||||||
|
copyTo(queue, dest, size, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void copyTo(CommandQueue queue, Buffer dest) {
|
||||||
|
copyTo(queue, dest, getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event copyToAsync(CommandQueue queue, Buffer dest, int size, int srcOffset, int destOffset) {
|
||||||
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
||||||
|
Utils.pointerBuffers[0].rewind();
|
||||||
|
int ret = CL10.clEnqueueCopyBuffer(q, buffer, ((LwjglBuffer) dest).buffer, srcOffset, destOffset, size, null, Utils.pointerBuffers[0]);
|
||||||
|
Utils.checkError(ret, "clEnqueueCopyBuffer");
|
||||||
|
long event = Utils.pointerBuffers[0].get(0);
|
||||||
|
return new LwjglEvent(q.getCLEvent(event));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event copyToAsync(CommandQueue queue, Buffer dest, int size) {
|
||||||
|
return copyToAsync(queue, dest, size, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event copyToAsync(CommandQueue queue, Buffer dest) {
|
||||||
|
return copyToAsync(queue, dest, getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ByteBuffer map(CommandQueue queue, int size, int offset, MappingAccess access) {
|
||||||
|
CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
||||||
|
long flags = Utils.getMappingAccessFlags(access);
|
||||||
|
Utils.errorBuffer.rewind();
|
||||||
|
ByteBuffer b = CL10.clEnqueueMapBuffer(q, buffer, CL10.CL_TRUE, flags, offset, size, null, null, Utils.errorBuffer);
|
||||||
|
Utils.checkError(Utils.errorBuffer, "clEnqueueMapBuffer");
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ByteBuffer map(CommandQueue queue, int size, MappingAccess access) {
|
||||||
|
return map(queue, size, 0, access);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ByteBuffer map(CommandQueue queue, MappingAccess access) {
|
||||||
|
return map(queue, getSize(), access);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unmap(CommandQueue queue, ByteBuffer ptr) {
|
||||||
|
CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
||||||
|
Utils.pointerBuffers[0].rewind();
|
||||||
|
int ret = CL10.clEnqueueUnmapMemObject(q, buffer, ptr, null, Utils.pointerBuffers[0]);
|
||||||
|
Utils.checkError(ret, "clEnqueueUnmapMemObject");
|
||||||
|
long event = Utils.pointerBuffers[0].get(0);
|
||||||
|
ret = CL10.clWaitForEvents(q.getCLEvent(event));
|
||||||
|
Utils.checkError(ret, "clWaitForEvents");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,236 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* 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.CommandQueue;
|
||||||
|
import org.lwjgl.opencl.CL10;
|
||||||
|
import org.lwjgl.opencl.CLCommandQueue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Sebastian Weiss
|
||||||
|
*/
|
||||||
|
public class LwjglCommandQueue implements CommandQueue {
|
||||||
|
|
||||||
|
private final CLCommandQueue queue;
|
||||||
|
|
||||||
|
public LwjglCommandQueue(CLCommandQueue queue) {
|
||||||
|
this.queue = queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CLCommandQueue getQueue() {
|
||||||
|
return queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flush() {
|
||||||
|
int ret = CL10.clFlush(queue);
|
||||||
|
Utils.checkError(ret, "clFlush");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void finish() {
|
||||||
|
int ret = CL10.clFinish(queue);
|
||||||
|
Utils.checkError(ret, "clFinish");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -36,7 +36,7 @@ import com.jme3.scene.VertexBuffer;
|
|||||||
import com.jme3.scene.mesh.IndexBuffer;
|
import com.jme3.scene.mesh.IndexBuffer;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.lwjgl.opencl.CLContext;
|
import org.lwjgl.opencl.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -44,9 +44,11 @@ import org.lwjgl.opencl.CLContext;
|
|||||||
*/
|
*/
|
||||||
public class LwjglContext implements Context {
|
public class LwjglContext implements Context {
|
||||||
private final CLContext context;
|
private final CLContext context;
|
||||||
|
private final List<LwjglDevice> devices;
|
||||||
|
|
||||||
public LwjglContext(CLContext context) {
|
public LwjglContext(CLContext context, List<LwjglDevice> devices) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
this.devices = devices;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CLContext getContext() {
|
public CLContext getContext() {
|
||||||
@ -55,37 +57,50 @@ public class LwjglContext implements Context {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<? extends Device> getDevices() {
|
public List<? extends Device> getDevices() {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
return devices;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommandQueue createQueue() {
|
public CommandQueue createQueue() {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
return createQueue(devices.get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("element-type-mismatch")
|
||||||
public CommandQueue createQueue(Device device) {
|
public CommandQueue createQueue(Device device) {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
assert (devices.contains(device)); //this also ensures that device is a LwjglDevice
|
||||||
|
CLDevice d = ((LwjglDevice) device).getDevice();
|
||||||
|
long properties = 0;
|
||||||
|
CLCommandQueue q = CL10.clCreateCommandQueue(context, d, properties, Utils.errorBuffer);
|
||||||
|
Utils.checkError(Utils.errorBuffer, "clCreateCommandQueue");
|
||||||
|
return new LwjglCommandQueue(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Buffer createBuffer(int size, MemoryAccess access) {
|
public Buffer createBuffer(int size, MemoryAccess access) {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
long flags = Utils.getMemoryAccessFlags(access);
|
||||||
|
CLMem mem = CL10.clCreateBuffer(context, flags, (long) size, Utils.errorBuffer);
|
||||||
|
Utils.checkError(Utils.errorBuffer, "clCreateBuffer");
|
||||||
|
return new LwjglBuffer(mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Buffer createBuffer(int size) {
|
public Buffer createBuffer(int size) {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
return createBuffer(size, MemoryAccess.READ_WRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Buffer useHostBuffer(ByteBuffer data, int size, MemoryAccess access) {
|
public Buffer createBufferFromHost(ByteBuffer data, MemoryAccess access) {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
long flags = Utils.getMemoryAccessFlags(access);
|
||||||
|
flags |= CL10.CL_MEM_USE_HOST_PTR;
|
||||||
|
CLMem mem = CL10.clCreateBuffer(context, flags, data, Utils.errorBuffer);
|
||||||
|
Utils.checkError(Utils.errorBuffer, "clCreateBuffer");
|
||||||
|
return new LwjglBuffer(mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Buffer useHostBuffer(ByteBuffer data, int size) {
|
public Buffer createBufferFromHost(ByteBuffer data) {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
return createBufferFromHost(data, MemoryAccess.READ_WRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -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.lwjgl;
|
||||||
|
|
||||||
|
import com.jme3.opencl.Event;
|
||||||
|
import org.lwjgl.opencl.CL10;
|
||||||
|
import org.lwjgl.opencl.CLEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Sebastian Weiss
|
||||||
|
*/
|
||||||
|
public class LwjglEvent implements Event {
|
||||||
|
private final CLEvent event;
|
||||||
|
|
||||||
|
public LwjglEvent(CLEvent event) {
|
||||||
|
this.event = event;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CLEvent getEvent() {
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void waitForFinished() {
|
||||||
|
CL10.clWaitForEvents(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCompleted() {
|
||||||
|
int status = event.getInfoInt(CL10.CL_EVENT_COMMAND_EXECUTION_STATUS);
|
||||||
|
if (status == CL10.CL_SUCCESS) {
|
||||||
|
return true;
|
||||||
|
} else if (status < 0) {
|
||||||
|
Utils.checkError(status, "EventStatus");
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -31,6 +31,17 @@
|
|||||||
*/
|
*/
|
||||||
package com.jme3.opencl.lwjgl;
|
package com.jme3.opencl.lwjgl;
|
||||||
|
|
||||||
|
import com.jme3.opencl.MappingAccess;
|
||||||
|
import com.jme3.opencl.MemoryAccess;
|
||||||
|
import com.jme3.opencl.OpenCLException;
|
||||||
|
import java.nio.*;
|
||||||
|
import org.lwjgl.BufferUtils;
|
||||||
|
import org.lwjgl.LWJGLUtil;
|
||||||
|
import org.lwjgl.PointerBuffer;
|
||||||
|
import org.lwjgl.opencl.CL10;
|
||||||
|
import org.lwjgl.opencl.CL12;
|
||||||
|
import org.lwjgl.opencl.Util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Sebastian Weiss
|
* @author Sebastian Weiss
|
||||||
@ -48,4 +59,70 @@ public class Utils {
|
|||||||
s = s.substring((int) (Math.log10(major) + 2));
|
s = s.substring((int) (Math.log10(major) + 2));
|
||||||
return Integer.parseInt(s);
|
return Integer.parseInt(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final class TempBuffer {
|
||||||
|
public final ByteBuffer b16;
|
||||||
|
public final ShortBuffer b16s;
|
||||||
|
public final IntBuffer b16i;
|
||||||
|
public final LongBuffer b16l;
|
||||||
|
public final FloatBuffer b16f;
|
||||||
|
public final DoubleBuffer b16d;
|
||||||
|
public TempBuffer() {
|
||||||
|
b16 = BufferUtils.createByteBuffer(16);
|
||||||
|
b16s = b16.asShortBuffer();
|
||||||
|
b16i = b16.asIntBuffer();
|
||||||
|
b16l = b16.asLongBuffer();
|
||||||
|
b16f = b16.asFloatBuffer();
|
||||||
|
b16d = b16.asDoubleBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static TempBuffer[] tempBuffers = new TempBuffer[8];
|
||||||
|
public static PointerBuffer[] pointerBuffers = new PointerBuffer[8];
|
||||||
|
static {
|
||||||
|
for (int i=0; i<8; ++i) {
|
||||||
|
tempBuffers[i] = new TempBuffer();
|
||||||
|
pointerBuffers[i] = PointerBuffer.allocateDirect(4);
|
||||||
|
}
|
||||||
|
errorBuffer = BufferUtils.createIntBuffer(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IntBuffer errorBuffer;
|
||||||
|
public static void checkError(IntBuffer errorBuffer, String callName) {
|
||||||
|
checkError(errorBuffer.get(0), callName);
|
||||||
|
}
|
||||||
|
public static void checkError(int error, String callName) {
|
||||||
|
//TODO: proper handling
|
||||||
|
Util.checkCLError(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getMemoryAccessFlags(MemoryAccess ma) {
|
||||||
|
switch (ma) {
|
||||||
|
case READ_ONLY: return CL10.CL_MEM_READ_ONLY;
|
||||||
|
case WRITE_ONLY: return CL10.CL_MEM_WRITE_ONLY;
|
||||||
|
case READ_WRITE: return CL10.CL_MEM_READ_WRITE;
|
||||||
|
default: throw new IllegalArgumentException("Unknown memory access: "+ma);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static MemoryAccess getMemoryAccessFromFlag(long flag) {
|
||||||
|
if ((flag & CL10.CL_MEM_READ_WRITE) > 0) {
|
||||||
|
return MemoryAccess.READ_WRITE;
|
||||||
|
}
|
||||||
|
if ((flag & CL10.CL_MEM_READ_ONLY) > 0) {
|
||||||
|
return MemoryAccess.READ_ONLY;
|
||||||
|
}
|
||||||
|
if ((flag & CL10.CL_MEM_WRITE_ONLY) > 0) {
|
||||||
|
return MemoryAccess.WRITE_ONLY;
|
||||||
|
}
|
||||||
|
throw new OpenCLException("Unknown memory access flag: "+flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getMappingAccessFlags(MappingAccess ma) {
|
||||||
|
switch (ma) {
|
||||||
|
case MAP_READ_ONLY: return CL10.CL_MAP_READ;
|
||||||
|
case MAP_READ_WRITE: return CL10.CL_MAP_READ | CL10.CL_MAP_WRITE;
|
||||||
|
case MAP_WRITE_ONLY: return CL10.CL_MAP_WRITE;
|
||||||
|
case MAP_WRITE_INVALIDATE: return CL12.CL_MAP_WRITE_INVALIDATE_REGION;
|
||||||
|
default: throw new IllegalArgumentException("Unknown mapping access: "+ma);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,10 +35,8 @@ package com.jme3.system.lwjgl;
|
|||||||
import com.jme3.input.lwjgl.JInputJoyInput;
|
import com.jme3.input.lwjgl.JInputJoyInput;
|
||||||
import com.jme3.input.lwjgl.LwjglKeyInput;
|
import com.jme3.input.lwjgl.LwjglKeyInput;
|
||||||
import com.jme3.input.lwjgl.LwjglMouseInput;
|
import com.jme3.input.lwjgl.LwjglMouseInput;
|
||||||
import com.jme3.opencl.Context;
|
|
||||||
import com.jme3.opencl.Device;
|
import com.jme3.opencl.Device;
|
||||||
import com.jme3.opencl.PlatformChooser;
|
import com.jme3.opencl.PlatformChooser;
|
||||||
import com.jme3.opencl.lwjgl.LwjglCL;
|
|
||||||
import com.jme3.opencl.lwjgl.LwjglDevice;
|
import com.jme3.opencl.lwjgl.LwjglDevice;
|
||||||
import com.jme3.opencl.lwjgl.LwjglPlatform;
|
import com.jme3.opencl.lwjgl.LwjglPlatform;
|
||||||
import com.jme3.opencl.lwjgl.PlatformChooserImpl;
|
import com.jme3.opencl.lwjgl.PlatformChooserImpl;
|
||||||
@ -261,6 +259,7 @@ public abstract class LwjglContext implements JmeContext {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
protected void initOpenCL() {
|
protected void initOpenCL() {
|
||||||
logger.info("Initialize OpenCL wiht LWJGL2");
|
logger.info("Initialize OpenCL wiht LWJGL2");
|
||||||
|
|
||||||
@ -349,7 +348,8 @@ public abstract class LwjglContext implements JmeContext {
|
|||||||
|
|
||||||
//create context
|
//create context
|
||||||
try {
|
try {
|
||||||
clContext = new com.jme3.opencl.lwjgl.LwjglContext(CLContext.create(platform.getPlatform(), devices, null, Display.getDrawable(), null));
|
CLContext c = CLContext.create(platform.getPlatform(), devices, null, Display.getDrawable(), null);
|
||||||
|
clContext = new com.jme3.opencl.lwjgl.LwjglContext(c, (List<LwjglDevice>) choosenDevices);
|
||||||
} catch (LWJGLException ex) {
|
} catch (LWJGLException ex) {
|
||||||
logger.log(Level.SEVERE, "Unable to create OpenCL context", ex);
|
logger.log(Level.SEVERE, "Unable to create OpenCL context", ex);
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user