Added initial ARB_robustness support.

This commit is contained in:
Camilla Berglund 2011-03-07 20:51:34 +01:00
parent fe1db15d31
commit d43e0b50d0
11 changed files with 113 additions and 6 deletions

View File

@ -412,6 +412,12 @@ extern "C" {
#define GLFW_OPENGL_FORWARD_COMPAT 0x00020015 #define GLFW_OPENGL_FORWARD_COMPAT 0x00020015
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00020016 #define GLFW_OPENGL_DEBUG_CONTEXT 0x00020016
#define GLFW_OPENGL_PROFILE 0x00020017 #define GLFW_OPENGL_PROFILE 0x00020017
#define GLFW_OPENGL_ROBUSTNESS 0x00020018
/* GLFW_OPENGL_ROBUSTNESS mode tokens */
#define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000
#define GLFW_OPENGL_NO_RESET_NOTIFICATION 0x00000001
#define GLFW_OPENGL_LOSE_CONTEXT_ON_RESET 0x00000002
/* GLFW_OPENGL_PROFILE bit tokens */ /* GLFW_OPENGL_PROFILE bit tokens */
#define GLFW_OPENGL_CORE_PROFILE 0x00000001 #define GLFW_OPENGL_CORE_PROFILE 0x00000001

View File

@ -274,6 +274,7 @@ version of GLFW.</p>
<li>Added <code>glfwGetCurrentWindow</code> function for retrieving the window whose OpenGL context is current</li> <li>Added <code>glfwGetCurrentWindow</code> function for retrieving the window whose OpenGL context is current</li>
<li>Added <code>glfwInitWithModels</code> function and <code>GLFWallocator</code> and <code>GLFWthreadmodel</code> types for pluggable memory allocation and threading models</li> <li>Added <code>glfwInitWithModels</code> function and <code>GLFWallocator</code> and <code>GLFWthreadmodel</code> types for pluggable memory allocation and threading models</li>
<li>Added <code>GLFW_OPENGL_ES2_PROFILE</code> profile for creating OpenGL ES 2.0 contexts using the <code>GLX_EXT_create_context_es2_profile</code> and <code>WGL_EXT_create_context_es2_profile</code> extensions</li> <li>Added <code>GLFW_OPENGL_ES2_PROFILE</code> profile for creating OpenGL ES 2.0 contexts using the <code>GLX_EXT_create_context_es2_profile</code> and <code>WGL_EXT_create_context_es2_profile</code> extensions</li>
<li>Added <code>GLFW_OPENGL_ROBUSTNESS</code> window hint and associated strategy tokens for <code>GL_ARB_robustness</code> support</li>
<li>Added <code>windows</code> simple multi-window test program</li> <li>Added <code>windows</code> simple multi-window test program</li>
<li>Added <code>sharing</code> simple OpenGL object sharing test program</li> <li>Added <code>sharing</code> simple OpenGL object sharing test program</li>
<li>Added a parameter to <code>glfwOpenWindow</code> for specifying a context the new window's context will share objects with</li> <li>Added a parameter to <code>glfwOpenWindow</code> for specifying a context the new window's context will share objects with</li>

View File

@ -479,6 +479,13 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window,
return GL_FALSE; return GL_FALSE;
} }
// Fail if a robustness strategy was requested
if (wndconfig->glRobustness)
{
_glfwSetError(GLFW_VERSION_UNAVAILABLE, "Cocoa/NSOpenGL: Mac OS X does not support OpenGL robustness strategies");
return GL_FALSE;
}
// We can only have one application delegate, but we only allocate it the // We can only have one application delegate, but we only allocate it the
// first time we create a window to keep all window code in this file // first time we create a window to keep all window code in this file
if (_glfwLibrary.NS.delegate == nil) if (_glfwLibrary.NS.delegate == nil)

View File

@ -99,6 +99,7 @@ struct _GLFWhints
GLboolean glForward; GLboolean glForward;
GLboolean glDebug; GLboolean glDebug;
int glProfile; int glProfile;
int glRobustness;
}; };
@ -119,6 +120,7 @@ struct _GLFWwndconfig
GLboolean glForward; GLboolean glForward;
GLboolean glDebug; GLboolean glDebug;
int glProfile; int glProfile;
int glRobustness;
_GLFWwindow* share; _GLFWwindow* share;
}; };
@ -196,6 +198,7 @@ struct _GLFWwindow
int glMajor, glMinor, glRevision; int glMajor, glMinor, glRevision;
GLboolean glForward, glDebug; GLboolean glForward, glDebug;
int glProfile; int glProfile;
int glRobustness;
PFNGLGETSTRINGIPROC GetStringi; PFNGLGETSTRINGIPROC GetStringi;
// These are defined in the current port's platform.h // These are defined in the current port's platform.h

