/// grab a screenshot and save it
void screenshot(const char *filename_png) {
    image3f img = readpixels();
    imageio_write_png(filename_png, img, true);
}
Beispiel #2
0
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);
}