/// grab a screenshot and save it void screenshot(const char *filename_png) { image3f img = readpixels(); imageio_write_png(filename_png, img, true); }
void RRPlugin::sendvgl(rrdisplayclient *rrdpy, GLint drawbuf, bool spoillast, int compress, int qual, int subsamp, bool block) { #if 0 while(block && !rrdpy->frameready()) { fprintf(stderr, "pause "); fflush(stderr); usleep(100000); } #else (void)block; #endif osgViewer::GraphicsWindow *win = coVRConfig::instance()->windows[0].window; int x, y, w, h; win->getWindowRectangle(x, y, w, h); if (spoillast && fconfig.spoil && !rrdpy->frameready()) return; rrframe *b; int flags = RRBMP_BOTTOMUP, format = GL_RGB; #ifdef GL_BGR_EXT if (littleendian() && compress != RRCOMP_RGB) { format = GL_BGR_EXT; flags |= RRBMP_BGR; } #endif if (m_cudaReadBack && m_cudapinnedmemory) flags |= RRBMP_CUDAALLOC; errifnot(b = rrdpy->getbitmap(w, h, 3, flags, false /*stereo*/, fconfig.spoil)); GLint buf = drawbuf; //b->_h.winid=_win; b->_h.dpynum = 0; b->_h.winid = 0; b->_h.framew = b->_h.width; b->_h.frameh = b->_h.height; b->_h.x = 0; b->_h.y = 0; b->_h.qual = qual; b->_h.subsamp = subsamp; b->_h.compress = (unsigned char)compress; double start = 0.; if (benchmark) start = cover->currentTime(); double bpp = 4.; #ifdef HAVE_CUDA if (m_cudaReadBack) { int hs = tjMCUWidth[jpegsub(subsamp)] / 8; int vs = tjMCUHeight[jpegsub(subsamp)] / 8; if (fconfig.compress == RRCOMP_YUV2JPEG) { m_cudaReadBack->readpixelsyuv(0, 0, b->_h.framew, b->_pitch, b->_h.frameh, format, b->_pixelsize, b->_bits, buf, hs, vs); bpp = 1. + 2. / hs / vs; } else m_cudaReadBack->readpixels(0, 0, b->_h.framew, b->_pitch, b->_h.frameh, format, b->_pixelsize, b->_bits, buf); } else #endif readpixels(0, 0, b->_h.framew, b->_pitch, b->_h.frameh, format, b->_pixelsize, b->_bits, buf); double dur = 0.; if (benchmark) dur = cover->currentTime() - start; double pix = b->_h.framew * b->_h.frameh; double bytes = pix * bpp; if (benchmark) fprintf(stderr, "%fs: %f mpix/s, %f gb/s (cuda=%d, yuv=%d)\n", dur, pix / dur / 1e6, bytes / dur / (1024 * 1024 * 1024), m_cudaReadBack != NULL, fconfig.compress == RRCOMP_YUV2JPEG); //b->_h.winid=_win; b->_h.dpynum = 0; b->_h.winid = 0; b->_h.framew = b->_h.width; b->_h.frameh = b->_h.height; b->_h.x = 0; b->_h.y = 0; b->_h.qual = qual; b->_h.subsamp = subsamp; b->_h.compress = (unsigned char)compress; if (m_sendThread) { m_sendThread->send(rrdpy, b); } else rrdpy->sendframe(b); }