[osg-users] How change the vertical sync?
Oh there is one more thing you need to first, you need create a new context so that you can realize it, otherwise the function make current do not take place here is the final code viewer.setUpViewInWindow(x, y, width, height); //Get the traits of the current window osg::ref_ptr< osg::GraphicsContext::Traits > traits = new osg::GraphicsContext::Traits( *viewer.getCamera()->getGraphicsContext()->getTraits()); // disable vertical sync traits->vsync = false; //Create a new graphics context with the modified traits osg::ref_ptr< osg::GraphicsContext > gc = osg::GraphicsContext::createGraphicsContext( traits.get() ); gc->realize(); gc->makeCurrent(); // set the vertical black off by default osgViewer::Viewer::Windows windows; viewer.getWindows(windows); for(osgViewer::Viewer::Windows::iterator itr = windows.begin(); itr != windows.end(); ++itr) { //(*itr)->setSyncToVBlank( !(*itr)->getSyncToVBlank() ); (*itr)->setSyncToVBlank (false); } you would think that a simple function on the viewer would do that kind of thing without this kind of contorted code. Julio ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
[osg-users] How change the vertical sync?
No, I do not think that controlling this at the driver level is the right way to do that. I digged a litle and I think I found a better way, in case any anyone wants to know, here is how it can be done on initilaization //Get the traits of the current window osg::ref_ptr< osg::GraphicsContext::Traits > traits = new osg::GraphicsContext::Traits( *viewer.getCamera()->getGraphicsContext()->getTraits()); // disable vertical sync traits->vsync = false; //Create a new graphics context with the modified traits osg::ref_ptr< osg::GraphicsContext > gc = osg::GraphicsContext::createGraphicsContext( traits.get() ); // set vertical blank off by default osgViewer::Viewer::Windows windows; gc->makeCurrent(); viewer.getWindows(windows); for(osgViewer::Viewer::Windows::iterator itr = windows.begin(); itr != windows.end(); ++itr) { //(*itr)->setSyncToVBlank( !(*itr)->getSyncToVBlank() ); (*itr)->setSyncToVBlank( traits->vsync ); } ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] How change the vertical sync?
Hi Julio, this is the code I am using (you may need to reformat it, because email splits many lines into two). Call it once you have active context. You may still need some includes like #include #if defined(__WIN32__) || defined(_WIN32) # [...] #else # include #endif and so on. John // // vsync could be controlled by following OpenGL extensions: // // Swap control approaches: // GLX_SGI_swap_control (1995) / WGL_EXT_swap_control (1999) / GLX_EXT_swap_control (2009) // GLX_EXT_swap_control_tear (2011) / WGL_EXT_swap_control_tear (2011) // // Synchronization approaches: // GLX_SGI_video_sync (1995) / GLX_OML_sync_control (2001) / WGL_OML_sync_control (2001) // // Swapping a group of drawables and windows: // GLX_SGIX_swap_group (1996) / GLX_SGIX_swap_barrier (1996) / GLX_NV_swap_group (2003) / WGL_NV_swap_group (2003) // const char* extensions = NULL; #if defined(__WIN32__) || defined(_WIN32) typedef const char* WINAPI WGLGETEXTENSIONSSTRINGARB( HDC ); WGLGETEXTENSIONSSTRINGARB* wglGetExtensionsStringARB; osg::setGLExtensionFuncPtr( wglGetExtensionsStringARB, "wglGetExtensionsStringARB" ); typedef const char* WINAPI WGLGETEXTENSIONSSTRINGEXT(); WGLGETEXTENSIONSSTRINGEXT* wglGetExtensionsStringEXT; osg::setGLExtensionFuncPtr( wglGetExtensionsStringEXT, "wglGetExtensionsStringEXT" ); if( wglGetExtensionsStringARB ) { HDC dc = wglGetCurrentDC(); extensions = wglGetExtensionsStringARB( dc ); } else if( wglGetExtensionsStringEXT ) { extensions = wglGetExtensionsStringEXT(); } #else // get current display // (glXGetCurrentDisplay() is supported since GLX 1.2) Display *d = glXGetCurrentDisplay(); // (glXGetCurrentContext() is supported maybe since beginning? (1.0?), // at least it is supported in GLX 1.2) GLXContext c = glXGetCurrentContext(); // get current screen // (glXQueryContext() is available since GLX 1.3) int screen; if( c == NULL || glXQueryContext( d, c, GLX_SCREEN, &screen ) != Success ) { OSG_WARN << "GLX: failed to get screen number." << endl; screen = DefaultScreen( d ); } // get glx extension string // (glXQueryExtensionsString is available since GLX 1.1) extensions = glXQueryExtensionsString( d, screen ); #endif if( extensions ) { #if defined(__WIN32__) || defined(_WIN32) if( osg::isExtensionInExtensionString( "WGL_EXT_swap_control", extensions ) ) { typedef BOOL WINAPI WGLSWAPINTERVALEXTPROC(int interval); WGLSWAPINTERVALEXTPROC* wglSwapIntervalEXT = (WGLSWAPINTERVALEXTPROC*)osg::getGLExtensionFuncPtr( "wglSwapIntervalEXT", extensions ); bool adaptiveSwapSupported = osg::isExtensionInExtensionString( "WGL_EXT_swap_control_tear", extensions ); #else bool sgiSwapControl = osg::isExtensionInExtensionString( "GLX_SGI_swap_control", extensions ); bool extSwapControl = osg::isExtensionInExtensionString( "GLX_EXT_swap_control", extensions ); if( sgiSwapControl || extSwapControl ) { typedef int (*PFNGLXSWAPINTERVALSGIPROC) (int interval); typedef void (*PFNGLXSWAPINTERVALEXTPROC) (Display *dpy, GLXDrawable drawable, int interval); PFNGLXSWAPINTERVALSGIPROC glXSwapIntervalSGI = sgiSwapControl ? (PFNGLXSWAPINTERVALSGIPROC)osg::getGLExtensionFuncPtr( "glXSwapIntervalSGI", extensions ) : NULL; PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT = extSwapControl ? (PFNGLXSWAPINTERVALEXTPROC)osg::getGLExtensionFuncPtr( "glXSwapIntervalEXT", extensions ) : NULL; bool adaptiveSwapSupported = osg::isExtensionInExtensionString( "GLX_EXT_swap_control_tear", extensions ); #endif int value = _vsync ? ( adaptiveSwapSupported ? -1 : 1 ) : 0; OSG_NOTICE << "OSGWiget: Setting vertical synchronization " << ( value != 0 ? "ON" : "OFF" ) << " (swap interval set to " << value << ")." << endl; #if defined(__WIN32__) || defined(_WIN32) if( wglSwapIntervalEXT ) wglSwapIntervalEXT( value ); #else // try glXSwapIntervalEXT in the first place as it supports // adaptive swap ([WGL|GLX]_EXT_swap_control_tear) and zero value for disabling v-sync if( glXSwapIntervalEXT ) glXSwapIntervalEXT( d, glXGetCurrentDrawable(), value ); else if( glXSwapIntervalSGI ) { // glXSwapIntervalSGI does not support value 0 according to documentation, // only values >=1, but it seems to work for disabling v-sync anyway if( glXSwapIntervalSGI( value ) ) OSG_WARN << "glXSwapIntervalSGI() failed." << endl; } #endif } } On Tuesday 15 of October 2013 20:55:03 Eric Sokolowsky wrote: > If you have an Nvidia card, you can set the environment variable > __GL_SYNC_TO_VBLANK=1 or =0 to enable or disable vertical syncing, but this > must be done b
Re: [osg-users] How change the vertical sync?
If you have an Nvidia card, you can set the environment variable __GL_SYNC_TO_VBLANK=1 or =0 to enable or disable vertical syncing, but this must be done before the graphics context is initialized. I'm not sure how to do it for ATI or Intel chips. A google search turned up this tip for ATI cards: http://www.stolk.org/debian/vblank-fglrx.html (I haven't tried it though). On Tue, Oct 15, 2013 at 11:08 AM, Julio Jerez wrote: > In my app I wrote this class function > > ** ** > > void InitWindowsSystem (osgViewer::Viewer& viewer, const char* const title, > int x, int y, int width, int height) > > { > > viewer.setUpViewInWindow(x, y, width, height); > > ** ** > > //Get the traits of the current window > > osg::ref_ptr< osg::GraphicsContext::Traits > traits = new osg:: > GraphicsContext::Traits( *viewer.getCamera()->getGraphicsContext()-> > getTraits()); > > ** ** > > //Set the title > > traits->windowName = title; > > ** ** > > // disable vertical sync > > traits->vsync = false; > > ** ** > > //Create a new graphics context with the modified traits > > osg::ref_ptr< osg::GraphicsContext > gc = osg::GraphicsContext:: > createGraphicsContext( traits.get() ); > > ** ** > > //test to see if vsync has changed, but vsyn is alway true > > osg::ref_ptr< osg::GraphicsContext::Traits > traits1 = new osg:: > GraphicsContext::Traits( *viewer.getCamera()->getGraphicsContext()-> > getTraits()); > > ** ** > > ** ** > > I have searched on forum for a way to do this but no one seem to have a > clear way. > > can someone tell me how to do this, pleases? > > ** ** > > Julio > > ** ** > > ** ** > > ** ** > > ___ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
[osg-users] How change the vertical sync?
In my app I wrote this class function void InitWindowsSystem (osgViewer::Viewer& viewer, const char* const title, int x, int y, int width, int height) { viewer.setUpViewInWindow(x, y, width, height); //Get the traits of the current window osg::ref_ptr< osg::GraphicsContext::Traits > traits = new osg::GraphicsContext::Traits( *viewer.getCamera()->getGraphicsContext()->getTraits()); //Set the title traits->windowName = title; // disable vertical sync traits->vsync = false; //Create a new graphics context with the modified traits osg::ref_ptr< osg::GraphicsContext > gc = osg::GraphicsContext::createGraphicsContext( traits.get() ); //test to see if vsync has changed, but vsyn is alway true osg::ref_ptr< osg::GraphicsContext::Traits > traits1 = new osg::GraphicsContext::Traits( *viewer.getCamera()->getGraphicsContext()->getTraits()); I have searched on forum for a way to do this but no one seem to have a clear way. can someone tell me how to do this, pleases? Julio ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org