void WindowCaptureCallback::ContextData::readPixels() { unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); unsigned int nextPboIndex = _pboBuffer.empty() ? 0 : (_currentPboIndex+1)%_pboBuffer.size(); int width=0, height=0; getSize(_gc, width, height); if (width!=_width || _height!=height) { std::cout<<" Window resized "<<width<<", "<<height<<std::endl; _width = width; _height = height; } osg::Image* image = _imageBuffer[_currentImageIndex].get(); osg::Timer_t tick_start = osg::Timer::instance()->tick(); #if 1 image->readPixels(0,0,_width,_height,_pixelFormat,_type); #endif osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); updateTimings(tick_start, tick_afterReadPixels, tick_afterReadPixels, image->getTotalSizeInBytes()); _image_available = true; _currentImageToTransfer = reinterpret_cast<osg::Image*>( image->clone ( osg::CopyOp::DEEP_COPY_ALL ) ); _currentImageIndex = nextImageIndex; _currentPboIndex = nextPboIndex; }
void PPMOut::isr() { // set the compare register with the next value OCR1A += m_timings[m_timingPos]; // toggle pin, pins 9 and 10 will toggle themselves if (m_port != 0) { *m_port |= m_mask; } // update position ++m_timingPos; if (m_timingPos >= m_timingCount) { m_timingPos = 0; // we're at the end of frame here, so there's plenty of time to update updateTimings(); } }
void WindowCaptureCallback::ContextData::readPixels() { // std::cout<<"readPixels("<<_fileName<<" image "<<_currentImageIndex<<" "<<_currentPboIndex<<std::endl; unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); unsigned int nextPboIndex = _pboBuffer.empty() ? 0 : (_currentPboIndex+1)%_pboBuffer.size(); int width=0, height=0; getSize(_gc, width, height); if (width!=_width || _height!=height) { std::cout<<" Window resized "<<width<<", "<<height<<std::endl; _width = width; _height = height; } osg::Image* image = _imageBuffer[_currentImageIndex].get(); osg::Timer_t tick_start = osg::Timer::instance()->tick(); #if 1 image->readPixels(0,0,_width,_height, _pixelFormat,_type); #endif osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); updateTimings(tick_start, tick_afterReadPixels, tick_afterReadPixels, image->getTotalSizeInBytes()); if (!_fileName.empty()) { // osgDB::writeImageFile(*image, _fileName); } _currentImageIndex = nextImageIndex; _currentPboIndex = nextPboIndex; }
void WindowCaptureCallback::ContextData::readPixels() { unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); unsigned int nextPboIndex = _pboBuffer.empty() ? 0 : (_currentPboIndex+1)%_pboBuffer.size(); int width=0, height=0; getSize(_gc, width, height); if (width!=_width || _height!=height) { //OSG_NOTICE<<" Window resized "<<width<<", "<<height<<std::endl; _width = width; _height = height; } osg::Image* image = _imageBuffer[_currentImageIndex].get(); osg::Timer_t tick_start = osg::Timer::instance()->tick(); #if 1 image->readPixels(0,0,_width,_height, _pixelFormat,_type); #endif osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); if (_captureOperation.valid()) { (*_captureOperation)(*image, _index); } osg::Timer_t tick_afterCaptureOperation = osg::Timer::instance()->tick(); updateTimings(tick_start, tick_afterReadPixels, tick_afterReadPixels, tick_afterCaptureOperation, image->getTotalSizeInBytes()); _currentImageIndex = nextImageIndex; _currentPboIndex = nextPboIndex; }
void WindowCaptureCallback::ContextData::singlePBO(osg::GLExtensions* ext) { unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); int width=0, height=0; getSize(_gc, width, height); if (width!=_width || _height!=height) { #ifdef DEBUG osg::notify(osg::NOTICE)<<"Window resized "<<width<<", "<<height<<std::endl; #endif _width = width; _height = height; } GLuint& pbo = _pboBuffer[0]; osg::Image* image = _imageBuffer[_currentImageIndex].get(); if (image->s() != _width || image->t() != _height) { #ifdef DEBUG osg::notify(osg::NOTICE)<<"Allocating image "<<std::endl; #endif image->allocateImage(_width, _height, 1, _pixelFormat, _type); if (pbo!=0) { #ifdef DEBUG osg::notify(osg::NOTICE)<<"deleting pbo "<<pbo<<std::endl; #endif ext->glDeleteBuffers (1, &pbo); pbo = 0; } } if (pbo==0) { ext->glGenBuffers(1, &pbo); ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pbo); ext->glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); #ifdef DEBUG osg::notify(osg::NOTICE)<<"Generating pbo "<<pbo<<std::endl; #endif } else { ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pbo); } osg::Timer_t tick_start = osg::Timer::instance()->tick(); #if 1 glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); #endif osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); if(src) { memcpy(image->data(), src, image->getTotalSizeInBytes()); ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); } ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); osg::Timer_t tick_afterMemCpy = osg::Timer::instance()->tick(); updateTimings(tick_start, tick_afterReadPixels, tick_afterMemCpy, image->getTotalSizeInBytes()); _currentImageIndex = nextImageIndex; }
void WindowCaptureCallback::ContextData::multiPBO(osg::GLExtensions* ext) { unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); unsigned int nextPboIndex = (_currentPboIndex+1)%_pboBuffer.size(); int width=0, height=0; getSize(_gc, width, height); if (width!=_width || _height!=height) { _width = width; _height = height; } GLuint& copy_pbo = _pboBuffer[_currentPboIndex]; GLuint& read_pbo = _pboBuffer[nextPboIndex]; osg::Image* image = _imageBuffer[_currentImageIndex].get(); if (image->s() != _width || image->t() != _height) { #ifdef DEBUG osg::notify(osg::NOTICE)<<"Allocating image "<<std::endl; #endif image->allocateImage(_width, _height, 1, _pixelFormat, _type); if (read_pbo!=0) { #ifdef DEBUG osg::notify(osg::NOTICE)<<"deleting pbo "<<read_pbo<<std::endl; #endif ext->glDeleteBuffers (1, &read_pbo); read_pbo = 0; } if (copy_pbo!=0) { #ifdef DEBUG osg::notify(osg::NOTICE)<<"deleting pbo "<<copy_pbo<<std::endl; #endif ext->glDeleteBuffers (1, ©_pbo); copy_pbo = 0; } } bool doCopy = copy_pbo!=0; if (copy_pbo==0) { ext->glGenBuffers(1, ©_pbo); ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); ext->glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); #ifdef DEBUG osg::notify(osg::NOTICE)<<"Generating pbo "<<read_pbo<<std::endl; #endif } if (read_pbo==0) { ext->glGenBuffers(1, &read_pbo); ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); ext->glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); #ifdef DEBUG osg::notify(osg::NOTICE)<<"Generating pbo "<<read_pbo<<std::endl; #endif } else { ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); } osg::Timer_t tick_start = osg::Timer::instance()->tick(); #if 1 glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); #endif osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); if (doCopy) { ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); if(src) { memcpy(image->data(), src, image->getTotalSizeInBytes()); ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); } } ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); osg::Timer_t tick_afterMemCpy = osg::Timer::instance()->tick(); updateTimings(tick_start, tick_afterReadPixels, tick_afterMemCpy, image->getTotalSizeInBytes()); _image_available = true; _currentImageToTransfer = reinterpret_cast<osg::Image*>( image->clone ( osg::CopyOp::DEEP_COPY_ALL ) ); #ifdef DEBUG std::cout << "Rendered via multiple PBO's." << std::endl; #endif _currentImageIndex = nextImageIndex; _currentPboIndex = nextPboIndex; }
void WindowCaptureCallback::ContextData::multiPBO(osg::BufferObject::Extensions* ext) { // std::cout<<"multiPBO( "<<_fileName<<" image "<<_currentImageIndex<<" "<<_currentPboIndex<<std::endl; unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); unsigned int nextPboIndex = (_currentPboIndex+1)%_pboBuffer.size(); int width=0, height=0; getSize(_gc, width, height); if (width!=_width || _height!=height) { std::cout<<" Window resized "<<width<<", "<<height<<std::endl; _width = width; _height = height; } GLuint& copy_pbo = _pboBuffer[_currentPboIndex]; GLuint& read_pbo = _pboBuffer[nextPboIndex]; osg::Image* image = _imageBuffer[_currentImageIndex].get(); if (image->s() != _width || image->t() != _height) { osg::notify(osg::NOTICE)<<"Allocating image "<<std::endl; image->allocateImage(_width, _height, 1, _pixelFormat, _type); if (read_pbo!=0) { osg::notify(osg::NOTICE)<<"deleting pbo "<<read_pbo<<std::endl; ext->glDeleteBuffers (1, &read_pbo); read_pbo = 0; } if (copy_pbo!=0) { osg::notify(osg::NOTICE)<<"deleting pbo "<<copy_pbo<<std::endl; ext->glDeleteBuffers (1, ©_pbo); copy_pbo = 0; } } bool doCopy = copy_pbo!=0; if (copy_pbo==0) { ext->glGenBuffers(1, ©_pbo); ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); ext->glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); osg::notify(osg::NOTICE)<<"Generating pbo "<<read_pbo<<std::endl; } if (read_pbo==0) { ext->glGenBuffers(1, &read_pbo); ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); ext->glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); osg::notify(osg::NOTICE)<<"Generating pbo "<<read_pbo<<std::endl; } else { ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); } osg::Timer_t tick_start = osg::Timer::instance()->tick(); #if 1 glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); #endif osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); if (doCopy) { ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); if(src) { memcpy(image->data(), src, image->getTotalSizeInBytes()); ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); } if (!_fileName.empty()) { // osgDB::writeImageFile(*image, _fileName); } } ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); osg::Timer_t tick_afterMemCpy = osg::Timer::instance()->tick(); updateTimings(tick_start, tick_afterReadPixels, tick_afterMemCpy, image->getTotalSizeInBytes()); _currentImageIndex = nextImageIndex; _currentPboIndex = nextPboIndex; }
void WindowCaptureCallback::ContextData::multiPBO(osg::GLBufferObject::Extensions* ext) { unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); unsigned int nextPboIndex = (_currentPboIndex+1)%_pboBuffer.size(); int width=0, height=0; getSize(_gc, width, height); if (width!=_width || _height!=height) { //OSG_NOTICE<<" Window resized "<<width<<", "<<height<<std::endl; _width = width; _height = height; } GLuint& copy_pbo = _pboBuffer[_currentPboIndex]; GLuint& read_pbo = _pboBuffer[nextPboIndex]; osg::Image* image = _imageBuffer[_currentImageIndex].get(); if (image->s() != _width || image->t() != _height) { //OSG_NOTICE<<"ScreenCaptureHandler: Allocating image "<<std::endl; image->allocateImage(_width, _height, 1, _pixelFormat, _type); if (read_pbo!=0) { //OSG_NOTICE<<"ScreenCaptureHandler: deleting pbo "<<read_pbo<<std::endl; #ifndef EMSCRIPTEN ext->glDeleteBuffers (1, &read_pbo); #else ext->_glDeleteBuffers (1, &read_pbo); #endif read_pbo = 0; } if (copy_pbo!=0) { //OSG_NOTICE<<"ScreenCaptureHandler: deleting pbo "<<copy_pbo<<std::endl; #ifndef EMSCRIPTEN ext->glDeleteBuffers (1, ©_pbo); #else ext->_glDeleteBuffers (1, ©_pbo); #endif copy_pbo = 0; } } bool doCopy = copy_pbo!=0; if (copy_pbo==0) { #ifndef EMSCRIPTEN ext->glGenBuffers(1, ©_pbo); ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); ext->glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); #else ext->_glGenBuffers(1, ©_pbo); ext->_glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); ext->_glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); #endif //OSG_NOTICE<<"ScreenCaptureHandler: Generating pbo "<<read_pbo<<std::endl; } if (read_pbo==0) { #ifndef EMSCRIPTEN ext->glGenBuffers(1, &read_pbo); ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); ext->glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); #else ext->_glGenBuffers(1, &read_pbo); ext->_glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); ext->_glBufferData(GL_PIXEL_PACK_BUFFER_ARB, image->getTotalSizeInBytes(), 0, GL_STREAM_READ); #endif //OSG_NOTICE<<"ScreenCaptureHandler: Generating pbo "<<read_pbo<<std::endl; } else { #ifndef EMSCRIPTEN ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); #else ext->_glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo); #endif } osg::Timer_t tick_start = osg::Timer::instance()->tick(); #if 1 glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); #endif osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); if (doCopy) { #ifndef EMSCRIPTEN ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); #else ext->_glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo); GLubyte* src = (GLubyte*)ext->_glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); #endif if(src) { memcpy(image->data(), src, image->getTotalSizeInBytes()); #ifndef EMSCRIPTEN ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); #else ext->_glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); #endif } if (_captureOperation.valid()) { (*_captureOperation)(*image, _index); } } #ifndef EMSCRIPTEN ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); #else ext->_glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); #endif osg::Timer_t tick_afterMemCpy = osg::Timer::instance()->tick(); updateTimings(tick_start, tick_afterReadPixels, tick_afterMemCpy, tick_afterMemCpy, image->getTotalSizeInBytes()); _currentImageIndex = nextImageIndex; _currentPboIndex = nextPboIndex; }