{ 300, 300, GL_TRUE }, /* Size */
GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH, /* DisplayMode */
GL_FALSE, /* Initialised */
- GL_FALSE, /* ForceDirectContext */
- GL_TRUE, /* TryDirectContext */
+ GLUT_TRY_DIRECT_CONTEXT, /* DirectContext */
GL_FALSE, /* ForceIconic */
GL_FALSE, /* UseCurrentContext */
GL_FALSE, /* GLDebugSwitch */
fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;
- fgState.ForceDirectContext = GL_FALSE;
- fgState.TryDirectContext = GL_TRUE;
+ fgState.DirectContext = GLUT_TRY_DIRECT_CONTEXT;
fgState.ForceIconic = GL_FALSE;
fgState.UseCurrentContext = GL_FALSE;
fgState.GLDebugSwitch = GL_FALSE;
}
else if( strcmp( argv[ i ], "-direct" ) == 0)
{
- if( ! fgState.TryDirectContext )
+ if( fgState.DirectContext == GLUT_FORCE_INDIRECT_CONTEXT )
fgError( "parameters ambiguity, -direct and -indirect "
"cannot be both specified" );
- fgState.ForceDirectContext = GL_TRUE;
+ fgState.DirectContext = GLUT_FORCE_DIRECT_CONTEXT;
argv[ i ] = NULL;
( *pargc )--;
}
else if( strcmp( argv[ i ], "-indirect" ) == 0 )
{
- if( fgState.ForceDirectContext )
+ if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT )
fgError( "parameters ambiguity, -direct and -indirect "
"cannot be both specified" );
- fgState.TryDirectContext = GL_FALSE;
+ fgState.DirectContext = GLUT_FORCE_INDIRECT_CONTEXT;
argv[ i ] = NULL;
(*pargc)--;
}
GLboolean Initialised; /* freeglut has been initialised */
- GLboolean ForceDirectContext; /* Force direct rendering? */
- GLboolean TryDirectContext; /* What about giving a try to? */
+ int DirectContext; /* Direct rendering state */
GLboolean ForceIconic; /* New top windows are iconified */
GLboolean UseCurrentContext; /* New windows share with current */
*/
void FGAPIENTRY glutSetOption( GLenum eWhat, int value )
{
- freeglut_assert_ready;
-
- /*
- * XXX In chronological code add order. (WHY in that order?)
- */
- switch( eWhat )
- {
- case GLUT_INIT_WINDOW_X:
- fgState.Position.X = (GLint)value;
- break;
-
- case GLUT_INIT_WINDOW_Y:
- fgState.Position.Y = (GLint)value;
- break;
-
- case GLUT_INIT_WINDOW_WIDTH:
- fgState.Size.X = (GLint)value;
- break;
-
- case GLUT_INIT_WINDOW_HEIGHT:
- fgState.Size.Y = (GLint)value;
- break;
-
- case GLUT_INIT_DISPLAY_MODE:
- fgState.DisplayMode = (unsigned int)value;
- break;
-
- case GLUT_ACTION_ON_WINDOW_CLOSE:
- fgState.ActionOnWindowClose = value;
- break;
-
- case GLUT_RENDERING_CONTEXT:
- fgState.UseCurrentContext =
- ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE;
- break;
-
- case GLUT_WINDOW_CURSOR:
- if( fgStructure.Window != NULL )
- fgStructure.Window->State.Cursor = value;
- break;
-
- default:
- fgWarning( "glutSetOption(): missing enum handle %i\n", eWhat );
- break;
- }
+ freeglut_assert_ready;
+
+ /*
+ * XXX In chronological code add order. (WHY in that order?)
+ */
+ switch( eWhat )
+ {
+ case GLUT_INIT_WINDOW_X:
+ fgState.Position.X = (GLint)value;
+ break;
+
+ case GLUT_INIT_WINDOW_Y:
+ fgState.Position.Y = (GLint)value;
+ break;
+
+ case GLUT_INIT_WINDOW_WIDTH:
+ fgState.Size.X = (GLint)value;
+ break;
+
+ case GLUT_INIT_WINDOW_HEIGHT:
+ fgState.Size.Y = (GLint)value;
+ break;
+
+ case GLUT_INIT_DISPLAY_MODE:
+ fgState.DisplayMode = (unsigned int)value;
+ break;
+
+ case GLUT_ACTION_ON_WINDOW_CLOSE:
+ fgState.ActionOnWindowClose = value;
+ break;
+
+ case GLUT_RENDERING_CONTEXT:
+ fgState.UseCurrentContext =
+ ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE;
+ break;
+
+ case GLUT_DIRECT_RENDERING:
+ fgState.DirectContext = value;
+ break;
+
+ case GLUT_WINDOW_CURSOR:
+ if( fgStructure.Window != NULL )
+ fgStructure.Window->State.Cursor = value;
+ break;
+
+ default:
+ fgWarning( "glutSetOption(): missing enum handle %i\n", eWhat );
+ break;
+ }
}
/*
return fgState.UseCurrentContext ? GLUT_USE_CURRENT_CONTEXT
: GLUT_CREATE_NEW_CONTEXT;
+ case GLUT_DIRECT_RENDERING:
+ return fgState.DirectContext;
+ break;
+
default:
fgWarning( "glutGet(): missing enum handle %i\n", eWhat );
break;
fgStructure.MenuContext->VisualInfo = window->Window.VisualInfo;
fgStructure.MenuContext->Context = glXCreateContext(
fgDisplay.Display, fgStructure.MenuContext->VisualInfo,
- NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ NULL, ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT )
);
}
/* window->Window.Context = fgStructure.MenuContext->Context; */
window->Window.Context = glXCreateContext(
fgDisplay.Display, window->Window.VisualInfo,
- NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ NULL, ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT )
);
}
else if( fgState.UseCurrentContext )
if( ! window->Window.Context )
window->Window.Context = glXCreateContext(
fgDisplay.Display, window->Window.VisualInfo,
- NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ NULL, ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT )
);
}
else
window->Window.Context = glXCreateContext(
fgDisplay.Display, window->Window.VisualInfo,
- NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ NULL, ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT )
);
- if( fgState.ForceDirectContext &&
- !glXIsDirect( fgDisplay.Display, window->Window.Context ) )
- fgError( "unable to force direct context rendering for window '%s'",
+ if( !glXIsDirect( fgDisplay.Display, window->Window.Context ) )
+ {
+ if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT )
+ fgError( "Unable to force direct context rendering for window '%s'",
+ title );
+ else if( fgState.DirectContext == GLUT_TRY_DIRECT_CONTEXT )
+ fgWarning( "Unable to create direct context rendering for window '%s'\nThis may hurt performance.",
title );
+ }
glXMakeCurrent(
fgDisplay.Display,