Bug 1473169 - Support KHR_create_context_no_error in EGL. - r=kvark
authorjgilbert@mozilla.com <jdashg@gmail.com>
Tue, 03 Jul 2018 15:40:58 -0700
changeset 480338 9cc2c931853bc0cb05418c1c7ec989222e2677bd
parent 480337 d292eb650b0b715388bda5c579b97692c7ebf2ec
child 480339 4b75dda634bc7edf1e77813eb889d43092855038
push id9719
push userffxbld-merge
push dateFri, 24 Aug 2018 17:49:46 +0000
treeherdermozilla-beta@719ec98fba77 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskvark
bugs1473169
milestone63.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1473169 - Support KHR_create_context_no_error in EGL. - r=kvark MozReview-Commit-ID: 3hOIgDuvRNd
dom/canvas/WebGLContextDraw.cpp
gfx/gl/GLContext.cpp
gfx/gl/GLContext.h
gfx/gl/GLContextProviderEGL.cpp
gfx/gl/GLLibraryEGL.cpp
gfx/gl/GLLibraryEGL.h
--- a/dom/canvas/WebGLContextDraw.cpp
+++ b/dom/canvas/WebGLContextDraw.cpp
@@ -746,18 +746,21 @@ WebGLContext::DrawElementsInstanced(GLen
     const ScopedResolveTexturesForDraw scopedResolve(this, funcName, &error);
     if (error)
         return;
 
     {
         ScopedDrawCallWrapper wrapper(*this);
         {
             UniquePtr<gl::GLContext::LocalErrorScope> errorScope;
-
-            if (gl->IsANGLE()) {
+            if (MOZ_UNLIKELY( gl->IsANGLE() &&
+                              gl->mDebugFlags & gl::GLContext::DebugFlagAbortOnError ))
+            {
+                // ANGLE does range validation even when it doesn't need to.
+                // With MOZ_GL_ABORT_ON_ERROR, we need to catch it or hit assertions.
                 errorScope.reset(new gl::GLContext::LocalErrorScope(*gl));
             }
 
             if (indexCount && instanceCount) {
                 AUTO_PROFILER_LABEL("glDrawElementsInstanced", GRAPHICS);
                 if (HasInstancedDrawing(*this)) {
                     gl->fDrawElementsInstanced(mode, indexCount, type,
                                                reinterpret_cast<GLvoid*>(byteOffset),
--- a/gfx/gl/GLContext.cpp
+++ b/gfx/gl/GLContext.cpp
@@ -215,18 +215,18 @@ ParseVersion(const std::string& versionS
 
     const auto& majorStr = match.str(1);
     const auto& minorStr = match.str(2);
     *out_major = atoi(majorStr.c_str());
     *out_minor = atoi(minorStr.c_str());
     return true;
 }
 
-static uint8_t
-ChooseDebugFlags(CreateContextFlags createFlags)
+/*static*/ uint8_t
+GLContext::ChooseDebugFlags(const CreateContextFlags createFlags)
 {
     uint8_t debugFlags = 0;
 
 #ifdef MOZ_GL_DEBUG
     if (gfxEnv::GlDebug()) {
         debugFlags |= GLContext::DebugFlagEnabled;
     }
 
--- a/gfx/gl/GLContext.h
+++ b/gfx/gl/GLContext.h
@@ -3468,16 +3468,17 @@ public:
 
     enum {
         DebugFlagEnabled = 1 << 0,
         DebugFlagTrace = 1 << 1,
         DebugFlagAbortOnError = 1 << 2
     };
 
     const uint8_t mDebugFlags;
+    static uint8_t ChooseDebugFlags(CreateContextFlags createFlags);
 
 protected:
     RefPtr<GLContext> mSharedContext;
 
     // The thread id which this context was created.
     PlatformThreadId mOwningThreadId;
 
     GLContextSymbols mSymbols;
--- a/gfx/gl/GLContextProviderEGL.cpp
+++ b/gfx/gl/GLContextProviderEGL.cpp
@@ -561,16 +561,25 @@ GLContextEGL::CreateGLContext(CreateCont
     std::vector<EGLint> required_attribs;
     required_attribs.push_back(LOCAL_EGL_CONTEXT_CLIENT_VERSION);
     if (flags & CreateContextFlags::PREFER_ES3) {
         required_attribs.push_back(3);
     } else {
         required_attribs.push_back(2);
     }
 
+    const auto debugFlags = GLContext::ChooseDebugFlags(flags);
+    if (!debugFlags &&
+        flags & CreateContextFlags::NO_VALIDATION &&
+        egl->IsExtensionSupported(GLLibraryEGL::KHR_create_context_no_error))
+    {
+        required_attribs.push_back(LOCAL_EGL_CONTEXT_OPENGL_NO_ERROR_KHR);
+        required_attribs.push_back(LOCAL_EGL_TRUE);
+    }
+
     std::vector<EGLint> robustness_attribs;
     std::vector<EGLint> rbab_attribs; // RBAB: Robust Buffer Access Behavior
     if (flags & CreateContextFlags::PREFER_ROBUSTNESS) {
         if (egl->IsExtensionSupported(GLLibraryEGL::EXT_create_context_robustness)) {
             robustness_attribs = required_attribs;
             robustness_attribs.push_back(LOCAL_EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT);
             robustness_attribs.push_back(LOCAL_EGL_LOSE_CONTEXT_ON_RESET_EXT);
             // Skip EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, since it doesn't help us.
--- a/gfx/gl/GLLibraryEGL.cpp
+++ b/gfx/gl/GLLibraryEGL.cpp
@@ -63,17 +63,18 @@ static const char* sEGLExtensionNames[] 
     "EGL_KHR_create_context",
     "EGL_KHR_stream",
     "EGL_KHR_stream_consumer_gltexture",
     "EGL_EXT_device_query",
     "EGL_NV_stream_consumer_gltexture_yuv",
     "EGL_ANGLE_stream_producer_d3d_texture",
     "EGL_ANGLE_device_creation",
     "EGL_ANGLE_device_creation_d3d11",
-    "EGL_KHR_surfaceless_context"
+    "EGL_KHR_surfaceless_context",
+    "EGL_KHR_create_context_no_error"
 };
 
 #if defined(ANDROID)
 
 static PRLibrary* LoadApitraceLibrary()
 {
     // Initialization of gfx prefs here is only needed during the unit tests...
     gfxPrefs::GetSingleton();
--- a/gfx/gl/GLLibraryEGL.h
+++ b/gfx/gl/GLLibraryEGL.h
@@ -100,16 +100,17 @@ public:
         KHR_stream,
         KHR_stream_consumer_gltexture,
         EXT_device_query,
         NV_stream_consumer_gltexture_yuv,
         ANGLE_stream_producer_d3d_texture,
         ANGLE_device_creation,
         ANGLE_device_creation_d3d11,
         KHR_surfaceless_context,
+        KHR_create_context_no_error,
         Extensions_Max
     };
 
     bool IsExtensionSupported(EGLExtensions aKnownExtension) const {
         return mAvailableExtensions[aKnownExtension];
     }
 
     void MarkExtensionUnsupported(EGLExtensions aKnownExtension) {