public void endTransfer() { pgl.deleteSync(fences[tail]); pgl.bindBuffer(PGL.PIXEL_PACK_BUFFER, pbos[tail]); ByteBuffer readBuffer = pgl.mapBuffer(PGL.PIXEL_PACK_BUFFER, PGL.READ_ONLY); if (readBuffer != null) { int format = primaryGraphics ? OPENGL_NATIVE_OPAQUE : OPENGL_NATIVE; PImage target = asyncImageSaver.getAvailableTarget(widths[tail], heights[tail], format); if (target == null) return; readBuffer.rewind(); readBuffer.asIntBuffer().get(target.pixels); pgl.unmapBuffer(PGL.PIXEL_PACK_BUFFER); asyncImageSaver.saveTargetAsync(PGraphicsOpenGL.this, target, filenames[tail]); } pgl.bindBuffer(PGL.PIXEL_PACK_BUFFER, 0); size--; tail = (tail + 1) % BUFFER_COUNT; }
lastTime = System.nanoTime(); awaitAsyncSaveCompletion(file);
asyncImageSaver = new AsyncImageSaver(); PImage target = asyncImageSaver.getAvailableTarget(pixelWidth, pixelHeight, format); if (target == null) return false; int count = PApplet.min(pixels.length, target.pixels.length); System.arraycopy(pixels, 0, target.pixels, 0, count); asyncImageSaver.saveTargetAsync(this, target, parent.sketchFile(filename));
public void endTransfer() { pgl.deleteSync(fences[tail]); pgl.bindBuffer(PGL.PIXEL_PACK_BUFFER, pbos[tail]); ByteBuffer readBuffer = pgl.mapBuffer(PGL.PIXEL_PACK_BUFFER, PGL.READ_ONLY); if (readBuffer != null) { int format = primaryGraphics ? OPENGL_NATIVE_OPAQUE : OPENGL_NATIVE; PImage target = asyncImageSaver.getAvailableTarget(widths[tail], heights[tail], format); if (target == null) return; readBuffer.rewind(); readBuffer.asIntBuffer().get(target.pixels); pgl.unmapBuffer(PGL.PIXEL_PACK_BUFFER); asyncImageSaver.saveTargetAsync(PGraphicsOpenGL.this, target, files[tail]); } pgl.bindBuffer(PGL.PIXEL_PACK_BUFFER, 0); size--; tail = (tail + 1) % BUFFER_COUNT; }
@Override public boolean save(String filename) { // ignore if (hints[DISABLE_ASYNC_SAVEFRAME]) { return super.save(filename); } if (asyncImageSaver == null) { asyncImageSaver = new AsyncImageSaver(); } if (!loaded) loadPixels(); PImage target = asyncImageSaver.getAvailableTarget(pixelWidth, pixelHeight, format); if (target == null) return false; int count = PApplet.min(pixels.length, target.pixels.length); System.arraycopy(pixels, 0, target.pixels, 0, count); asyncImageSaver.saveTargetAsync(this, target, filename); return true; }
public void completeFinishedTransfers() { if (size <= 0 || !asyncImageSaver.hasAvailableTarget()) return; boolean needEndDraw = false; if (!drawing) { beginDraw(); needEndDraw = true; } while (asyncImageSaver.hasAvailableTarget() && isLastTransferComplete()) { endTransfer(); } // make sure to always unregister if there are no ongoing transfers // so that PGraphics can be GC'd if needed if (size <= 0) ongoingPixelTransfers.remove(this); if (needEndDraw) endDraw(); }
public void completeFinishedTransfers() { if (size <= 0 || !asyncImageSaver.hasAvailableTarget()) return; boolean needEndDraw = false; if (!drawing) { beginDraw(); needEndDraw = true; } while (asyncImageSaver.hasAvailableTarget() && isLastTransferComplete()) { endTransfer(); } // make sure to always unregister if there are no ongoing transfers // so that PGraphics can be GC'd if needed if (size <= 0) ongoingPixelTransfers.remove(this); if (needEndDraw) endDraw(); }
@Override public boolean save(String filename) { // ignore if (hints[DISABLE_ASYNC_SAVEFRAME]) { return super.save(filename); } if (asyncImageSaver == null) { asyncImageSaver = new AsyncImageSaver(); } if (!loaded) loadPixels(); PImage target = asyncImageSaver.getAvailableTarget(pixelWidth, pixelHeight, format); if (target == null) return false; int count = PApplet.min(pixels.length, target.pixels.length); System.arraycopy(pixels, 0, target.pixels, 0, count); asyncImageSaver.saveTargetAsync(this, target, parent.sketchFile(filename)); return true; }
/** * Handle any takedown for this graphics context. * <p> * This is called when a sketch is shut down and this renderer was * specified using the size() command, or inside endRecord() and * endRaw(), in order to shut things off. */ public void dispose() { // ignore if (primaryGraphics && asyncImageSaver != null) { asyncImageSaver.dispose(); asyncImageSaver = null; } }
/** * If there is running async save task for this file, blocks until it completes. * Has to be called on main thread because OpenGL overrides this and calls GL. * @param filename */ protected void awaitAsyncSaveCompletion(String filename) { if (asyncImageSaver != null) { asyncImageSaver.awaitAsyncSaveCompletion(parent.sketchFile(filename)); } }