Added osg::SyncSwapBuffersCallback to include/osg/GraphicsContext and support for enabling it to include/osg/DisplaySettings, and to the Viewer/CompositeViewer::realize() methods.
To enable the sync of swap buffers set the env var OSG_SYNC_SWAP_BUFFERS to ON or 1, to switch off set to OFF or 0. One can also use the --sync command line option for application that pass on command line options to the osg::DisplaySettings::instance(). git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14456 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
parent
fec06828cf
commit
4c1fd06252
@ -266,6 +266,15 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced
|
|||||||
/** Get preferred swap method */
|
/** Get preferred swap method */
|
||||||
SwapMethod getSwapMethod( void ) { return _swapMethod; }
|
SwapMethod getSwapMethod( void ) { return _swapMethod; }
|
||||||
|
|
||||||
|
|
||||||
|
/** Set whether Arb Sync should be used to manage the swaps buffers, 0 disables the use of the sync, greater than zero enables sync based on number of frames specified.*/
|
||||||
|
void setSyncSwapBuffers(unsigned int numFrames=0) { _syncSwapBuffers = numFrames; }
|
||||||
|
|
||||||
|
/** Set whether Arb Sync should be used to manage the swaps buffers.*/
|
||||||
|
unsigned int getSyncSwapBuffers() const { return _syncSwapBuffers; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Set the hint of which OpenGL version to attempt to create a graphics context for.*/
|
/** Set the hint of which OpenGL version to attempt to create a graphics context for.*/
|
||||||
void setGLContextVersion(const std::string& version) { _glContextVersion = version; }
|
void setGLContextVersion(const std::string& version) { _glContextVersion = version; }
|
||||||
|
|
||||||
@ -372,7 +381,7 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced
|
|||||||
unsigned int _glContextProfileMask;
|
unsigned int _glContextProfileMask;
|
||||||
|
|
||||||
SwapMethod _swapMethod;
|
SwapMethod _swapMethod;
|
||||||
|
unsigned int _syncSwapBuffers;
|
||||||
|
|
||||||
bool _keystoneHint;
|
bool _keystoneHint;
|
||||||
FileNames _keystoneFileNames;
|
FileNames _keystoneFileNames;
|
||||||
|
@ -531,6 +531,57 @@ class OSG_EXPORT GraphicsContext : public Object
|
|||||||
GLuint _defaultFboId;
|
GLuint _defaultFboId;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//#include <osg/GLExtensions>
|
||||||
|
|
||||||
|
#ifndef GL_ARB_sync
|
||||||
|
#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
|
||||||
|
#define GL_OBJECT_TYPE 0x9112
|
||||||
|
#define GL_SYNC_CONDITION 0x9113
|
||||||
|
#define GL_SYNC_STATUS 0x9114
|
||||||
|
#define GL_SYNC_FLAGS 0x9115
|
||||||
|
#define GL_SYNC_FENCE 0x9116
|
||||||
|
#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
|
||||||
|
#define GL_UNSIGNALED 0x9118
|
||||||
|
#define GL_SIGNALED 0x9119
|
||||||
|
#define GL_ALREADY_SIGNALED 0x911A
|
||||||
|
#define GL_TIMEOUT_EXPIRED 0x911B
|
||||||
|
#define GL_CONDITION_SATISFIED 0x911C
|
||||||
|
#define GL_WAIT_FAILED 0x911D
|
||||||
|
#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
|
||||||
|
#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class OSG_EXPORT SyncSwapBuffersCallback : public GraphicsContext::SwapCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SyncSwapBuffersCallback();
|
||||||
|
|
||||||
|
void setUpExtensions();
|
||||||
|
|
||||||
|
virtual void swapBuffersImplementation(GraphicsContext* gc);
|
||||||
|
|
||||||
|
typedef struct __GLsync *GLsync;
|
||||||
|
|
||||||
|
typedef GLsync (GL_APIENTRY * PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
|
||||||
|
typedef GLboolean (GL_APIENTRY * PFNGLISSYNCPROC) (GLsync sync);
|
||||||
|
typedef void (GL_APIENTRY * PFNGLDELETESYNCPROC) (GLsync sync);
|
||||||
|
typedef GLenum (GL_APIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
|
||||||
|
typedef void (GL_APIENTRY * PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
|
||||||
|
typedef void (GL_APIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params);
|
||||||
|
typedef void (GL_APIENTRY * PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
|
||||||
|
|
||||||
|
bool _extensionInitialized;
|
||||||
|
|
||||||
|
PFNGLFENCESYNCPROC _glFenceSync;
|
||||||
|
PFNGLISSYNCPROC _glIsSync;
|
||||||
|
PFNGLDELETESYNCPROC _glDeleteSync;
|
||||||
|
PFNGLCLIENTWAITSYNCPROC _glClientWaitSync;
|
||||||
|
PFNGLWAITSYNCPROC _glWaitSync;
|
||||||
|
PFNGLGETINTEGER64VPROC _glGetInteger64v;
|
||||||
|
PFNGLGETSYNCIVPROC _glGetSynciv;
|
||||||
|
|
||||||
|
GLsync _previousSync;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,6 +218,7 @@ void DisplaySettings::setDefaults()
|
|||||||
_glContextProfileMask = 0;
|
_glContextProfileMask = 0;
|
||||||
|
|
||||||
_swapMethod = SWAP_DEFAULT;
|
_swapMethod = SWAP_DEFAULT;
|
||||||
|
_syncSwapBuffers = 0;
|
||||||
|
|
||||||
_keystoneHint = false;
|
_keystoneHint = false;
|
||||||
|
|
||||||
@ -630,6 +631,23 @@ void DisplaySettings::readEnvironmentalVariables()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ptr = getenv("OSG_SYNC_SWAP_BUFFERS")) != 0)
|
||||||
|
{
|
||||||
|
if (strcmp(ptr,"OFF")==0)
|
||||||
|
{
|
||||||
|
_syncSwapBuffers = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (strcmp(ptr,"ON")==0)
|
||||||
|
{
|
||||||
|
_syncSwapBuffers = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_syncSwapBuffers = atoi(ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( (ptr = getenv("OSG_KEYSTONE")) != 0)
|
if( (ptr = getenv("OSG_KEYSTONE")) != 0)
|
||||||
{
|
{
|
||||||
if (strcmp(ptr,"OFF")==0)
|
if (strcmp(ptr,"OFF")==0)
|
||||||
@ -715,6 +733,7 @@ void DisplaySettings::readCommandLine(ArgumentParser& arguments)
|
|||||||
arguments.getApplicationUsage()->addCommandLineOption("--keystone-on","Set the keystone hint to true to tell the viewer to do keystone correction.");
|
arguments.getApplicationUsage()->addCommandLineOption("--keystone-on","Set the keystone hint to true to tell the viewer to do keystone correction.");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("--keystone-off","Set the keystone hint to false.");
|
arguments.getApplicationUsage()->addCommandLineOption("--keystone-off","Set the keystone hint to false.");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("--menubar-behavior <behavior>","Set the menubar behavior (AUTO_HIDE | FORCE_HIDE | FORCE_SHOW)");
|
arguments.getApplicationUsage()->addCommandLineOption("--menubar-behavior <behavior>","Set the menubar behavior (AUTO_HIDE | FORCE_HIDE | FORCE_SHOW)");
|
||||||
|
arguments.getApplicationUsage()->addCommandLineOption("--sync","Enable sync of swap buffers");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string str;
|
std::string str;
|
||||||
@ -769,6 +788,11 @@ void DisplaySettings::readCommandLine(ArgumentParser& arguments)
|
|||||||
_numMultiSamples = atoi(str.c_str());
|
_numMultiSamples = atoi(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while(arguments.read("--sync"))
|
||||||
|
{
|
||||||
|
_syncSwapBuffers = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (arguments.read("--keystone",str))
|
if (arguments.read("--keystone",str))
|
||||||
{
|
{
|
||||||
_keystoneHint = true;
|
_keystoneHint = true;
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <osg/Drawable>
|
#include <osg/Drawable>
|
||||||
#include <osg/FragmentProgram>
|
#include <osg/FragmentProgram>
|
||||||
#include <osg/VertexProgram>
|
#include <osg/VertexProgram>
|
||||||
|
#include <osg/GLExtensions>
|
||||||
|
|
||||||
#include <OpenThreads/ReentrantMutex>
|
#include <OpenThreads/ReentrantMutex>
|
||||||
|
|
||||||
@ -975,3 +976,60 @@ void GraphicsContext::resizedImplementation(int x, int y, int width, int height)
|
|||||||
_traits->width = width;
|
_traits->width = width;
|
||||||
_traits->height = height;
|
_traits->height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SyncSwapBuffersCallback
|
||||||
|
//
|
||||||
|
SyncSwapBuffersCallback::SyncSwapBuffersCallback():
|
||||||
|
_extensionInitialized(false),
|
||||||
|
_glFenceSync(0),
|
||||||
|
_glIsSync(0),
|
||||||
|
_glDeleteSync(0),
|
||||||
|
_glClientWaitSync(0),
|
||||||
|
_glWaitSync(0),
|
||||||
|
_glGetInteger64v(0),
|
||||||
|
_glGetSynciv(0),
|
||||||
|
_previousSync(0)
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"Created Swap callback."<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SyncSwapBuffersCallback::setUpExtensions()
|
||||||
|
{
|
||||||
|
_extensionInitialized = true;
|
||||||
|
osg::setGLExtensionFuncPtr(_glFenceSync, "glFenceSync");
|
||||||
|
osg::setGLExtensionFuncPtr(_glIsSync, "glIsSync");
|
||||||
|
osg::setGLExtensionFuncPtr(_glDeleteSync, "glDeleteSync");
|
||||||
|
osg::setGLExtensionFuncPtr(_glClientWaitSync, "glClientWaitSync");
|
||||||
|
osg::setGLExtensionFuncPtr(_glWaitSync, "glWaitSync");
|
||||||
|
osg::setGLExtensionFuncPtr(_glGetInteger64v, "glGetInteger64v");
|
||||||
|
osg::setGLExtensionFuncPtr(_glGetSynciv, "glGetSynciv");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SyncSwapBuffersCallback::swapBuffersImplementation(osg::GraphicsContext* gc)
|
||||||
|
{
|
||||||
|
// OSG_NOTICE<<"Before swap - place to do swap ready sync"<<std::endl;
|
||||||
|
gc->swapBuffersImplementation();
|
||||||
|
//glFinish();
|
||||||
|
|
||||||
|
if (!_extensionInitialized) setUpExtensions();
|
||||||
|
|
||||||
|
if (_glClientWaitSync)
|
||||||
|
{
|
||||||
|
if (_previousSync)
|
||||||
|
{
|
||||||
|
unsigned int num_seconds = 1;
|
||||||
|
GLuint64 timeout = num_seconds * ((GLuint64)1000 * 1000 * 1000);
|
||||||
|
_glClientWaitSync(_previousSync, 0, timeout);
|
||||||
|
|
||||||
|
_glDeleteSync(_previousSync);
|
||||||
|
}
|
||||||
|
|
||||||
|
_previousSync = _glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||||
|
}
|
||||||
|
//gc->getState()->checkGLErrors("after glWaitSync");
|
||||||
|
|
||||||
|
//OSG_NOTICE<<"After swap"<<std::endl;
|
||||||
|
}
|
||||||
|
@ -601,6 +601,8 @@ void CompositeViewer::realize()
|
|||||||
{
|
{
|
||||||
osg::GraphicsContext* gc = *citr;
|
osg::GraphicsContext* gc = *citr;
|
||||||
|
|
||||||
|
if (ds->getSyncSwapBuffers()) gc->setSwapCallback(new osg::SyncSwapBuffersCallback);
|
||||||
|
|
||||||
// set the pool sizes, 0 the default will result in no GL object pools.
|
// set the pool sizes, 0 the default will result in no GL object pools.
|
||||||
gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize);
|
gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize);
|
||||||
gc->getState()->setMaxBufferObjectPoolSize(maxBufferObjectPoolSize);
|
gc->getState()->setMaxBufferObjectPoolSize(maxBufferObjectPoolSize);
|
||||||
|
@ -544,6 +544,8 @@ void Viewer::realize()
|
|||||||
{
|
{
|
||||||
osg::GraphicsContext* gc = *citr;
|
osg::GraphicsContext* gc = *citr;
|
||||||
|
|
||||||
|
if (ds->getSyncSwapBuffers()) gc->setSwapCallback(new osg::SyncSwapBuffersCallback);
|
||||||
|
|
||||||
// set the pool sizes, 0 the default will result in no GL object pools.
|
// set the pool sizes, 0 the default will result in no GL object pools.
|
||||||
gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize);
|
gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize);
|
||||||
gc->getState()->setMaxBufferObjectPoolSize(maxBufferObjectPoolSize);
|
gc->getState()->setMaxBufferObjectPoolSize(maxBufferObjectPoolSize);
|
||||||
|
Loading…
Reference in New Issue
Block a user