package com.mbien.opencl.gl; import com.mbien.opencl.CL; import com.mbien.opencl.CLBuffer; import com.mbien.opencl.CLContext; import com.mbien.opencl.CLMemory.GLObjectType; import java.nio.Buffer; /** * Shared buffer between OpenGL and OpenCL contexts. * @author Michael Bien */ public final class CLGLBuffer extends CLBuffer implements CLGLObject { /** * The OpenGL object handle. */ public final int GLID; private CLGLBuffer(CLContext context, B directBuffer, long id, int glObject) { super(context, directBuffer, id); this.GLID = glObject; } static CLGLBuffer create(CLContext context, B directBuffer, int flags, int glObject) { checkBuffer(directBuffer, flags); CL cl = getCL(context); int[] result = new int[1]; CLGLI clgli = (CLGLI)cl; long id = clgli.clCreateFromGLBuffer(context.ID, flags, glObject, result, 0); return new CLGLBuffer(context, directBuffer, id, glObject); } static void checkBuffer(B directBuffer, int flags) throws IllegalArgumentException { if (directBuffer != null && !directBuffer.isDirect()) { throw new IllegalArgumentException("buffer is not a direct buffer"); } if (isHostPointerFlag(flags)) { throw new IllegalArgumentException("CL_MEM_COPY_HOST_PTR or CL_MEM_USE_HOST_PTR can not be used with OpenGL Buffers."); } } public int getGLObjectID() { return GLID; } public GLObjectType getGLObjectType() { return GLObjectType.GL_OBJECT_BUFFER; } @Override public CLGLBuffer cloneWith(T directBuffer) { return new CLGLBuffer(context, directBuffer, ID, GLID); } @Override public String toString() { return "CLGLBuffer [id: " + ID+" glID: "+GLID+"]"; } }