@Override public Event readAsync(CommandQueue queue, ByteBuffer dest, long size, long offset) { //Note: LWJGL does not support the size parameter, I have to set the buffer limit dest.limit((int) (dest.position() + size)); Utils.pointerBuffers[0].rewind(); long q = ((LwjglCommandQueue)queue).getQueue(); int ret = CL10.clEnqueueReadBuffer(q, buffer, false, offset, dest, null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueReadBuffer"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(event); }
@Override public void waitForFinished() { if (event==null) { return; } CL10.clWaitForEvents(event); release(); //short cut to save resources }
@Override public Event writeAsync(CommandQueue queue, ByteBuffer src, long size, long offset) { //Note: LWJGL does not support the size parameter, I have to set the buffer limit src.limit((int) (src.position() + size)); Utils.pointerBuffers[0].rewind(); long q = ((LwjglCommandQueue)queue).getQueue(); int ret = CL10.clEnqueueWriteBuffer(q, buffer, false, offset, src, null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueWriteBuffer"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(event); }
@Override public void waitForFinished() { CL10.clWaitForEvents(event); release(); //short cut to save resources }
@Override public Event readAsync(CommandQueue queue, ByteBuffer dest, long size, long offset) { //Note: LWJGL does not support the size parameter, I have to set the buffer limit dest.limit((int) (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 boolean isCompleted() { int status = Info.clGetEventInfoInt(event, CL10.CL_EVENT_COMMAND_EXECUTION_STATUS); if (status == CL10.CL_SUCCESS) { release(); //short cut to save resources return true; } else if (status < 0) { Utils.checkError(status, "EventStatus"); return false; } else { return false; } }
@Override public Event writeAsync(CommandQueue queue, ByteBuffer src, long size, long offset) { //Note: LWJGL does not support the size parameter, I have to set the buffer limit src.limit((int) (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 boolean isCompleted() { if (event==null) { return true; } int status = event.getInfoInt(CL10.CL_EVENT_COMMAND_EXECUTION_STATUS); if (status == CL10.CL_SUCCESS) { release(); //short cut to save resources return true; } else if (status < 0) { Utils.checkError(status, "EventStatus"); return false; } else { return false; } }
@Override public com.jme3.opencl.Buffer.AsyncMapping mapAsync(CommandQueue queue, long size, long offset, MappingAccess access) { Utils.pointerBuffers[0].rewind(); Utils.errorBuffer.rewind(); long q = ((LwjglCommandQueue) queue).getQueue(); long flags = Utils.getMappingAccessFlags(access); ByteBuffer buf = CL10.clEnqueueMapBuffer(q, buffer, false, flags, offset, size, null, Utils.pointerBuffers[0], Utils.errorBuffer, null); Utils.checkError(Utils.errorBuffer, "clEnqueueMapBuffer"); long event = Utils.pointerBuffers[0].get(0); return new com.jme3.opencl.Buffer.AsyncMapping(new LwjglEvent(event), buf); }
@Override public void waitForFinished() { CL10.clWaitForEvents(event); release(); //short cut to save resources }
@Override public com.jme3.opencl.Buffer.AsyncMapping mapAsync(CommandQueue queue, long size, long 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 public boolean isCompleted() { int status = Info.clGetEventInfoInt(event, CL10.CL_EVENT_COMMAND_EXECUTION_STATUS); if (status == CL10.CL_SUCCESS) { release(); //short cut to save resources return true; } else if (status < 0) { Utils.checkError(status, "EventStatus"); return false; } else { return false; } }
@Override public Event acquireImageForSharingAsync(CommandQueue queue) { Utils.pointerBuffers[0].rewind(); long q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10GL.clEnqueueAcquireGLObjects(q, image, null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueAcquireGLObjects"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(event); } @Override
@Override public Event fillAsync(CommandQueue queue, ByteBuffer pattern, long size, long offset) { Utils.pointerBuffers[0].rewind(); long 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(event); }
@Override public Event copyToAsync(CommandQueue queue, Buffer dest, long size, long srcOffset, long destOffset) { long 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(event); }
@Override public Event acquireBufferForSharingAsync(CommandQueue queue) { Utils.pointerBuffers[0].rewind(); long q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10GL.clEnqueueAcquireGLObjects(q, buffer, null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueAcquireGLObjects"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(event); } @Override
@Override public Event acquireBufferForSharingAsync(CommandQueue queue) { Utils.pointerBuffers[0].rewind(); CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10GL.clEnqueueAcquireGLObjects(q, buffer, null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueAcquireGLObjects"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(q.getCLEvent(event)); } @Override
@Override public Event releaseBufferForSharingAsync(CommandQueue queue) { Utils.pointerBuffers[0].rewind(); CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10GL.clEnqueueReleaseGLObjects(q, buffer, null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueReleaseGLObjects"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(q.getCLEvent(event)); } @Override
@Override public Event releaseImageForSharingAsync(CommandQueue queue) { Utils.assertSharingPossible(); Utils.pointerBuffers[0].rewind(); long q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10GL.clEnqueueReleaseGLObjects(q, image, null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueReleaseGLObjects"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(event); } @Override
@Override public Event fillAsync(CommandQueue queue, long[] origin, long[] region, ColorRGBA color) { if (origin.length!=3 || region.length!=3) { throw new IllegalArgumentException("origin and region must both be arrays of length 3"); } Utils.pointerBuffers[0].rewind(); Utils.pointerBuffers[1].rewind(); Utils.pointerBuffers[2].rewind(); Utils.pointerBuffers[1].put(origin).position(0); Utils.pointerBuffers[2].put(region).position(0); Utils.tempBuffers[0].b16f.rewind(); Utils.tempBuffers[0].b16f.limit(4); Utils.tempBuffers[0].b16f.put(color.r).put(color.g).put(color.b).put(color.a); Utils.tempBuffers[0].b16.rewind(); long q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL12.clEnqueueFillImage(q, image, Utils.tempBuffers[0].b16, Utils.pointerBuffers[1], Utils.pointerBuffers[2], null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueFillImage"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(event); //TODO: why does q.getCLEvent(event) return null? //This is a bug in LWJGL: they forgot to include the line // if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); // after the native call }