@Override public String toString() { StringBuilder str = new StringBuilder(); str.append("Image ("); ImageType t = getImageType(); str.append(t); str.append(", w=").append(getWidth()); if (t == ImageType.IMAGE_2D || t == ImageType.IMAGE_3D) { str.append(", h=").append(getHeight()); } if (t == ImageType.IMAGE_3D) { str.append(", d=").append(getDepth()); } if (t == ImageType.IMAGE_1D_ARRAY || t == ImageType.IMAGE_2D_ARRAY) { str.append(", arrays=").append(getArraySize()); } str.append(", ").append(getImageFormat()); str.append(')'); return str.toString(); }
/** * Aquires this image object for using. Only call this method if this image * represents a shared object from OpenGL, created with e.g. * {@link Context#bindImage(com.jme3.texture.Image, com.jme3.texture.Texture.Type, int, com.jme3.opencl.MemoryAccess) } * or variations. * This method must be called before the image is used. After the work is * done, the image must be released by calling * {@link #releaseImageForSharingAsync(com.jme3.opencl.CommandQueue) } * so that OpenGL can use the image/texture/renderbuffer again. * * The generated event object is directly released. * This brings a performance improvement when the resource is e.g. directly * used by a kernel afterwards on the same queue (this implicitly waits for * this action). If you need the event, use * {@link #acquireImageForSharingAsync(com.jme3.opencl.CommandQueue) }. * * @param queue the command queue */ public void acquireImageForSharingNoEvent(CommandQueue queue) { //Default implementation, overwrite for performance acquireImageForSharingAsync(queue).release(); }
/** * Releases a shared image object. * Call this method after the image object was acquired by * {@link #acquireImageForSharingAsync(com.jme3.opencl.CommandQueue) } * to hand the control back to OpenGL. * The generated event object is directly released, resulting in * performance improvements. * @param queue the command queue */ public void releaseImageForSharingNoEvent(CommandQueue queue) { //default implementation, overwrite it for performance improvements releaseImageForSharingAsync(queue).release(); }
private void updateOpenCL(float tpf) { //aquire resource texCL.acquireImageForSharingNoEvent(clQueue); //no need to wait for the returned event, since the kernel implicitely waits for it (same command queue) //execute kernel Kernel.WorkSize ws = new Kernel.WorkSize(settings.getWidth(), settings.getHeight()); kernel.Run1NoEvent(clQueue, ws, texCL, C, 16); //release resource texCL.releaseImageForSharingNoEvent(clQueue); }
assertEquals(descr.type, image.getImageType(), "Wrong image type"); assertEquals(format, image.getImageFormat(), "Wrong image format"); assertEquals(descr.width, image.getWidth(), "Wrong width"); assertEquals(descr.height, image.getHeight(), "Wrong height"); Event e1 = image.fillAsync(clQueue, new long[]{0,0,0}, new long[]{descr.width/2, descr.height, 1}, color1); Event e2 = image.fillAsync(clQueue, new long[]{descr.width/2,0,0}, new long[]{descr.width/2, descr.height, 1}, color2); e1.waitForFinished(); e2.waitForFinished(); Event e3 = image.copyToBufferAsync(clQueue, buffer, new long[]{10,10,0}, new long[]{500,1024,1}, 0); e3.release(); Image image2 = clContext.createImage(MemoryAccess.READ_WRITE, format, descr); image.copyTo(clQueue, image2, new long[]{1000, 20,0}, new long[]{0,0,0}, new long[]{512, 512,1}); Image.ImageMapping map2 = image2.map(clQueue, new long[]{0,0,0}, new long[]{512,512,1}, MappingAccess.MAP_READ_WRITE); FloatBuffer map2F = map2.buffer.asFloatBuffer(); for (int y=0; y<512; ++y) { image2.unmap(clQueue, map2); image.release(); image2.release(); buffer.release();
@Override public String toString() { StringBuilder str = new StringBuilder(); str.append("Image ("); ImageType t = getImageType(); str.append(t); str.append(", w=").append(getWidth()); if (t == ImageType.IMAGE_2D || t == ImageType.IMAGE_3D) { str.append(", h=").append(getHeight()); } if (t == ImageType.IMAGE_3D) { str.append(", d=").append(getDepth()); } if (t == ImageType.IMAGE_1D_ARRAY || t == ImageType.IMAGE_2D_ARRAY) { str.append(", arrays=").append(getArraySize()); } str.append(", ").append(getImageFormat()); str.append(')'); return str.toString(); }
/** * Releases a shared image object. * Call this method after the image object was acquired by * {@link #acquireImageForSharingAsync(com.jme3.opencl.CommandQueue) } * to hand the control back to OpenGL. * The generated event object is directly released, resulting in * performance improvements. * @param queue the command queue */ public void releaseImageForSharingNoEvent(CommandQueue queue) { //default implementation, overwrite it for performance improvements releaseImageForSharingAsync(queue).release(); }
/** * Aquires this image object for using. Only call this method if this image * represents a shared object from OpenGL, created with e.g. * {@link Context#bindImage(com.jme3.texture.Image, com.jme3.texture.Texture.Type, int, com.jme3.opencl.MemoryAccess) } * or variations. * This method must be called before the image is used. After the work is * done, the image must be released by calling * {@link #releaseImageForSharingAsync(com.jme3.opencl.CommandQueue) } * so that OpenGL can use the image/texture/renderbuffer again. * * The generated event object is directly released. * This brings a performance improvement when the resource is e.g. directly * used by a kernel afterwards on the same queue (this implicitly waits for * this action). If you need the event, use * {@link #acquireImageForSharingAsync(com.jme3.opencl.CommandQueue) }. * * @param queue the command queue */ public void acquireImageForSharingNoEvent(CommandQueue queue) { //Default implementation, overwrite for performance acquireImageForSharingAsync(queue).release(); }