Index: ui/ozone/gl/gl_image_ozone_native_pixmap.cc |
diff --git a/ui/ozone/gl/gl_image_ozone_native_pixmap.cc b/ui/ozone/gl/gl_image_ozone_native_pixmap.cc |
index aafabef689f2bd2755a8bfa7e9c809984c800ee2..b3a6cbbaf7e01b7529bde70cf1b95caafb4adfcb 100644 |
--- a/ui/ozone/gl/gl_image_ozone_native_pixmap.cc |
+++ b/ui/ozone/gl/gl_image_ozone_native_pixmap.cc |
@@ -152,9 +152,9 @@ bool GLImageOzoneNativePixmap::Initialize(NativePixmap* pixmap, |
attrs.push_back(EGL_LINUX_DRM_FOURCC_EXT); |
attrs.push_back(FourCC(format)); |
- const EGLint kLinuxDrmModifiers[] = {EGL_LINUX_DRM_PLANE0_MODIFIER0_EXT, |
- EGL_LINUX_DRM_PLANE1_MODIFIER0_EXT, |
- EGL_LINUX_DRM_PLANE2_MODIFIER0_EXT}; |
+ const EGLint kLinuxDrmModifiers[] = {EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, |
+ EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, |
+ EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT}; |
bool has_dma_buf_import_modifier = gl::GLSurfaceEGL::HasEGLExtension( |
"EGL_EXT_image_dma_buf_import_modifiers"); |
@@ -186,6 +186,41 @@ bool GLImageOzoneNativePixmap::Initialize(NativePixmap* pixmap, |
if (!GLImageEGL::Initialize(EGL_LINUX_DMA_BUF_EXT, |
static_cast<EGLClientBuffer>(nullptr), |
&attrs[0])) { |
+ // TODO(hshi): remove this workaround after chrome uprevs and |
+ // corresponding driver updates are made. https://crosbug.com/p/58718 |
+ if (has_dma_buf_import_modifier) { |
+ // If driver rejects the new DMA-BUF import modifer tokens, then try |
+ // again with the old token definition. |
+ for (size_t i = 0; i < attrs.size(); i += 2) { |
+ switch (attrs[i]) { |
+ case EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT: |
+ attrs[i] = EGL_LINUX_DRM_PLANE0_MODIFIER0_EXT; |
+ break; |
+ case EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT: |
+ attrs[i] = EGL_LINUX_DRM_PLANE0_MODIFIER1_EXT; |
+ break; |
+ case EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT: |
+ attrs[i] = EGL_LINUX_DRM_PLANE1_MODIFIER0_EXT; |
+ break; |
+ case EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT: |
+ attrs[i] = EGL_LINUX_DRM_PLANE1_MODIFIER1_EXT; |
+ break; |
+ case EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT: |
+ attrs[i] = EGL_LINUX_DRM_PLANE2_MODIFIER0_EXT; |
+ break; |
+ case EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT: |
+ attrs[i] = EGL_LINUX_DRM_PLANE2_MODIFIER1_EXT; |
+ break; |
+ default: |
+ break; |
+ } |
+ if (!GLImageEGL::Initialize(EGL_LINUX_DMA_BUF_EXT, |
+ static_cast<EGLClientBuffer>(nullptr), |
+ &attrs[0])) { |
+ return false; |
+ } |
+ } |
+ } |
return false; |
} |
} |