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));