/* * Created on Friday, May 06 2011 21:02 */ package com.jogamp.opencl.util.concurrent; import com.jogamp.opencl.CLCommandQueue; import com.jogamp.opencl.CLContext; import com.jogamp.opencl.CLKernel; import com.jogamp.opencl.CLProgram; import com.jogamp.opencl.CLResource; import java.util.Map; /** * Superclass for all per-queue contexts as used in {@link CLCommandQueuePool}s. * A context will usually hold queue (and therefore often device) specific resources used * in tasks of the same queue. *

* Possible candidates for those resources can be compiled CLPrograms, CLKernels * or even pre allocated CLBuffers. *

* @author Michael Bien */ public abstract class CLQueueContext implements CLResource { public final CLCommandQueue queue; public CLQueueContext(CLCommandQueue queue) { this.queue = queue; } public CLCommandQueue getQueue() { return queue; } public CLContext getCLContext() { return queue.getContext(); } /** * A simple queue context holding a precompiled program and its kernels. * @author Michael Bien */ public static class CLSingleProgramQueueContext extends CLQueueContext { public final CLProgram program; public final Map kernels; public CLSingleProgramQueueContext(CLCommandQueue queue, CLProgram program) { super(queue); this.program = program; this.kernels = program.createCLKernels(); } public CLSingleProgramQueueContext(CLCommandQueue queue, String... source) { this(queue, queue.getContext().createProgram(source).build()); } public Map getKernels() { return kernels; } public CLKernel getKernel(String name) { return kernels.get(name); } public CLProgram getProgram() { return program; } @Override public void release() { synchronized(program) { if(!program.isReleased()) { program.release(); } } } @Override public boolean isReleased() { return program.isReleased(); } } }