EGL: workaround an EGL 1.5 bug in PowerVR drivers.

PowerVR drivers claim to support EGL 1.5, but don't support the
EGL_CONTEXT_OPENGL_ROBUST_ACCESS enum in the promoted feature. Use the
EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT enum instead.

Bug: 441938383
Change-Id: I38878abe1aeaef5de04cd2346f955d251b74a9b3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/266714
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/src/dawn/native/opengl/ContextEGL.cpp b/src/dawn/native/opengl/ContextEGL.cpp
index fd6c3bf..1ef6e05 100644
--- a/src/dawn/native/opengl/ContextEGL.cpp
+++ b/src/dawn/native/opengl/ContextEGL.cpp
@@ -55,11 +55,12 @@
 ResultOrError<std::unique_ptr<ContextEGL>> ContextEGL::Create(Ref<DisplayEGL> display,
                                                               wgpu::BackendType backend,
                                                               bool useRobustness,
+                                                              bool disableEGL15Robustness,
                                                               bool useANGLETextureSharing,
                                                               bool forceES31AndMinExtensions) {
     auto context = std::make_unique<ContextEGL>(std::move(display));
-    DAWN_TRY(context->Initialize(backend, useRobustness, useANGLETextureSharing,
-                                 forceES31AndMinExtensions));
+    DAWN_TRY(context->Initialize(backend, useRobustness, disableEGL15Robustness,
+                                 useANGLETextureSharing, forceES31AndMinExtensions));
     return std::move(context);
 }
 
@@ -78,6 +79,7 @@
 
 MaybeError ContextEGL::Initialize(wgpu::BackendType backend,
                                   bool useRobustness,
+                                  bool disableEGL15Robustness,
                                   bool useANGLETextureSharing,
                                   bool forceES31AndMinExtensions) {
     const EGLFunctions& egl = mDisplay->egl;
@@ -127,7 +129,8 @@
     if (useRobustness) {
         DAWN_ASSERT(egl.HasExt(EGLExt::CreateContextRobustness));
         // EGL_EXT_create_context_robustness is promoted to 1.5 but with a different enum value.
-        if (egl.GetMinorVersion() >= 5) {
+        // PowerVR advertises EGL 1.5, but only supports the old enum value.
+        if (egl.GetMinorVersion() >= 5 && !disableEGL15Robustness) {
             AddAttrib(EGL_CONTEXT_OPENGL_ROBUST_ACCESS, EGL_TRUE);
         } else {
             AddAttrib(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_TRUE);
diff --git a/src/dawn/native/opengl/ContextEGL.h b/src/dawn/native/opengl/ContextEGL.h
index 1a6c7e7..3f49d6d 100644
--- a/src/dawn/native/opengl/ContextEGL.h
+++ b/src/dawn/native/opengl/ContextEGL.h
@@ -46,6 +46,7 @@
     static ResultOrError<std::unique_ptr<ContextEGL>> Create(Ref<DisplayEGL> display,
                                                              wgpu::BackendType backend,
                                                              bool useRobustness,
+                                                             bool disableEGL15Robustness,
                                                              bool useANGLETextureSharing,
                                                              bool forceES31AndMinExtensions);
 
@@ -55,6 +56,7 @@
     MaybeError Initialize(wgpu::BackendType backend,
                           bool useRobustness,
                           bool useANGLETextureSharing,
+                          bool disableEGL15Robustness,
                           bool forceES31AndMinExtensions);
     void RequestRequiredExtensionsExplicitly();
 
diff --git a/src/dawn/native/opengl/PhysicalDeviceGL.cpp b/src/dawn/native/opengl/PhysicalDeviceGL.cpp
index 7ae57b4..b029875 100644
--- a/src/dawn/native/opengl/PhysicalDeviceGL.cpp
+++ b/src/dawn/native/opengl/PhysicalDeviceGL.cpp
@@ -121,6 +121,7 @@
     std::unique_ptr<ContextEGL> context;
     DAWN_TRY_ASSIGN(context,
                     ContextEGL::Create(display, backendType, /*useRobustness*/ false,
+                                       /*disableEGL15Robustness */ false,
                                        /*useANGLETextureSharing*/ false,
                                        /*forceES31AndMinExtensions*/ forceES31AndMinExtensions));
 
@@ -526,11 +527,16 @@
     }
 
     bool useRobustness = !deviceToggles.IsEnabled(Toggle::DisableRobustness);
+
+    // Workaround: Imagination EGL 1.5 drivers do not support the new robustness enum.
+    // Use the pre-1.5 extension enum instead.
+    bool disableEGL15Robustness = mVendorId == gpu_info::kVendorID_ImgTec;
     bool forceES31AndMinExtensions = deviceToggles.IsEnabled(Toggle::GLForceES31AndNoExtensions);
 
     std::unique_ptr<ContextEGL> context;
     DAWN_TRY_ASSIGN(context, ContextEGL::Create(mDisplay, GetBackendType(), useRobustness,
-                                                useANGLETextureSharing, forceES31AndMinExtensions));
+                                                disableEGL15Robustness, useANGLETextureSharing,
+                                                forceES31AndMinExtensions));
 
     return Device::Create(adapter, descriptor, mFunctions, std::move(context), deviceToggles,
                           std::move(lostEvent));