Commit b920e360 by Corentin Wallez Committed by Commit Bot

Implement GL_ARB_create_context_robustness on GLX and WGL

BUG=angleproject:1463 Change-Id: I5bdcfd757d6f7d6411558c368fa7a26c8a38c9ba Reviewed-on: https://chromium-review.googlesource.com/365971 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 9ddfa060
...@@ -282,8 +282,7 @@ void ContextGL::stencilThenCoverStrokePathInstanced(const std::vector<gl::Path * ...@@ -282,8 +282,7 @@ void ContextGL::stencilThenCoverStrokePathInstanced(const std::vector<gl::Path *
GLenum ContextGL::getResetStatus() GLenum ContextGL::getResetStatus()
{ {
UNIMPLEMENTED(); return mRenderer->getResetStatus();
return GL_NO_ERROR;
} }
std::string ContextGL::getVendorString() const std::string ContextGL::getVendorString() const
......
...@@ -1023,6 +1023,12 @@ void FunctionsGL::initializeProcsDesktopGL() ...@@ -1023,6 +1023,12 @@ void FunctionsGL::initializeProcsDesktopGL()
AssignGLExtensionEntryPoint(extensions, "GL_ARB_get_program_binary", loadProcAddress("glProgramBinary"), &programBinary); AssignGLExtensionEntryPoint(extensions, "GL_ARB_get_program_binary", loadProcAddress("glProgramBinary"), &programBinary);
AssignGLExtensionEntryPoint(extensions, "GL_ARB_get_program_binary", loadProcAddress("glProgramParameteri"), &programParameteri); AssignGLExtensionEntryPoint(extensions, "GL_ARB_get_program_binary", loadProcAddress("glProgramParameteri"), &programParameteri);
// GL_ARB_robustness
AssignGLExtensionEntryPoint(extensions, "GL_ARB_robustness", loadProcAddress("glGetGraphicsResetStatusARB"), &getGraphicsResetStatus);
// GL_KHR_robustness
AssignGLExtensionEntryPoint(extensions, "GL_KHR_robustness", loadProcAddress("glGetGraphicsResetStatus"), &getGraphicsResetStatus);
// 1.0 // 1.0
if (isAtLeastGL(gl::Version(1, 0))) if (isAtLeastGL(gl::Version(1, 0)))
{ {
...@@ -1885,6 +1891,12 @@ void FunctionsGL::initializeProcsGLES() ...@@ -1885,6 +1891,12 @@ void FunctionsGL::initializeProcsGLES()
AssignGLExtensionEntryPoint(extensions, "GL_OES_get_program_binary", loadProcAddress("glGetProgramBinaryOES"), &getProgramBinary); AssignGLExtensionEntryPoint(extensions, "GL_OES_get_program_binary", loadProcAddress("glGetProgramBinaryOES"), &getProgramBinary);
AssignGLExtensionEntryPoint(extensions, "GL_OES_get_program_binary", loadProcAddress("glProgramBinaryOES"), &programBinary); AssignGLExtensionEntryPoint(extensions, "GL_OES_get_program_binary", loadProcAddress("glProgramBinaryOES"), &programBinary);
// GL_EXT_robustness
AssignGLExtensionEntryPoint(extensions, "GL_EXT_robustness", loadProcAddress("glGetGraphicsResetStatusEXT"), &getGraphicsResetStatus);
// GL_KHR_robustness
AssignGLExtensionEntryPoint(extensions, "GL_KHR_robustness", loadProcAddress("glGetGraphicsResetStatusKHR"), &getGraphicsResetStatus);
// 2.0 // 2.0
if (isAtLeastGLES(gl::Version(2, 0))) if (isAtLeastGLES(gl::Version(2, 0)))
{ {
......
...@@ -425,6 +425,11 @@ void RendererGL::stencilThenCoverStrokePathInstanced(const gl::ContextState &sta ...@@ -425,6 +425,11 @@ void RendererGL::stencilThenCoverStrokePathInstanced(const gl::ContextState &sta
ASSERT(mFunctions->getError() == GL_NO_ERROR); ASSERT(mFunctions->getError() == GL_NO_ERROR);
} }
GLenum RendererGL::getResetStatus()
{
return mFunctions->getGraphicsResetStatus();
}
ContextImpl *RendererGL::createContext(const gl::ContextState &state) ContextImpl *RendererGL::createContext(const gl::ContextState &state)
{ {
return new ContextGL(state, this); return new ContextGL(state, this);
......
...@@ -137,6 +137,8 @@ class RendererGL : angle::NonCopyable ...@@ -137,6 +137,8 @@ class RendererGL : angle::NonCopyable
GLenum transformType, GLenum transformType,
const GLfloat *transformValues); const GLfloat *transformValues);
GLenum getResetStatus();
// EXT_debug_marker // EXT_debug_marker
void insertEventMarker(GLsizei length, const char *marker); void insertEventMarker(GLsizei length, const char *marker);
void pushGroupMarker(GLsizei length, const char *marker); void pushGroupMarker(GLsizei length, const char *marker);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "libANGLE/Surface.h" #include "libANGLE/Surface.h"
#include "libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h" #include "libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h"
#include "libANGLE/renderer/gl/glx/WindowSurfaceGLX.h" #include "libANGLE/renderer/gl/glx/WindowSurfaceGLX.h"
#include "libANGLE/renderer/gl/RendererGL.h"
#include "libANGLE/renderer/gl/renderergl_utils.h" #include "libANGLE/renderer/gl/renderergl_utils.h"
#include "third_party/libXNVCtrl/NVCtrl.h" #include "third_party/libXNVCtrl/NVCtrl.h"
#include "third_party/libXNVCtrl/NVCtrlLib.h" #include "third_party/libXNVCtrl/NVCtrlLib.h"
...@@ -117,6 +118,7 @@ DisplayGLX::DisplayGLX() ...@@ -117,6 +118,7 @@ DisplayGLX::DisplayGLX()
mHasMultisample(false), mHasMultisample(false),
mHasARBCreateContext(false), mHasARBCreateContext(false),
mHasARBCreateContextProfile(false), mHasARBCreateContextProfile(false),
mHasARBCreateContextRobustness(false),
mHasEXTCreateContextES2Profile(false), mHasEXTCreateContextES2Profile(false),
mSwapControl(SwapControl::Absent), mSwapControl(SwapControl::Absent),
mMinSwapInterval(0), mMinSwapInterval(0),
...@@ -159,6 +161,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display) ...@@ -159,6 +161,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
mHasMultisample = mGLX.minorVersion > 3 || mGLX.hasExtension("GLX_ARB_multisample"); mHasMultisample = mGLX.minorVersion > 3 || mGLX.hasExtension("GLX_ARB_multisample");
mHasARBCreateContext = mGLX.hasExtension("GLX_ARB_create_context"); mHasARBCreateContext = mGLX.hasExtension("GLX_ARB_create_context");
mHasARBCreateContextProfile = mGLX.hasExtension("GLX_ARB_create_context_profile"); mHasARBCreateContextProfile = mGLX.hasExtension("GLX_ARB_create_context_profile");
mHasARBCreateContextRobustness = mGLX.hasExtension("GLX_ARB_create_context_robustness");
mHasEXTCreateContextES2Profile = mGLX.hasExtension("GLX_EXT_create_context_es2_profile"); mHasEXTCreateContextES2Profile = mGLX.hasExtension("GLX_EXT_create_context_es2_profile");
std::string clientVendor = mGLX.getClientString(GLX_VENDOR); std::string clientVendor = mGLX.getClientString(GLX_VENDOR);
...@@ -386,7 +389,7 @@ SurfaceImpl *DisplayGLX::createWindowSurface(const egl::SurfaceState &state, ...@@ -386,7 +389,7 @@ SurfaceImpl *DisplayGLX::createWindowSurface(const egl::SurfaceState &state,
ASSERT(configIdToGLXConfig.count(configuration->configID) > 0); ASSERT(configIdToGLXConfig.count(configuration->configID) > 0);
glx::FBConfig fbConfig = configIdToGLXConfig[configuration->configID]; glx::FBConfig fbConfig = configIdToGLXConfig[configuration->configID];
return new WindowSurfaceGLX(state, mGLX, this, this->getRenderer(), window, mGLX.getDisplay(), return new WindowSurfaceGLX(state, mGLX, this, getRenderer(), window, mGLX.getDisplay(),
mContext, fbConfig); mContext, fbConfig);
} }
...@@ -401,7 +404,7 @@ SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::SurfaceState &state, ...@@ -401,7 +404,7 @@ SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::SurfaceState &state,
EGLint height = static_cast<EGLint>(attribs.get(EGL_HEIGHT, 0)); EGLint height = static_cast<EGLint>(attribs.get(EGL_HEIGHT, 0));
bool largest = (attribs.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE); bool largest = (attribs.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
return new PbufferSurfaceGLX(state, this->getRenderer(), width, height, largest, mGLX, mContext, return new PbufferSurfaceGLX(state, getRenderer(), width, height, largest, mGLX, mContext,
fbConfig); fbConfig);
} }
...@@ -727,13 +730,16 @@ egl::ConfigSet DisplayGLX::generateConfigs() ...@@ -727,13 +730,16 @@ egl::ConfigSet DisplayGLX::generateConfigs()
bool DisplayGLX::testDeviceLost() bool DisplayGLX::testDeviceLost()
{ {
// UNIMPLEMENTED(); if (mHasARBCreateContextRobustness)
{
return getRenderer()->getResetStatus() != GL_NO_ERROR;
}
return false; return false;
} }
egl::Error DisplayGLX::restoreLostDevice() egl::Error DisplayGLX::restoreLostDevice()
{ {
UNIMPLEMENTED();
return egl::Error(EGL_BAD_DISPLAY); return egl::Error(EGL_BAD_DISPLAY);
} }
...@@ -885,11 +891,11 @@ const FunctionsGL *DisplayGLX::getFunctionsGL() const ...@@ -885,11 +891,11 @@ const FunctionsGL *DisplayGLX::getFunctionsGL() const
void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const
{ {
outExtensions->createContextRobustness = mHasARBCreateContextRobustness;
} }
void DisplayGLX::generateCaps(egl::Caps *outCaps) const void DisplayGLX::generateCaps(egl::Caps *outCaps) const
{ {
// UNIMPLEMENTED();
outCaps->textureNPOT = true; outCaps->textureNPOT = true;
} }
...@@ -907,6 +913,12 @@ egl::Error DisplayGLX::createContextAttribs(glx::FBConfig, ...@@ -907,6 +913,12 @@ egl::Error DisplayGLX::createContextAttribs(glx::FBConfig,
{ {
std::vector<int> attribs; std::vector<int> attribs;
if (mHasARBCreateContextRobustness)
{
attribs.push_back(GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB);
attribs.push_back(GLX_LOSE_CONTEXT_ON_RESET_ARB);
}
if (version.valid()) if (version.valid())
{ {
attribs.push_back(GLX_CONTEXT_MAJOR_VERSION_ARB); attribs.push_back(GLX_CONTEXT_MAJOR_VERSION_ARB);
......
...@@ -125,6 +125,7 @@ class DisplayGLX : public DisplayGL ...@@ -125,6 +125,7 @@ class DisplayGLX : public DisplayGL
bool mHasMultisample; bool mHasMultisample;
bool mHasARBCreateContext; bool mHasARBCreateContext;
bool mHasARBCreateContextProfile; bool mHasARBCreateContextProfile;
bool mHasARBCreateContextRobustness;
bool mHasEXTCreateContextES2Profile; bool mHasEXTCreateContextES2Profile;
enum class SwapControl enum class SwapControl
......
...@@ -116,6 +116,12 @@ ...@@ -116,6 +116,12 @@
#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
// GLX_ARB_create_context_robustness
#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252
#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261
// GLX_EXT_create_context_es2_profile // GLX_EXT_create_context_es2_profile
#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
......
...@@ -847,6 +847,12 @@ void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsM ...@@ -847,6 +847,12 @@ void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsM
functions->hasGLExtension("GL_NV_framebuffer_mixed_samples") || functions->hasGLExtension("GL_NV_framebuffer_mixed_samples") ||
functions->hasGLESExtension("GL_NV_framebuffer_mixed_samples"); functions->hasGLESExtension("GL_NV_framebuffer_mixed_samples");
extensions->robustness = functions->isAtLeastGL(gl::Version(4, 5)) ||
functions->hasGLExtension("GL_KHR_robustness") ||
functions->hasGLExtension("GL_ARB_robustness") ||
functions->isAtLeastGLES(gl::Version(3, 2)) ||
functions->hasGLESExtension("GL_KHR_robustness") ||
functions->hasGLESExtension("GL_EXT_robustness");
// NV_path_rendering // NV_path_rendering
// We also need interface query which is available in // We also need interface query which is available in
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "libANGLE/Config.h" #include "libANGLE/Config.h"
#include "libANGLE/Display.h" #include "libANGLE/Display.h"
#include "libANGLE/Surface.h" #include "libANGLE/Surface.h"
#include "libANGLE/renderer/gl/RendererGL.h"
#include "libANGLE/renderer/gl/renderergl_utils.h" #include "libANGLE/renderer/gl/renderergl_utils.h"
#include "libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h" #include "libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h"
#include "libANGLE/renderer/gl/wgl/FunctionsWGL.h" #include "libANGLE/renderer/gl/wgl/FunctionsWGL.h"
...@@ -59,6 +60,7 @@ DisplayWGL::DisplayWGL() ...@@ -59,6 +60,7 @@ DisplayWGL::DisplayWGL()
mOpenGLModule(nullptr), mOpenGLModule(nullptr),
mFunctionsWGL(nullptr), mFunctionsWGL(nullptr),
mFunctionsGL(nullptr), mFunctionsGL(nullptr),
mHasARBCreateContextRobustness(false),
mWindowClass(0), mWindowClass(0),
mWindow(nullptr), mWindow(nullptr),
mDeviceContext(nullptr), mDeviceContext(nullptr),
...@@ -173,6 +175,9 @@ egl::Error DisplayWGL::initialize(egl::Display *display) ...@@ -173,6 +175,9 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
// Reinitialize the wgl functions to grab the extensions // Reinitialize the wgl functions to grab the extensions
mFunctionsWGL->initialize(mOpenGLModule, dummyDeviceContext); mFunctionsWGL->initialize(mOpenGLModule, dummyDeviceContext);
mHasARBCreateContextRobustness =
mFunctionsWGL->hasExtension("WGL_ARB_create_context_robustness");
// Destroy the dummy window and context // Destroy the dummy window and context
mFunctionsWGL->makeCurrent(dummyDeviceContext, nullptr); mFunctionsWGL->makeCurrent(dummyDeviceContext, nullptr);
mFunctionsWGL->deleteContext(dummyWGLContext); mFunctionsWGL->deleteContext(dummyWGLContext);
...@@ -259,6 +264,12 @@ egl::Error DisplayWGL::initialize(egl::Display *display) ...@@ -259,6 +264,12 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
std::vector<int> contextCreationAttributes; std::vector<int> contextCreationAttributes;
if (mHasARBCreateContextRobustness)
{
contextCreationAttributes.push_back(WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB);
contextCreationAttributes.push_back(WGL_LOSE_CONTEXT_ON_RESET_ARB);
}
// Don't request a specific version unless the user wants one. WGL will return the highest version // Don't request a specific version unless the user wants one. WGL will return the highest version
// that the driver supports if no version is requested. // that the driver supports if no version is requested.
EGLint requestedMajorVersion = static_cast<EGLint>( EGLint requestedMajorVersion = static_cast<EGLint>(
...@@ -416,13 +427,13 @@ SurfaceImpl *DisplayWGL::createWindowSurface(const egl::SurfaceState &state, ...@@ -416,13 +427,13 @@ SurfaceImpl *DisplayWGL::createWindowSurface(const egl::SurfaceState &state,
EGLint orientation = static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0)); EGLint orientation = static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
if (mUseDXGISwapChains) if (mUseDXGISwapChains)
{ {
return new DXGISwapChainWindowSurfaceWGL(state, this->getRenderer(), window, mD3D11Device, return new DXGISwapChainWindowSurfaceWGL(state, getRenderer(), window, mD3D11Device,
mD3D11DeviceHandle, mWGLContext, mDeviceContext, mD3D11DeviceHandle, mWGLContext, mDeviceContext,
mFunctionsGL, mFunctionsWGL, orientation); mFunctionsGL, mFunctionsWGL, orientation);
} }
else else
{ {
return new WindowSurfaceWGL(state, this->getRenderer(), window, mPixelFormat, mWGLContext, return new WindowSurfaceWGL(state, getRenderer(), window, mPixelFormat, mWGLContext,
mFunctionsWGL, orientation); mFunctionsWGL, orientation);
} }
} }
...@@ -437,9 +448,8 @@ SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::SurfaceState &state, ...@@ -437,9 +448,8 @@ SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::SurfaceState &state,
EGLenum textureFormat = static_cast<EGLenum>(attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE)); EGLenum textureFormat = static_cast<EGLenum>(attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE));
EGLenum textureTarget = static_cast<EGLenum>(attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE)); EGLenum textureTarget = static_cast<EGLenum>(attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE));
return new PbufferSurfaceWGL(state, this->getRenderer(), width, height, textureFormat, return new PbufferSurfaceWGL(state, getRenderer(), width, height, textureFormat, textureTarget,
textureTarget, largest, mPixelFormat, mDeviceContext, mWGLContext, largest, mPixelFormat, mDeviceContext, mWGLContext, mFunctionsWGL);
mFunctionsWGL);
} }
SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::SurfaceState &state, SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::SurfaceState &state,
...@@ -543,13 +553,16 @@ egl::ConfigSet DisplayWGL::generateConfigs() ...@@ -543,13 +553,16 @@ egl::ConfigSet DisplayWGL::generateConfigs()
bool DisplayWGL::testDeviceLost() bool DisplayWGL::testDeviceLost()
{ {
//UNIMPLEMENTED(); if (mHasARBCreateContextRobustness)
{
return getRenderer()->getResetStatus() != GL_NO_ERROR;
}
return false; return false;
} }
egl::Error DisplayWGL::restoreLostDevice() egl::Error DisplayWGL::restoreLostDevice()
{ {
UNIMPLEMENTED();
return egl::Error(EGL_BAD_DISPLAY); return egl::Error(EGL_BAD_DISPLAY);
} }
...@@ -619,6 +632,8 @@ void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -619,6 +632,8 @@ void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
// prefer to swap with inverted Y. // prefer to swap with inverted Y.
outExtensions->postSubBuffer = mUseDXGISwapChains; outExtensions->postSubBuffer = mUseDXGISwapChains;
outExtensions->surfaceOrientation = mUseDXGISwapChains; outExtensions->surfaceOrientation = mUseDXGISwapChains;
outExtensions->createContextRobustness = mHasARBCreateContextRobustness;
} }
void DisplayWGL::generateCaps(egl::Caps *outCaps) const void DisplayWGL::generateCaps(egl::Caps *outCaps) const
......
...@@ -78,6 +78,8 @@ class DisplayWGL : public DisplayGL ...@@ -78,6 +78,8 @@ class DisplayWGL : public DisplayGL
FunctionsWGL *mFunctionsWGL; FunctionsWGL *mFunctionsWGL;
FunctionsGL *mFunctionsGL; FunctionsGL *mFunctionsGL;
bool mHasARBCreateContextRobustness;
ATOM mWindowClass; ATOM mWindowClass;
HWND mWindow; HWND mWindow;
HDC mDeviceContext; HDC mDeviceContext;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment