@Override public Image createImage(MemoryAccess access, ImageFormat format, ImageDescriptor descr) { long memFlags = Utils.getMemoryAccessFlags(access); Utils.errorBuffer.rewind(); //fill image format Utils.tempBuffers[0].b16i.rewind(); Utils.tempBuffers[0].b16i.put(LwjglImage.decodeImageChannelOrder(format.channelOrder)) .put(LwjglImage.decodeImageChannelType(format.channelType)); Utils.tempBuffers[0].b16.rewind(); //fill image desc Utils.b80l.rewind(); Utils.b80l.put(LwjglImage.decodeImageType(descr.type)) .put(descr.width).put(descr.height).put(descr.depth) .put(descr.arraySize).put(descr.rowPitch).put(descr.slicePitch) .put(0).put(0).put(0); Utils.b80.rewind(); //create image CLMem mem = CL12.clCreateImage(context, memFlags, Utils.tempBuffers[0].b16, Utils.b80, descr.hostPtr, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateImage"); return new LwjglImage(mem); }
@Override public ImageFormat[] querySupportedFormats(MemoryAccess access, Image.ImageType type) { long memFlags = Utils.getMemoryAccessFlags(access); int typeFlag = LwjglImage.decodeImageType(type); Utils.tempBuffers[0].b16i.rewind(); //query count int ret = CL10.clGetSupportedImageFormats(context, memFlags, typeFlag, null, Utils.tempBuffers[0].b16i); Utils.checkError(ret, "clGetSupportedImageFormats"); int count = Utils.tempBuffers[0].b16i.get(0); if (count == 0) { return new ImageFormat[0]; } //get formats ByteBuffer formatsB = BufferUtils.createByteBuffer(count * 8); ret = CL10.clGetSupportedImageFormats(context, memFlags, typeFlag, formatsB, null); Utils.checkError(ret, "clGetSupportedImageFormats"); //convert formats ImageFormat[] formats = new ImageFormat[count]; IntBuffer formatsBi = formatsB.asIntBuffer(); formatsBi.rewind(); for (int i=0; i<count; ++i) { Image.ImageChannelOrder channelOrder = LwjglImage.encodeImageChannelOrder(formatsBi.get()); Image.ImageChannelType channelType = LwjglImage.encodeImageChannelType(formatsBi.get()); formats[i] = new ImageFormat(channelOrder, channelType); } return formats; }
@Override public ImageType getImageType() { int type = image.getInfoInt(CL10.CL_MEM_TYPE); return encodeImageType(type); }
@Override public ImageFormat getImageFormat() { CLImageFormat format = image.getImageFormat(); return new ImageFormat( encodeImageChannelOrder(format.getChannelOrder()), encodeImageChannelType(format.getChannelType())); }
@Override public void setArg(int index, Image i) { int ret = CL10.clSetKernelArg(kernel, index, ((LwjglImage) i).getImage()); Utils.checkError(ret, "clSetKernelArg"); }
@Override protected Image bindPureRenderBuffer(FrameBuffer.RenderBuffer buffer, MemoryAccess access) { 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(); CLMem mem = CL10GL.clCreateFromGLRenderbuffer(context, memFlags, renderbuffer, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateFromGLRenderbuffer"); return new LwjglImage(mem); }
@Override public ImageFormat getImageFormat() { Utils.b80.rewind(); CLImageFormat format = new CLImageFormat(Utils.b80); int limit = Utils.b80.limit(); Utils.b80.limit(format.sizeof()); int ret = CL10.clGetImageInfo(image, CL10.CL_IMAGE_FORMAT, Utils.b80, null); Utils.b80.limit(limit); Utils.checkError(ret, "clGetImageInfo"); return new ImageFormat(encodeImageChannelOrder(format.image_channel_order()), encodeImageChannelType(format.image_channel_data_type())); }
@Override public void setArg(int index, Image i) { int ret = CL10.clSetKernelArg1p(kernel, index, ((LwjglImage) i).getImage()); Utils.checkError(ret, "clSetKernelArg"); }
@Override public Image bindImage(com.jme3.texture.Image image, Texture.Type textureType, int miplevel, MemoryAccess access) { 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(); CLMem mem = CL12GL.clCreateFromGLTexture(context, memFlags, textureTarget, miplevel, imageID, Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateFromGLTexture"); return new LwjglImage(mem); }
f = CLImageFormat.malloc(); d = CLImageDesc.calloc(); f.image_channel_data_type(LwjglImage.decodeImageChannelType(format.channelType)); f.image_channel_order(LwjglImage.decodeImageChannelOrder(format.channelOrder)); d.image_type(LwjglImage.decodeImageType(descr.type)); d.image_width(descr.width); d.image_height(descr.height); return new LwjglImage(mem); } finally { if (f != null) {
@Override public ImageFormat[] querySupportedFormats(MemoryAccess access, Image.ImageType type) { long memFlags = Utils.getMemoryAccessFlags(access); int typeFlag = LwjglImage.decodeImageType(type); Utils.tempBuffers[0].b16i.rewind(); //query count int ret = CL10.clGetSupportedImageFormats(context, memFlags, typeFlag, null, Utils.tempBuffers[0].b16i); Utils.checkError(ret, "clGetSupportedImageFormats"); int count = Utils.tempBuffers[0].b16i.get(0); if (count == 0) { return new ImageFormat[0]; } //get formats CLImageFormat.Buffer formatsB = new CLImageFormat.Buffer(BufferUtils.createByteBuffer(count * CLImageFormat.SIZEOF)); ret = CL10.clGetSupportedImageFormats(context, memFlags, typeFlag, formatsB, (IntBuffer) null); Utils.checkError(ret, "clGetSupportedImageFormats"); //convert formats ImageFormat[] formats = new ImageFormat[count]; for (int i=0; i<count; ++i) { CLImageFormat f = formatsB.get(); Image.ImageChannelOrder channelOrder = LwjglImage.encodeImageChannelOrder(f.image_channel_order()); Image.ImageChannelType channelType = LwjglImage.encodeImageChannelType(f.image_channel_data_type()); formats[i] = new ImageFormat(channelOrder, channelType); } return formats; }
@Override public ImageFormat getImageFormat() { Utils.b80.rewind(); CLImageFormat format = new CLImageFormat(Utils.b80); int limit = Utils.b80.limit(); Utils.b80.limit(format.sizeof()); int ret = CL10.clGetImageInfo(image, CL10.CL_IMAGE_FORMAT, Utils.b80, null); Utils.b80.limit(limit); Utils.checkError(ret, "clGetImageInfo"); return new ImageFormat(encodeImageChannelOrder(format.image_channel_order()), encodeImageChannelType(format.image_channel_data_type())); }
@Override public Event copyToImageAsync(CommandQueue queue, Image dest, long srcOffset, long[] destOrigin, long[] destRegion) { if (destOrigin.length!=3 || destRegion.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(destOrigin).position(0); Utils.pointerBuffers[2].put(destRegion).position(0); long q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10.clEnqueueCopyBufferToImage(q, buffer, ((LwjglImage) dest).getImage(), srcOffset, Utils.pointerBuffers[1], Utils.pointerBuffers[2], null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueCopyBufferToImage"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(event); }
@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 ImageType getImageType() { int type = Info.clGetMemObjectInfoInt(image, CL10.CL_MEM_TYPE); return encodeImageType(type); }
f = CLImageFormat.malloc(); d = CLImageDesc.calloc(); f.image_channel_data_type(LwjglImage.decodeImageChannelType(format.channelType)); f.image_channel_order(LwjglImage.decodeImageChannelOrder(format.channelOrder)); d.image_type(LwjglImage.decodeImageType(descr.type)); d.image_width(descr.width); d.image_height(descr.height); return new LwjglImage(mem); } finally { if (f != null) {
@Override public ImageFormat[] querySupportedFormats(MemoryAccess access, Image.ImageType type) { long memFlags = Utils.getMemoryAccessFlags(access); int typeFlag = LwjglImage.decodeImageType(type); Utils.tempBuffers[0].b16i.rewind(); //query count int ret = CL10.clGetSupportedImageFormats(context, memFlags, typeFlag, null, Utils.tempBuffers[0].b16i); Utils.checkError(ret, "clGetSupportedImageFormats"); int count = Utils.tempBuffers[0].b16i.get(0); if (count == 0) { return new ImageFormat[0]; } //get formats CLImageFormat.Buffer formatsB = new CLImageFormat.Buffer(BufferUtils.createByteBuffer(count * CLImageFormat.SIZEOF)); ret = CL10.clGetSupportedImageFormats(context, memFlags, typeFlag, formatsB, (IntBuffer) null); Utils.checkError(ret, "clGetSupportedImageFormats"); //convert formats ImageFormat[] formats = new ImageFormat[count]; for (int i=0; i<count; ++i) { CLImageFormat f = formatsB.get(); Image.ImageChannelOrder channelOrder = LwjglImage.encodeImageChannelOrder(f.image_channel_order()); Image.ImageChannelType channelType = LwjglImage.encodeImageChannelType(f.image_channel_data_type()); formats[i] = new ImageFormat(channelOrder, channelType); } return formats; }
@Override public Event copyToImageAsync(CommandQueue queue, Image dest, long srcOffset, long[] destOrigin, long[] destRegion) { if (destOrigin.length!=3 || destRegion.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(destOrigin).position(0); Utils.pointerBuffers[2].put(destRegion).position(0); CLCommandQueue q = ((LwjglCommandQueue) queue).getQueue(); int ret = CL10.clEnqueueCopyBufferToImage(q, buffer, ((LwjglImage) dest).getImage(), srcOffset, Utils.pointerBuffers[1], Utils.pointerBuffers[2], null, Utils.pointerBuffers[0]); Utils.checkError(ret, "clEnqueueCopyBufferToImage"); long event = Utils.pointerBuffers[0].get(0); return new LwjglEvent(q.getCLEvent(event)); }
@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); }
@Override public ImageType getImageType() { int type = Info.clGetMemObjectInfoInt(image, CL10.CL_MEM_TYPE); return encodeImageType(type); }