/** * Wait for this event, blocking the caller thread independently of any queue until all of the command associated with this events completes. */ public void waitFor() { waitFor(this); }
void release() { if (clBuffer != null) clBuffer.release(); clBuffer = null; if (updateEvent != null) updateEvent.release(); updateEvent = null; } }
static CLEvent createEventFromPointer(CLQueue queue, Pointer<cl_event> evt1) { if (evt1 == null) return null; long peer = evt1.getSizeT(); if (peer == 0) return null; return new CLEvent(queue, peer); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueTask.html">clEnqueueTask</a>.<br> * Enqueues a command to execute a kernel on a device. <br> * The kernel is executed using a single work-item. * @param queue * @param eventsToWaitFor Events that need to complete before this particular command can be executed. Special value {@link CLEvent#FIRE_AND_FORGET} can be used to avoid returning a CLEvent. * @return Event object that identifies this command and can be used to query or queue a wait for the command to complete, or null if eventsToWaitFor contains {@link CLEvent#FIRE_AND_FORGET}. */ public CLEvent enqueueTask(CLQueue queue, CLEvent... eventsToWaitFor) { ReusablePointers ptrs = ReusablePointers.get(); int[] eventsInCount = ptrs.int1Array; Pointer<cl_event> eventsIn = CLAbstractEntity.copyNonNullEntities(eventsToWaitFor, eventsInCount, ptrs.events_in); Pointer<cl_event> eventOut = eventsToWaitFor == null || CLEvent.containsFireAndForget(eventsToWaitFor) ? null : ptrs.event_out; error(CL.clEnqueueTask(queue.getEntity(), getEntity(), eventsInCount[0], getPeer(eventsIn) , getPeer(eventOut) )); return CLEvent.createEventFromPointer(queue, eventOut) ; }
CLAbstractEntity.copyNonNullEntities(eventsToWaitFor, eventsInCount, ptrs.events_in); Pointer<cl_event> eventOut = blocking || eventsToWaitFor == null || CLEvent.containsFireAndForget(eventsToWaitFor) ? null : ptrs.event_out; getPeer(in), eventsInCount[0], getPeer(eventsIn) , getPeer(eventOut) )); CLEvent evt = CLEvent.createEventFromPointer(queue, eventOut) ; evt.invokeUponCompletion(new Runnable() { public void run() {
static CLEvent createEvent(final CLQueue queue, long evt) { return createEvent(queue, evt, false); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueTask.html">clEnqueueTask</a>.<br> * Enqueues a command to execute a kernel on a device. <br> * The kernel is executed using a single work-item. * @param queue * @param eventsToWaitFor Events that need to complete before this particular command can be executed. Special value {@link CLEvent#FIRE_AND_FORGET} can be used to avoid returning a CLEvent. * @return Event object that identifies this command and can be used to query or queue a wait for the command to complete, or null if eventsToWaitFor contains {@link CLEvent#FIRE_AND_FORGET}. */ public CLEvent enqueueTask(CLQueue queue, CLEvent... eventsToWaitFor) { ReusablePointers ptrs = ReusablePointers.get(); int[] eventsInCount = ptrs.int1Array; Pointer<cl_event> eventsIn = CLAbstractEntity.copyNonNullEntities(eventsToWaitFor, eventsInCount, ptrs.events_in); Pointer<cl_event> eventOut = eventsToWaitFor == null || CLEvent.containsFireAndForget(eventsToWaitFor) ? null : ptrs.event_out; error(CL.clEnqueueTask(queue.getEntity(), getEntity(), eventsInCount[0], getPeer(eventsIn) , getPeer(eventOut) )); return CLEvent.createEventFromPointer(queue, eventOut) ; }
CLAbstractEntity.copyNonNullEntities(eventsToWaitFor, eventsInCount, ptrs.events_in); Pointer<cl_event> eventOut = blocking || eventsToWaitFor == null || CLEvent.containsFireAndForget(eventsToWaitFor) ? null : ptrs.event_out; getPeer(in), eventsInCount[0], getPeer(eventsIn) , getPeer(eventOut) )); CLEvent evt = CLEvent.createEventFromPointer(queue, eventOut) ; evt.invokeUponCompletion(new Runnable() { public void run() {
static CLEvent createEvent(final CLQueue queue, long evt) { return createEvent(queue, evt, false); }
/** * Wait for this event, blocking the caller thread independently of any queue until all of the command associated with this events completes. */ public void waitFor() { waitFor(this); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueUnmapMemObject.html">clEnqueueUnmapMemObject</a>.<br> * @param queue Execution queue for this operation. * @param buffer * @param eventsToWaitFor Events that need to complete before this particular command can be executed. Special value {@link CLEvent#FIRE_AND_FORGET} can be used to avoid returning a CLEvent. * @return Event object that identifies this command and can be used to query or queue a wait for the command to complete, or null if eventsToWaitFor contains {@link CLEvent#FIRE_AND_FORGET}. */ public CLEvent unmap(CLQueue queue, Pointer<T> buffer, CLEvent... eventsToWaitFor) { ReusablePointers ptrs = ReusablePointers.get(); int[] eventsInCount = ptrs.int1Array; Pointer<cl_event> eventsIn = CLAbstractEntity.copyNonNullEntities(eventsToWaitFor, eventsInCount, ptrs.events_in); Pointer<cl_event> eventOut = eventsToWaitFor == null || CLEvent.containsFireAndForget(eventsToWaitFor) ? null : ptrs.event_out; ; error(CL.clEnqueueUnmapMemObject(queue.getEntity(), getEntity(), getPeer(buffer), eventsInCount[0], getPeer(eventsIn) , getPeer(eventOut) )); return CLEvent.createEventFromPointer(queue, eventOut) ; }
private synchronized void updateKernelArgs() { if (useOpenGLContext) interleavedColorAndPositionsMem.acquireGLObject(queue); try { CLEvent evt = particlesProgram.updateParticle( queue, massesMem, velocitiesMem, interleavedColorAndPositionsMem.as(Float.class), new float[] {mouseX - width / 2f, height / 2f - mouseY}, new float[] {width, height}, massFactor, speedFactor, slowDownFactor, hasMouse ? mouseWeight : 0, (byte)(limitToScreen ? 1 : 0), new int[] { particlesCount }, null ); evt.release(); // the gc might be to slow to reclaim the event, so do manual memory management here } catch (Throwable ex) { exception(ex); System.exit(1); } if (useOpenGLContext) interleavedColorAndPositionsMem.releaseGLObject(queue); } }
static CLEvent createEvent(final CLQueue queue, long evt, boolean isUserEvent) { if (evt == 0) return null; return isUserEvent ? new CLUserEvent(queue, evt) : new CLEvent(queue, evt); }
/** * Creates a user event object. <br> * User events allow applications to enqueue commands that wait on a user event to finish before the command is executed by the device. * @since OpenCL 1.1 */ public CLUserEvent createUserEvent() { platform.requireMinVersionValue("clCreateUserEvent", 1.1); ReusablePointers ptrs = ReusablePointers.get(); Pointer<Integer> pErr = ptrs.pErr; long evt = CL.clCreateUserEvent(getEntity(), getPeer(pErr)); error(pErr.getInt()); return (CLUserEvent)CLEvent.createEvent(null, evt, true); }
/** * Wait until all write operations are completed so that the data is readable. */ public synchronized void waitForRead() { CLEvent.waitFor(lastWriteEvent); lastWriteEvent = null; } /**
CLAbstractEntity.copyNonNullEntities(eventsToWaitFor, eventsInCount, ptrs.events_in); Pointer<cl_event> eventOut = blocking || eventsToWaitFor == null || CLEvent.containsFireAndForget(eventsToWaitFor) ? null : ptrs.event_out; getPeer(in), eventsInCount[0], getPeer(eventsIn) , getPeer(eventOut) )); return CLEvent.createEventFromPointer(queue, eventOut) ; }
static CLEvent createEventFromPointer(CLQueue queue, Pointer<cl_event> evt1) { if (evt1 == null) return null; long peer = evt1.getSizeT(); if (peer == 0) return null; return new CLEvent(queue, peer); }
/** * Creates a user event object. <br> * User events allow applications to enqueue commands that wait on a user event to finish before the command is executed by the device. * @since OpenCL 1.1 */ public CLUserEvent createUserEvent() { platform.requireMinVersionValue("clCreateUserEvent", 1.1); ReusablePointers ptrs = ReusablePointers.get(); Pointer<Integer> pErr = ptrs.pErr; long evt = CL.clCreateUserEvent(getEntity(), getPeer(pErr)); error(pErr.getInt()); return (CLUserEvent)CLEvent.createEvent(null, evt, true); }
public CLEvent perform(CLEvent[] evts) { CLEvent.waitFor(evts); return null; } });
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueUnmapMemObject.html">clEnqueueUnmapMemObject</a>.<br> * @param queue Execution queue for this operation. * @param buffer * @param eventsToWaitFor Events that need to complete before this particular command can be executed. Special value {@link CLEvent#FIRE_AND_FORGET} can be used to avoid returning a CLEvent. * @return Event object that identifies this command and can be used to query or queue a wait for the command to complete, or null if eventsToWaitFor contains {@link CLEvent#FIRE_AND_FORGET}. */ public CLEvent unmap(CLQueue queue, Pointer<T> buffer, CLEvent... eventsToWaitFor) { ReusablePointers ptrs = ReusablePointers.get(); int[] eventsInCount = ptrs.int1Array; Pointer<cl_event> eventsIn = CLAbstractEntity.copyNonNullEntities(eventsToWaitFor, eventsInCount, ptrs.events_in); Pointer<cl_event> eventOut = eventsToWaitFor == null || CLEvent.containsFireAndForget(eventsToWaitFor) ? null : ptrs.event_out; ; error(CL.clEnqueueUnmapMemObject(queue.getEntity(), getEntity(), getPeer(buffer), eventsInCount[0], getPeer(eventsIn) , getPeer(eventOut) )); return CLEvent.createEventFromPointer(queue, eventOut) ; }