View File

@ -320,6 +320,16 @@ GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig)
return GL_FALSE; return GL_FALSE;
} }
if (wndconfig->glRobustness)
{
if (wndconfig->glRobustness != GLFW_OPENGL_NO_RESET_NOTIFICATION &&
wndconfig->glRobustness != GLFW_OPENGL_LOSE_CONTEXT_ON_RESET)
{
_glfwSetError(GLFW_INVALID_VALUE, "glfwOpenWindow: Invalid OpenGL robustness mode requested");
return GL_FALSE;
}
}
return GL_TRUE; return GL_TRUE;
} }
@ -335,6 +345,7 @@ GLboolean _glfwIsValidContext(_GLFWwindow* window, _GLFWwndconfig* wndconfig)
// As these are hard constraints when non-zero, we can simply copy them // As these are hard constraints when non-zero, we can simply copy them
window->glProfile = wndconfig->glProfile; window->glProfile = wndconfig->glProfile;
window->glForward = wndconfig->glForward; window->glForward = wndconfig->glForward;
window->glRobustness = wndconfig->glRobustness;
if (window->glMajor < wndconfig->glMajor || if (window->glMajor < wndconfig->glMajor ||
(window->glMajor == wndconfig->glMajor && (window->glMajor == wndconfig->glMajor &&

View File

@ -232,6 +232,7 @@ typedef struct _GLFWcontextWGL
GLboolean has_WGL_ARB_create_context; GLboolean has_WGL_ARB_create_context;
GLboolean has_WGL_ARB_create_context_profile; GLboolean has_WGL_ARB_create_context_profile;
GLboolean has_WGL_EXT_create_context_es2_profile; GLboolean has_WGL_EXT_create_context_es2_profile;
GLboolean has_WGL_ARB_create_context_robustness;
} _GLFWcontextWGL; } _GLFWcontextWGL;

View File

@ -323,7 +323,7 @@ static GLboolean createContext(_GLFWwindow* window,
int pixelFormat) int pixelFormat)
{ {
PIXELFORMATDESCRIPTOR pfd; PIXELFORMATDESCRIPTOR pfd;
int i = 0, attribs[9]; int i = 0, attribs[40];
HGLRC share = NULL; HGLRC share = NULL;
if (wndconfig->share) if (wndconfig->share)
@ -355,7 +355,7 @@ static GLboolean createContext(_GLFWwindow* window,
attribs[i++] = wndconfig->glMinor; attribs[i++] = wndconfig->glMinor;
} }
if (wndconfig->glForward || wndconfig->glDebug) if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness)
{ {
int flags = 0; int flags = 0;
@ -365,6 +365,9 @@ static GLboolean createContext(_GLFWwindow* window,
if (wndconfig->glDebug) if (wndconfig->glDebug)
flags |= WGL_CONTEXT_DEBUG_BIT_ARB; flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
if (wndconfig->glRobustness)
flags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB;
attribs[i++] = WGL_CONTEXT_FLAGS_ARB; attribs[i++] = WGL_CONTEXT_FLAGS_ARB;
attribs[i++] = flags; attribs[i++] = flags;
} }
@ -397,6 +400,25 @@ static GLboolean createContext(_GLFWwindow* window,
attribs[i++] = flags; attribs[i++] = flags;
} }
if (wndconfig->glRobustness)
{
int strategy;
if (!window->WGL.has_WGL_ARB_create_context_robustness)
{
_glfwSetError(GLFW_VERSION_UNAVAILABLE, "Win32/WGL: An OpenGL robustness strategy was requested but WGL_ARB_create_context_robustness is unavailable");
return GL_FALSE;
}
if (wndconfig->glRobustness == GLFW_OPENGL_NO_RESET_NOTIFICATION)
strategy = WGL_NO_RESET_NOTIFICATION_ARB;
else if (wndconfig->glRobustness == GLFW_OPENGL_LOSE_CONTEXT_ON_RESET)
strategy = WGL_LOSE_CONTEXT_ON_RESET_ARB;
attribs[i++] = WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB;
attribs[i++] = strategy;
}
attribs[i++] = 0; attribs[i++] = 0;
window->WGL.context = window->WGL.CreateContextAttribsARB(window->WGL.DC, window->WGL.context = window->WGL.CreateContextAttribsARB(window->WGL.DC,
@ -1067,6 +1089,7 @@ static void initWGLExtensions(_GLFWwindow* window)
window->WGL.has_WGL_ARB_create_context = GL_FALSE; window->WGL.has_WGL_ARB_create_context = GL_FALSE;
window->WGL.has_WGL_ARB_create_context_profile = GL_FALSE; window->WGL.has_WGL_ARB_create_context_profile = GL_FALSE;
window->WGL.has_WGL_EXT_create_context_es2_profile = GL_FALSE; window->WGL.has_WGL_EXT_create_context_es2_profile = GL_FALSE;
window->WGL.has_WGL_ARB_create_context_robustness = GL_FALSE;
window->WGL.has_WGL_EXT_swap_control = GL_FALSE; window->WGL.has_WGL_EXT_swap_control = GL_FALSE;
window->WGL.has_WGL_ARB_pixel_format = GL_FALSE; window->WGL.has_WGL_ARB_pixel_format = GL_FALSE;
@ -1105,6 +1128,12 @@ static void initWGLExtensions(_GLFWwindow* window)
window->WGL.has_WGL_EXT_create_context_es2_profile = GL_TRUE; window->WGL.has_WGL_EXT_create_context_es2_profile = GL_TRUE;
} }
if (window->WGL.has_WGL_ARB_create_context)
{
if (_glfwPlatformExtensionSupported("WGL_ARB_create_context_robustness"))
window->WGL.has_WGL_ARB_create_context_robustness = GL_TRUE;
}
if (_glfwPlatformExtensionSupported("WGL_EXT_swap_control")) if (_glfwPlatformExtensionSupported("WGL_EXT_swap_control"))
{ {
window->WGL.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) window->WGL.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)

View File

@ -277,6 +277,7 @@ GLFWAPI GLFWwindow glfwOpenWindow(int width, int height,
wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE; wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE;
wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE; wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE;
wndconfig.glProfile = _glfwLibrary.hints.glProfile; wndconfig.glProfile = _glfwLibrary.hints.glProfile;
wndconfig.glRobustness = _glfwLibrary.hints.glRobustness ? GL_TRUE : GL_FALSE;
wndconfig.share = share; wndconfig.share = share;
// Reset to default values for the next call // Reset to default values for the next call
@ -499,6 +500,9 @@ GLFWAPI void glfwOpenWindowHint(int target, int hint)
case GLFW_OPENGL_PROFILE: case GLFW_OPENGL_PROFILE:
_glfwLibrary.hints.glProfile = hint; _glfwLibrary.hints.glProfile = hint;
break; break;
case GLFW_OPENGL_ROBUSTNESS:
_glfwLibrary.hints.glRobustness = hint;
break;
default: default:
break; break;
} }
@ -776,6 +780,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param)
return window->glDebug; return window->glDebug;
case GLFW_OPENGL_PROFILE: case GLFW_OPENGL_PROFILE:
return window->glProfile; return window->glProfile;
case GLFW_OPENGL_ROBUSTNESS:
return window->glRobustness;
default: default:
_glfwSetError(GLFW_INVALID_ENUM, "glfwGetWindowParam: Invalid enum value for 'param' parameter"); _glfwSetError(GLFW_INVALID_ENUM, "glfwGetWindowParam: Invalid enum value for 'param' parameter");
return 0; return 0;

