|
@@ -33,16 +33,13 @@ package com.jme3.opencl.lwjgl;
|
|
|
|
|
|
import com.jme3.opencl.*;
|
|
import com.jme3.opencl.*;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteBuffer;
|
|
-import org.lwjgl.opencl.CL10;
|
|
|
|
-import org.lwjgl.opencl.CLCommandQueue;
|
|
|
|
-import org.lwjgl.opencl.CLEvent;
|
|
|
|
-import org.lwjgl.opencl.CLMem;
|
|
|
|
|
|
+import org.lwjgl.opencl.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
*
|
|
*
|
|
* @author Sebastian Weiss
|
|
* @author Sebastian Weiss
|
|
*/
|
|
*/
|
|
-public class LwjglBuffer implements Buffer {
|
|
|
|
|
|
+public class LwjglBuffer extends Buffer {
|
|
|
|
|
|
private final CLMem buffer;
|
|
private final CLMem buffer;
|
|
|
|
|
|
@@ -72,16 +69,6 @@ public class LwjglBuffer implements Buffer {
|
|
Utils.checkError(ret, "clEnqueueReadBuffer");
|
|
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
|
|
@Override
|
|
public Event readAsync(CommandQueue queue, ByteBuffer dest, int size, int offset) {
|
|
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
|
|
//Note: LWJGL does not support the size parameter, I have to set the buffer limit
|
|
@@ -94,16 +81,6 @@ public class LwjglBuffer implements Buffer {
|
|
return new LwjglEvent(q.getCLEvent(event));
|
|
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
|
|
@Override
|
|
public void write(CommandQueue queue, ByteBuffer src, int size, int offset) {
|
|
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
|
|
//Note: LWJGL does not support the size parameter, I have to set the buffer limit
|
|
@@ -113,16 +90,6 @@ public class LwjglBuffer implements Buffer {
|
|
Utils.checkError(ret, "clEnqueueWriteBuffer");
|
|
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
|
|
@Override
|
|
public Event writeAsync(CommandQueue queue, ByteBuffer src, int size, int offset) {
|
|
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
|
|
//Note: LWJGL does not support the size parameter, I have to set the buffer limit
|
|
@@ -135,16 +102,6 @@ public class LwjglBuffer implements Buffer {
|
|
return new LwjglEvent(q.getCLEvent(event));
|
|
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
|
|
@Override
|
|
public void copyTo(CommandQueue queue, Buffer dest, int size, int srcOffset, int destOffset) {
|
|
public void copyTo(CommandQueue queue, Buffer dest, int size, int srcOffset, int destOffset) {
|
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
|
@@ -156,16 +113,6 @@ public class LwjglBuffer implements Buffer {
|
|
Utils.checkError(ret, "clWaitForEvents");
|
|
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
|
|
@Override
|
|
public Event copyToAsync(CommandQueue queue, Buffer dest, int size, int srcOffset, int destOffset) {
|
|
public Event copyToAsync(CommandQueue queue, Buffer dest, int size, int srcOffset, int destOffset) {
|
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
|
CLCommandQueue q = ((LwjglCommandQueue)queue).getQueue();
|
|
@@ -176,16 +123,6 @@ public class LwjglBuffer implements Buffer {
|
|
return new LwjglEvent(q.getCLEvent(event));
|
|
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
|
|
@Override
|
|
public ByteBuffer map(CommandQueue queue, int size, int offset, MappingAccess access) {
|
|
public ByteBuffer map(CommandQueue queue, int size, int offset, MappingAccess access) {
|
|
CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
|
CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
|
@@ -197,24 +134,51 @@ public class LwjglBuffer implements Buffer {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public ByteBuffer map(CommandQueue queue, int size, MappingAccess access) {
|
|
|
|
- return map(queue, size, 0, access);
|
|
|
|
|
|
+ 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");
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public ByteBuffer map(CommandQueue queue, MappingAccess access) {
|
|
|
|
- return map(queue, getSize(), access);
|
|
|
|
|
|
+ public com.jme3.opencl.Buffer.AsyncMapping mapAsync(CommandQueue queue, int size, int offset, MappingAccess access) {
|
|
|
|
+ Utils.pointerBuffers[0].rewind();
|
|
|
|
+ Utils.errorBuffer.rewind();
|
|
|
|
+ CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
|
|
|
+ long flags = Utils.getMappingAccessFlags(access);
|
|
|
|
+ ByteBuffer buf = CL10.clEnqueueMapBuffer(q, buffer, CL10.CL_FALSE, flags, offset, size, null, Utils.pointerBuffers[0], Utils.errorBuffer);
|
|
|
|
+ Utils.checkError(Utils.errorBuffer, "clEnqueueMapBuffer");
|
|
|
|
+ long event = Utils.pointerBuffers[0].get(0);
|
|
|
|
+ return new com.jme3.opencl.Buffer.AsyncMapping(new LwjglEvent(q.getCLEvent(event)), buf);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public void unmap(CommandQueue queue, ByteBuffer ptr) {
|
|
|
|
|
|
+ public Event fillAsync(CommandQueue queue, ByteBuffer pattern, int size, int offset) {
|
|
|
|
+ Utils.pointerBuffers[0].rewind();
|
|
CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
|
CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
|
|
|
+ int ret = CL12.clEnqueueFillBuffer(q, buffer, pattern, offset, size, null, Utils.pointerBuffers[0]);
|
|
|
|
+ Utils.checkError(ret, "clEnqueueFillBuffer");
|
|
|
|
+ long event = Utils.pointerBuffers[0].get(0);
|
|
|
|
+ return new LwjglEvent(q.getCLEvent(event));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Event copyToImageAsync(CommandQueue queue, Image dest, long srcOffset, long[] destOrigin, long[] destRegion) {
|
|
Utils.pointerBuffers[0].rewind();
|
|
Utils.pointerBuffers[0].rewind();
|
|
- int ret = CL10.clEnqueueUnmapMemObject(q, buffer, ptr, null, Utils.pointerBuffers[0]);
|
|
|
|
- Utils.checkError(ret, "clEnqueueUnmapMemObject");
|
|
|
|
|
|
+ Utils.pointerBuffers[1].rewind();
|
|
|
|
+ Utils.pointerBuffers[2].rewind();
|
|
|
|
+ Utils.pointerBuffers[1].put(destOrigin).position(0);
|
|
|
|
+ Utils.pointerBuffers[2].put(destRegion).position(0);
|
|
|
|
+ CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue();
|
|
|
|
+ int ret = CL10.clEnqueueCopyBufferToImage(q, buffer, ((LwjglImage) dest).getImage(),
|
|
|
|
+ srcOffset, Utils.pointerBuffers[1], Utils.pointerBuffers[2], null, Utils.pointerBuffers[0]);
|
|
|
|
+ Utils.checkError(ret, "clEnqueueCopyBufferToImage");
|
|
long event = Utils.pointerBuffers[0].get(0);
|
|
long event = Utils.pointerBuffers[0].get(0);
|
|
- ret = CL10.clWaitForEvents(q.getCLEvent(event));
|
|
|
|
- Utils.checkError(ret, "clWaitForEvents");
|
|
|
|
|
|
+ return new LwjglEvent(q.getCLEvent(event));
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|