Index: ui/gl/gl_image_io_surface.mm |
diff --git a/ui/gl/gl_image_io_surface.mm b/ui/gl/gl_image_io_surface.mm |
index 8e208301e57902cad93055c22c1eff6bcc0ef8f7..fc4df49f478ff007cbbfd681ce8c63cd8493582d 100644 |
--- a/ui/gl/gl_image_io_surface.mm |
+++ b/ui/gl/gl_image_io_surface.mm |
@@ -168,8 +168,9 @@ GLenum DataType(gfx::BufferFormat format) { |
} |
// When an IOSurface is bound to a texture with internalformat "GL_RGB", many |
-// OpenGL operations are broken. Therefore, never allow an IOSurface to be bound |
-// with GL_RGB. https://crbug.com/595948. |
+// OpenGL operations are broken. Therefore, don't allow an IOSurface to be bound |
+// with GL_RGB unless overridden via BindTexImageWithInternalformat. |
+// crbug.com/595948, crbug.com/699566. |
GLenum ConvertRequestedInternalFormat(GLenum internalformat) { |
if (internalformat == GL_RGB) |
return GL_RGBA; |
@@ -237,6 +238,11 @@ unsigned GLImageIOSurface::GetInternalFormat() { |
} |
bool GLImageIOSurface::BindTexImage(unsigned target) { |
+ return BindTexImageWithInternalformat(target, 0); |
+} |
+ |
+bool GLImageIOSurface::BindTexImageWithInternalformat(unsigned target, |
+ unsigned internalformat) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
TRACE_EVENT0("gpu", "GLImageIOSurface::BindTexImage"); |
base::TimeTicks start_time = base::TimeTicks::Now(); |
@@ -258,10 +264,12 @@ bool GLImageIOSurface::BindTexImage(unsigned target) { |
static_cast<CGLContextObj>(GLContext::GetCurrent()->GetHandle()); |
DCHECK(io_surface_); |
- CGLError cgl_error = |
- CGLTexImageIOSurface2D(cgl_context, target, TextureFormat(format_), |
- size_.width(), size_.height(), DataFormat(format_), |
- DataType(format_), io_surface_.get(), 0); |
+ |
+ GLenum texture_format = |
+ internalformat ? internalformat : TextureFormat(format_); |
+ CGLError cgl_error = CGLTexImageIOSurface2D( |
+ cgl_context, target, texture_format, size_.width(), size_.height(), |
+ DataFormat(format_), DataType(format_), io_surface_.get(), 0); |
if (cgl_error != kCGLNoError) { |
LOG(ERROR) << "Error in CGLTexImageIOSurface2D: " |
<< CGLErrorString(cgl_error); |