View File

@ -107,6 +107,7 @@ typedef struct _GLFWcontextGLX
GLboolean has_GLX_ARB_multisample; GLboolean has_GLX_ARB_multisample;
GLboolean has_GLX_ARB_create_context; GLboolean has_GLX_ARB_create_context;
GLboolean has_GLX_ARB_create_context_profile; GLboolean has_GLX_ARB_create_context_profile;
GLboolean has_GLX_ARB_create_context_robustness;
GLboolean has_GLX_EXT_create_context_es2_profile; GLboolean has_GLX_EXT_create_context_es2_profile;
} _GLFWcontextGLX; } _GLFWcontextGLX;

View File

@ -445,7 +445,7 @@ static int createContext(_GLFWwindow* window,
setGLXattrib(attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor); setGLXattrib(attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor);
} }
if (wndconfig->glForward || wndconfig->glDebug) if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness)
{ {
int flags = 0; int flags = 0;
@ -455,6 +455,9 @@ static int createContext(_GLFWwindow* window,
if (wndconfig->glDebug) if (wndconfig->glDebug)
flags |= GLX_CONTEXT_DEBUG_BIT_ARB; flags |= GLX_CONTEXT_DEBUG_BIT_ARB;
if (wndconfig->glRobustness)
flags |= GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB;
setGLXattrib(attribs, index, GLX_CONTEXT_FLAGS_ARB, flags); setGLXattrib(attribs, index, GLX_CONTEXT_FLAGS_ARB, flags);
} }
@ -485,6 +488,24 @@ static int createContext(_GLFWwindow* window,
setGLXattrib(attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags); setGLXattrib(attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags);
} }
if (wndconfig->glRobustness)
{
int strategy;
if (!window->GLX.has_GLX_ARB_create_context_robustness)
{
_glfwSetError(GLFW_VERSION_UNAVAILABLE, "X11/GLX: An OpenGL robustness strategy was requested but GLX_ARB_create_context_robustness is unavailable");
return GL_FALSE;
}
if (wndconfig->glRobustness == GLFW_OPENGL_NO_RESET_NOTIFICATION)
strategy = GLX_NO_RESET_NOTIFICATION_ARB;
else if (wndconfig->glRobustness == GLFW_OPENGL_LOSE_CONTEXT_ON_RESET)
strategy = GLX_LOSE_CONTEXT_ON_RESET_ARB;
setGLXattrib(attribs, index, GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, strategy);
}
setGLXattrib(attribs, index, None, None); setGLXattrib(attribs, index, None, None);
// This is the only place we set an Xlib error handler, and we only do // This is the only place we set an Xlib error handler, and we only do
@ -613,6 +634,12 @@ static void initGLXExtensions(_GLFWwindow* window)
if (_glfwPlatformExtensionSupported("GLX_EXT_create_context_es2_profile")) if (_glfwPlatformExtensionSupported("GLX_EXT_create_context_es2_profile"))
window->GLX.has_GLX_EXT_create_context_es2_profile = GL_TRUE; window->GLX.has_GLX_EXT_create_context_es2_profile = GL_TRUE;
} }
if (window->GLX.has_GLX_ARB_create_context)
{
if (_glfwPlatformExtensionSupported("GLX_ARB_create_context_robustness"))
window->GLX.has_GLX_ARB_create_context_robustness = GL_TRUE;
}
} }

