@Override public Buffer createBuffer(long size, MemoryAccess access) { long flags = Utils.getMemoryAccessFlags(access); CLMem mem = CL10.clCreateBuffer(context, flags, size, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateBuffer"); return new LwjglBuffer(mem); }
public static void reportError(int error, String callName) { if (error != CL10.CL_SUCCESS) { String errname = getErrorName(error); if (errname == null) { errname = "UNKNOWN"; } LOG.log(Level.WARNING, "OpenCL error in {0}: {1} (0x{2})", new Object[]{callName, errname, Integer.toHexString(error)}); } }
@Override public int getDriverVersionMajor() { return Utils.getMajorVersion(getDriverVersion(), ""); }
@Override public void releaseBufferForSharingNoEvent(CommandQueue queue) { Utils.assertSharingPossible(); long q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10GL.clEnqueueReleaseGLObjects(q, buffer, null, null); Utils.checkError(ret, "clEnqueueReleaseGLObjects"); }
@Override public Buffer bindVertexBuffer(VertexBuffer vb, MemoryAccess access) { Utils.assertSharingPossible(); int id = vb.getId(); if (id == -1) { throw new IllegalArgumentException("vertex buffer was not yet uploaded to the GPU or is CPU only"); } long flags = Utils.getMemoryAccessFlags(access); Utils.errorBuffer.rewind(); long mem = CL10GL.clCreateFromGLBuffer(context, flags, id, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateFromGLBuffer"); return new LwjglBuffer(mem); }
@Override public ByteBuffer map(CommandQueue queue, long size, long offset, MappingAccess access) { long q = ((LwjglCommandQueue) queue).getQueue(); long flags = Utils.getMappingAccessFlags(access); Utils.errorBuffer.rewind(); ByteBuffer b = CL10.clEnqueueMapBuffer(q, buffer, true, flags, offset, size, null, null, Utils.errorBuffer, null); Utils.checkError(Utils.errorBuffer, "clEnqueueMapBuffer"); return b; }
@Override public void release() { if (queue != null) { int ret = CL10.clReleaseCommandQueue(queue); queue = null; Utils.reportError(ret, "clReleaseCommandQueue"); } } }
@Override public int getVersionMinor() { return Utils.getMinorVersion(getVersion(), "OpenCL "); }
@Override public void flush() { int ret = CL10.clFlush(queue); Utils.checkError(ret, "clFlush"); }
@Override public MemoryAccess getMemoryAccessFlags() { return Utils.getMemoryAccessFromFlag(Info.clGetMemObjectInfoLong(buffer, CL10.CL_MEM_FLAGS)); }
@Override public ByteBuffer map(CommandQueue queue, long size, long offset, MappingAccess access) { CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue(); long flags = Utils.getMappingAccessFlags(access); Utils.errorBuffer.rewind(); ByteBuffer b = CL10.clEnqueueMapBuffer(q, buffer, CL10.CL_TRUE, flags, offset, size, null, null, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clEnqueueMapBuffer"); return b; }
@Override protected Image bindPureRenderBuffer(FrameBuffer.RenderBuffer buffer, MemoryAccess access) { Utils.assertSharingPossible(); int renderbuffer = buffer.getId(); if (renderbuffer == -1) { throw new IllegalArgumentException("renderbuffer was not yet uploaded to the GPU"); } long memFlags = Utils.getMemoryAccessFlags(access); Utils.errorBuffer.rewind(); long mem = CL10GL.clCreateFromGLRenderbuffer(context, memFlags, renderbuffer, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateFromGLRenderbuffer"); return new LwjglImage(mem); }
@Override public void releaseImageForSharingNoEvent(CommandQueue queue) { Utils.assertSharingPossible(); long q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10GL.clEnqueueReleaseGLObjects(q, image, null, null); Utils.checkError(ret, "clEnqueueReleaseGLObjects"); }
@Override public void release() { if (kernel != 0) { int ret = CL10.clReleaseKernel(kernel); kernel = 0; Utils.reportError(ret, "clReleaseKernel"); } } }
@Override public int getVersionMinor() { return Utils.getMinorVersion(getVersion(), "OpenCL "); }
@Override public void setArg(int index, int i) { int ret = CL10.clSetKernelArg1i(kernel, index, i); Utils.checkError(ret, "clSetKernelArg"); }
@Override public MemoryAccess getMemoryAccessFlags() { return Utils.getMemoryAccessFromFlag(buffer.getInfoLong(CL10.CL_MEM_FLAGS)); }
@Override public Buffer createBufferFromHost(ByteBuffer data, MemoryAccess access) { long flags = Utils.getMemoryAccessFlags(access); flags |= CL10.CL_MEM_USE_HOST_PTR; CLMem mem = CL10.clCreateBuffer(context, flags, data, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateBuffer"); return new LwjglBuffer(mem); }
@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 Image bindImage(com.jme3.texture.Image image, Texture.Type textureType, int miplevel, MemoryAccess access) { Utils.assertSharingPossible(); int imageID = image.getId(); if (imageID == -1) { throw new IllegalArgumentException("image was not yet uploaded to the GPU"); } long memFlags = Utils.getMemoryAccessFlags(access); int textureTarget = convertTextureType(textureType); Utils.errorBuffer.rewind(); long mem = CL12GL.clCreateFromGLTexture(context, memFlags, textureTarget, miplevel, imageID, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateFromGLTexture"); return new LwjglImage(mem); }