Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(904)

Unified Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 2791813003: Fix broken draw/upload paths from videos to 2D canvas and WebGL. (Closed)
Patch Set: Disable GPU-GPU copies to floating-point textures on Android. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index 25e62838c454564dd4d99cbb80b71d27b80d7046..6c0a8b6537ac20295d740cc0e921ddfca33bc729 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -4915,7 +4915,8 @@ void WebGLRenderingContextBase::texImage2D(GLenum target,
SentinelEmptyRect(), 1, 0, exception_state);
}
-bool WebGLRenderingContextBase::CanUseTexImageByGPU(GLenum type) {
+bool WebGLRenderingContextBase::CanUseTexImageByGPU(GLenum format,
+ GLenum type) {
#if OS(MACOSX)
// RGB5_A1 is not color-renderable on NVIDIA Mac, see crbug.com/676209.
// Though, glCopyTextureCHROMIUM can handle RGB5_A1 internalformat by doing a
@@ -4925,6 +4926,23 @@ bool WebGLRenderingContextBase::CanUseTexImageByGPU(GLenum type) {
if (type == GL_UNSIGNED_SHORT_5_5_5_1)
return false;
#endif
+ // TODO(kbr): bugs were observed when using CopyTextureCHROMIUM to
+ // copy hardware-accelerated video textures to red-channel textures.
+ // These bugs were seen on macOS but may indicate more general
+ // problems. Investigate the root cause of this and fix it.
+ // crbug.com/710673
+ if (format == GL_RED || format == GL_RED_INTEGER)
+ return false;
+
+#if OS(ANDROID)
+ // TODO(kbr): bugs were seen on Android devices with NVIDIA GPUs
+ // when copying hardware-accelerated video textures to
+ // floating-point textures. Investigate the root cause of this and
+ // fix it. crbug.com/710874
+ if (type == GL_FLOAT)
+ return false;
+#endif
+
// OES_texture_half_float doesn't support HALF_FLOAT_OES type for
// CopyTexImage/CopyTexSubImage. And OES_texture_half_float doesn't require
// HALF_FLOAT_OES type texture to be renderable. So, HALF_FLOAT_OES type
@@ -5116,7 +5134,7 @@ void WebGLRenderingContextBase::TexImageHelperHTMLCanvasElement(
// float/integer/sRGB internal format.
// TODO(crbug.com/622958): relax the constrains if copyTextureCHROMIUM is
// upgraded to handle more formats.
- if (!canvas->IsAccelerated() || !CanUseTexImageByGPU(type)) {
+ if (!canvas->IsAccelerated() || !CanUseTexImageByGPU(format, type)) {
// 2D canvas has only FrontBuffer.
TexImageImpl(function_id, target, level, internalformat, xoffset, yoffset,
zoffset, format, type,
@@ -5228,9 +5246,10 @@ void WebGLRenderingContextBase::TexImageHelperHTMLVideoElement(
source_image_rect == SentinelEmptyRect() ||
source_image_rect ==
IntRect(0, 0, video->videoWidth(), video->videoHeight());
- const bool use_copyTextureCHROMIUM =
- function_id == kTexImage2D && source_image_rect_is_default &&
- depth == 1 && GL_TEXTURE_2D == target && CanUseTexImageByGPU(type);
+ const bool use_copyTextureCHROMIUM = function_id == kTexImage2D &&
+ source_image_rect_is_default &&
+ depth == 1 && GL_TEXTURE_2D == target &&
+ CanUseTexImageByGPU(format, type);
// Format of source video may be 16-bit format, e.g. Y16 format.
// glCopyTextureCHROMIUM requires the source texture to be in 8-bit format.
// Converting 16-bits formated source texture to 8-bits formated texture will
@@ -5244,16 +5263,9 @@ void WebGLRenderingContextBase::TexImageHelperHTMLVideoElement(
// to system memory if possible. Otherwise, it will fall back to the normal
// SW path.
- // Note that neither
- // HTMLVideoElement::copyVideoTextureToPlatformTexture nor
- // ImageBuffer::copyToPlatformTexture allocate the destination texture
- // any more.
- TexImage2DBase(target, level, internalformat, video->videoWidth(),
- video->videoHeight(), 0, format, type, nullptr);
-
- if (video->CopyVideoTextureToPlatformTexture(ContextGL(), texture->Object(),
- unpack_premultiply_alpha_,
- unpack_flip_y_)) {
+ if (video->CopyVideoTextureToPlatformTexture(
+ ContextGL(), texture->Object(), internalformat, format, type,
+ unpack_premultiply_alpha_, unpack_flip_y_)) {
texture->UpdateLastUploadedVideo(video->GetWebMediaPlayer());
return;
}
@@ -5297,6 +5309,11 @@ void WebGLRenderingContextBase::TexImageHelperHTMLVideoElement(
// This is a straight GPU-GPU copy, any necessary color space conversion
// was handled in the paintCurrentFrameInContext() call.
+ // Note that copyToPlatformTexture no longer allocates the destination
+ // texture.
+ TexImage2DBase(target, level, internalformat, video->videoWidth(),
+ video->videoHeight(), 0, format, type, nullptr);
+
if (image_buffer->CopyToPlatformTexture(
FunctionIDToSnapshotReason(function_id), ContextGL(), target,
texture->Object(), unpack_premultiply_alpha_, unpack_flip_y_,
@@ -5393,7 +5410,7 @@ void WebGLRenderingContextBase::TexImageHelperImageBitmap(
// TODO(kbr): make this work for sub-rectangles of ImageBitmaps.
if (function_id != kTexSubImage3D && function_id != kTexImage3D &&
- bitmap->IsAccelerated() && CanUseTexImageByGPU(type) &&
+ bitmap->IsAccelerated() && CanUseTexImageByGPU(format, type) &&
!selecting_sub_rectangle) {
if (function_id == kTexImage2D) {
TexImage2DBase(target, level, internalformat, width, height, 0, format,

Powered by Google App Engine
This is Rietveld 408576698