View File

@ -44,8 +44,9 @@
static void usage(void) static void usage(void)
{ {
printf("Usage: version [-h] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE]\n"); printf("Usage: version [-h] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n");
printf("available profiles: core compat es2\n"); printf("available profiles: core compat es2\n");
printf("available strategies: none lose\n");
} }
static void error_callback(int error, const char* description) static void error_callback(int error, const char* description)
@ -113,12 +114,12 @@ static void list_extensions(int major, int minor)
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
int ch, profile = 0, major = 1, minor = 0, revision; int ch, profile = 0, strategy = 0, major = 1, minor = 0, revision;
GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE; GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE;
GLint flags, mask; GLint flags, mask;
GLFWwindow window; GLFWwindow window;
while ((ch = getopt(argc, argv, "dfhlm:n:p:")) != -1) while ((ch = getopt(argc, argv, "dfhlm:n:p:r:")) != -1)
{ {
switch (ch) switch (ch)
{ {
@ -153,6 +154,17 @@ int main(int argc, char** argv)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
break; break;
case 'r':
if (strcasecmp(optarg, "none") == 0)
strategy = GLFW_OPENGL_NO_RESET_NOTIFICATION;
else if (strcasecmp(optarg, "lose") == 0)
strategy = GLFW_OPENGL_LOSE_CONTEXT_ON_RESET;
else
{
usage();
exit(EXIT_FAILURE);
}
break;
default: default:
usage(); usage();
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -185,6 +197,9 @@ int main(int argc, char** argv)
if (profile != 0) if (profile != 0)
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, profile); glfwOpenWindowHint(GLFW_OPENGL_PROFILE, profile);
if (strategy)
glfwOpenWindowHint(GLFW_OPENGL_ROBUSTNESS, strategy);
// We assume here that we stand a better chance of success by leaving all // We assume here that we stand a better chance of success by leaving all
// possible details of pixel format selection to GLFW // possible details of pixel format selection to GLFW