GLContext: Keep track of robust access support for WasLost

This commit is contained in:
Dr. Chat 2015-12-22 15:53:51 -06:00
parent cde39953ab
commit b49114bad6
2 changed files with 13 additions and 9 deletions

View File

@ -133,16 +133,15 @@ bool GLContext::Initialize(GLContext* share_context) {
return false; return false;
} }
bool robust_access_supported = false;
if (GLEW_ARB_robustness) { if (GLEW_ARB_robustness) {
robust_access_supported = true; robust_access_supported_ = true;
} }
int context_flags = 0; int context_flags = 0;
if (FLAGS_gl_debug) { if (FLAGS_gl_debug) {
context_flags |= WGL_CONTEXT_DEBUG_BIT_ARB; context_flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
} }
if (robust_access_supported) { if (robust_access_supported_) {
context_flags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB; context_flags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB;
} }
@ -156,7 +155,7 @@ bool GLContext::Initialize(GLContext* share_context) {
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_PROFILE_MASK_ARB,
WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB,
robust_access_supported ? WGL_LOSE_CONTEXT_ON_RESET_ARB : 0, robust_access_supported_ ? WGL_LOSE_CONTEXT_ON_RESET_ARB : 0,
0}; 0};
glrc_ = wglCreateContextAttribsARB( glrc_ = wglCreateContextAttribsARB(
@ -207,15 +206,12 @@ std::unique_ptr<GLContext> GLContext::CreateOffscreen(
{ {
GraphicsContextLock context_lock(parent_context); GraphicsContextLock context_lock(parent_context);
bool robust_access_supported = false;
if (GLEW_ARB_robustness) {
robust_access_supported = true;
}
int context_flags = 0; int context_flags = 0;
if (FLAGS_gl_debug) { if (FLAGS_gl_debug) {
context_flags |= WGL_CONTEXT_DEBUG_BIT_ARB; context_flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
} }
bool robust_access_supported = parent_context->robust_access_supported_;
if (robust_access_supported) { if (robust_access_supported) {
context_flags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB; context_flags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB;
} }
@ -245,6 +241,8 @@ std::unique_ptr<GLContext> GLContext::CreateOffscreen(
new_context->glrc_ = new_glrc; new_context->glrc_ = new_glrc;
new_context->dc_ = new_context->dc_ =
GetDC(HWND(parent_context->target_window_->native_handle())); GetDC(HWND(parent_context->target_window_->native_handle()));
new_context->robust_access_supported_ =
parent_context->robust_access_supported_;
if (!new_context->MakeCurrent()) { if (!new_context->MakeCurrent()) {
FatalGLError("Could not make new GL context current."); FatalGLError("Could not make new GL context current.");
return nullptr; return nullptr;
@ -473,6 +471,11 @@ void GLContext::ClearCurrent() {
} }
bool GLContext::WasLost() { bool GLContext::WasLost() {
if (!robust_access_supported_) {
// Can't determine if we lost the context.
return false;
}
if (context_lost_) { if (context_lost_) {
return true; return true;
} }

View File

@ -83,6 +83,7 @@ class GLContext : public GraphicsContext {
std::unique_ptr<GLImmediateDrawer> immediate_drawer_; std::unique_ptr<GLImmediateDrawer> immediate_drawer_;
bool context_lost_ = false; bool context_lost_ = false;
bool robust_access_supported_ = false;
}; };
} // namespace gl } // namespace gl