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

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 2818493002: Revert of Fix broken draw/upload paths from videos to 2D canvas and WebGL. (Closed)
Patch Set: 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 4892 matching lines...) Expand 10 before | Expand all | Expand 10 after
4903 GLint internalformat, 4903 GLint internalformat,
4904 GLenum format, 4904 GLenum format,
4905 GLenum type, 4905 GLenum type,
4906 HTMLImageElement* image, 4906 HTMLImageElement* image,
4907 ExceptionState& exception_state) { 4907 ExceptionState& exception_state) {
4908 TexImageHelperHTMLImageElement(kTexImage2D, target, level, internalformat, 4908 TexImageHelperHTMLImageElement(kTexImage2D, target, level, internalformat,
4909 format, type, 0, 0, 0, image, 4909 format, type, 0, 0, 0, image,
4910 SentinelEmptyRect(), 1, 0, exception_state); 4910 SentinelEmptyRect(), 1, 0, exception_state);
4911 } 4911 }
4912 4912
4913 bool WebGLRenderingContextBase::CanUseTexImageByGPU(GLenum format, 4913 bool WebGLRenderingContextBase::CanUseTexImageByGPU(GLenum type) {
4914 GLenum type) {
4915 #if OS(MACOSX) 4914 #if OS(MACOSX)
4916 // RGB5_A1 is not color-renderable on NVIDIA Mac, see crbug.com/676209. 4915 // RGB5_A1 is not color-renderable on NVIDIA Mac, see crbug.com/676209.
4917 // Though, glCopyTextureCHROMIUM can handle RGB5_A1 internalformat by doing a 4916 // Though, glCopyTextureCHROMIUM can handle RGB5_A1 internalformat by doing a
4918 // fallback path, but it doesn't know the type info. So, we still cannot do 4917 // fallback path, but it doesn't know the type info. So, we still cannot do
4919 // the fallback path in glCopyTextureCHROMIUM for 4918 // the fallback path in glCopyTextureCHROMIUM for
4920 // RGBA/RGBA/UNSIGNED_SHORT_5_5_5_1 format and type combination. 4919 // RGBA/RGBA/UNSIGNED_SHORT_5_5_5_1 format and type combination.
4921 if (type == GL_UNSIGNED_SHORT_5_5_5_1) 4920 if (type == GL_UNSIGNED_SHORT_5_5_5_1)
4922 return false; 4921 return false;
4923 #endif 4922 #endif
4924 // TODO(kbr): bugs were observed when using CopyTextureCHROMIUM to
4925 // copy hardware-accelerated video textures to red-channel textures.
4926 // These bugs were seen on macOS but may indicate more general
4927 // problems. Investigate the root cause of this and fix it.
4928 // crbug.com/710673
4929 if (format == GL_RED || format == GL_RED_INTEGER)
4930 return false;
4931
4932 // OES_texture_half_float doesn't support HALF_FLOAT_OES type for 4923 // OES_texture_half_float doesn't support HALF_FLOAT_OES type for
4933 // CopyTexImage/CopyTexSubImage. And OES_texture_half_float doesn't require 4924 // CopyTexImage/CopyTexSubImage. And OES_texture_half_float doesn't require
4934 // HALF_FLOAT_OES type texture to be renderable. So, HALF_FLOAT_OES type 4925 // HALF_FLOAT_OES type texture to be renderable. So, HALF_FLOAT_OES type
4935 // texture cannot be copied to or drawn to by glCopyTextureCHROMIUM. 4926 // texture cannot be copied to or drawn to by glCopyTextureCHROMIUM.
4936 if (type == GL_HALF_FLOAT_OES) 4927 if (type == GL_HALF_FLOAT_OES)
4937 return false; 4928 return false;
4938 4929
4939 return true; 4930 return true;
4940 } 4931 }
4941 4932
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
5113 func_name, function_id, canvas, source_sub_rectangle, depth, 5104 func_name, function_id, canvas, source_sub_rectangle, depth,
5114 unpack_image_height, &selecting_sub_rectangle)) { 5105 unpack_image_height, &selecting_sub_rectangle)) {
5115 return; 5106 return;
5116 } 5107 }
5117 5108
5118 if (function_id == kTexImage2D || function_id == kTexSubImage2D) { 5109 if (function_id == kTexImage2D || function_id == kTexSubImage2D) {
5119 // texImageByGPU relies on copyTextureCHROMIUM which doesn't support 5110 // texImageByGPU relies on copyTextureCHROMIUM which doesn't support
5120 // float/integer/sRGB internal format. 5111 // float/integer/sRGB internal format.
5121 // TODO(crbug.com/622958): relax the constrains if copyTextureCHROMIUM is 5112 // TODO(crbug.com/622958): relax the constrains if copyTextureCHROMIUM is
5122 // upgraded to handle more formats. 5113 // upgraded to handle more formats.
5123 if (!canvas->IsAccelerated() || !CanUseTexImageByGPU(format, type)) { 5114 if (!canvas->IsAccelerated() || !CanUseTexImageByGPU(type)) {
5124 // 2D canvas has only FrontBuffer. 5115 // 2D canvas has only FrontBuffer.
5125 TexImageImpl(function_id, target, level, internalformat, xoffset, yoffset, 5116 TexImageImpl(function_id, target, level, internalformat, xoffset, yoffset,
5126 zoffset, format, type, 5117 zoffset, format, type,
5127 canvas 5118 canvas
5128 ->CopiedImage(kFrontBuffer, kPreferAcceleration, 5119 ->CopiedImage(kFrontBuffer, kPreferAcceleration,
5129 FunctionIDToSnapshotReason(function_id)) 5120 FunctionIDToSnapshotReason(function_id))
5130 .Get(), 5121 .Get(),
5131 WebGLImageConversion::kHtmlDomCanvas, unpack_flip_y_, 5122 WebGLImageConversion::kHtmlDomCanvas, unpack_flip_y_,
5132 unpack_premultiply_alpha_, source_sub_rectangle, 1, 0); 5123 unpack_premultiply_alpha_, source_sub_rectangle, 1, 0);
5133 return; 5124 return;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
5225 if (!ValidateTexFunc(func_name, function_type, kSourceHTMLVideoElement, 5216 if (!ValidateTexFunc(func_name, function_type, kSourceHTMLVideoElement,
5226 target, level, internalformat, video->videoWidth(), 5217 target, level, internalformat, video->videoWidth(),
5227 video->videoHeight(), 1, 0, format, type, xoffset, 5218 video->videoHeight(), 1, 0, format, type, xoffset,
5228 yoffset, zoffset)) 5219 yoffset, zoffset))
5229 return; 5220 return;
5230 5221
5231 bool source_image_rect_is_default = 5222 bool source_image_rect_is_default =
5232 source_image_rect == SentinelEmptyRect() || 5223 source_image_rect == SentinelEmptyRect() ||
5233 source_image_rect == 5224 source_image_rect ==
5234 IntRect(0, 0, video->videoWidth(), video->videoHeight()); 5225 IntRect(0, 0, video->videoWidth(), video->videoHeight());
5235 const bool use_copyTextureCHROMIUM = function_id == kTexImage2D && 5226 const bool use_copyTextureCHROMIUM =
5236 source_image_rect_is_default && 5227 function_id == kTexImage2D && source_image_rect_is_default &&
5237 depth == 1 && GL_TEXTURE_2D == target && 5228 depth == 1 && GL_TEXTURE_2D == target && CanUseTexImageByGPU(type);
5238 CanUseTexImageByGPU(format, type);
5239 // Format of source video may be 16-bit format, e.g. Y16 format. 5229 // Format of source video may be 16-bit format, e.g. Y16 format.
5240 // glCopyTextureCHROMIUM requires the source texture to be in 8-bit format. 5230 // glCopyTextureCHROMIUM requires the source texture to be in 8-bit format.
5241 // Converting 16-bits formated source texture to 8-bits formated texture will 5231 // Converting 16-bits formated source texture to 8-bits formated texture will
5242 // cause precision lost. So, uploading such video texture to half float or 5232 // cause precision lost. So, uploading such video texture to half float or
5243 // float texture can not use GPU-GPU path. 5233 // float texture can not use GPU-GPU path.
5244 if (use_copyTextureCHROMIUM) { 5234 if (use_copyTextureCHROMIUM) {
5245 DCHECK_EQ(xoffset, 0); 5235 DCHECK_EQ(xoffset, 0);
5246 DCHECK_EQ(yoffset, 0); 5236 DCHECK_EQ(yoffset, 0);
5247 DCHECK_EQ(zoffset, 0); 5237 DCHECK_EQ(zoffset, 0);
5248 // Go through the fast path doing a GPU-GPU textures copy without a readback 5238 // Go through the fast path doing a GPU-GPU textures copy without a readback
5249 // to system memory if possible. Otherwise, it will fall back to the normal 5239 // to system memory if possible. Otherwise, it will fall back to the normal
5250 // SW path. 5240 // SW path.
5251 5241
5252 if (video->CopyVideoTextureToPlatformTexture( 5242 // Note that neither
5253 ContextGL(), texture->Object(), internalformat, format, type, 5243 // HTMLVideoElement::copyVideoTextureToPlatformTexture nor
5254 unpack_premultiply_alpha_, unpack_flip_y_)) { 5244 // ImageBuffer::copyToPlatformTexture allocate the destination texture
5245 // any more.
5246 TexImage2DBase(target, level, internalformat, video->videoWidth(),
5247 video->videoHeight(), 0, format, type, nullptr);
5248
5249 if (video->CopyVideoTextureToPlatformTexture(ContextGL(), texture->Object(),
5250 unpack_premultiply_alpha_,
5251 unpack_flip_y_)) {
5255 texture->UpdateLastUploadedVideo(video->GetWebMediaPlayer()); 5252 texture->UpdateLastUploadedVideo(video->GetWebMediaPlayer());
5256 return; 5253 return;
5257 } 5254 }
5258 } 5255 }
5259 5256
5260 if (source_image_rect_is_default) { 5257 if (source_image_rect_is_default) {
5261 // Try using optimized CPU-GPU path for some formats: e.g. Y16 and Y8. It 5258 // Try using optimized CPU-GPU path for some formats: e.g. Y16 and Y8. It
5262 // leaves early for other formats or if frame is stored on GPU. 5259 // leaves early for other formats or if frame is stored on GPU.
5263 ScopedUnpackParametersResetRestore( 5260 ScopedUnpackParametersResetRestore(
5264 this, unpack_flip_y_ || unpack_premultiply_alpha_); 5261 this, unpack_flip_y_ || unpack_premultiply_alpha_);
(...skipping 23 matching lines...) Expand all
5288 // using an AcceleratedImageBufferSurface, we enable the WebMediaPlayer 5285 // using an AcceleratedImageBufferSurface, we enable the WebMediaPlayer
5289 // implementation to do any necessary color space conversion on the GPU 5286 // implementation to do any necessary color space conversion on the GPU
5290 // (though it may still do a CPU conversion and upload the results). 5287 // (though it may still do a CPU conversion and upload the results).
5291 video->PaintCurrentFrame( 5288 video->PaintCurrentFrame(
5292 image_buffer->Canvas(), 5289 image_buffer->Canvas(),
5293 IntRect(0, 0, video->videoWidth(), video->videoHeight()), nullptr); 5290 IntRect(0, 0, video->videoWidth(), video->videoHeight()), nullptr);
5294 5291
5295 // This is a straight GPU-GPU copy, any necessary color space conversion 5292 // This is a straight GPU-GPU copy, any necessary color space conversion
5296 // was handled in the paintCurrentFrameInContext() call. 5293 // was handled in the paintCurrentFrameInContext() call.
5297 5294
5298 // Note that copyToPlatformTexture no longer allocates the destination
5299 // texture.
5300 TexImage2DBase(target, level, internalformat, video->videoWidth(),
5301 video->videoHeight(), 0, format, type, nullptr);
5302
5303 if (image_buffer->CopyToPlatformTexture( 5295 if (image_buffer->CopyToPlatformTexture(
5304 FunctionIDToSnapshotReason(function_id), ContextGL(), target, 5296 FunctionIDToSnapshotReason(function_id), ContextGL(), target,
5305 texture->Object(), unpack_premultiply_alpha_, unpack_flip_y_, 5297 texture->Object(), unpack_premultiply_alpha_, unpack_flip_y_,
5306 IntPoint(0, 0), 5298 IntPoint(0, 0),
5307 IntRect(0, 0, video->videoWidth(), video->videoHeight()))) { 5299 IntRect(0, 0, video->videoWidth(), video->videoHeight()))) {
5308 texture->UpdateLastUploadedVideo(video->GetWebMediaPlayer()); 5300 texture->UpdateLastUploadedVideo(video->GetWebMediaPlayer());
5309 return; 5301 return;
5310 } 5302 }
5311 } 5303 }
5312 } 5304 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
5389 GLsizei width = source_sub_rect.Width(); 5381 GLsizei width = source_sub_rect.Width();
5390 GLsizei height = source_sub_rect.Height(); 5382 GLsizei height = source_sub_rect.Height();
5391 if (!ValidateTexFunc(func_name, function_type, kSourceImageBitmap, target, 5383 if (!ValidateTexFunc(func_name, function_type, kSourceImageBitmap, target,
5392 level, internalformat, width, height, depth, 0, format, 5384 level, internalformat, width, height, depth, 0, format,
5393 type, xoffset, yoffset, zoffset)) 5385 type, xoffset, yoffset, zoffset))
5394 return; 5386 return;
5395 ASSERT(bitmap->BitmapImage()); 5387 ASSERT(bitmap->BitmapImage());
5396 5388
5397 // TODO(kbr): make this work for sub-rectangles of ImageBitmaps. 5389 // TODO(kbr): make this work for sub-rectangles of ImageBitmaps.
5398 if (function_id != kTexSubImage3D && function_id != kTexImage3D && 5390 if (function_id != kTexSubImage3D && function_id != kTexImage3D &&
5399 bitmap->IsAccelerated() && CanUseTexImageByGPU(format, type) && 5391 bitmap->IsAccelerated() && CanUseTexImageByGPU(type) &&
5400 !selecting_sub_rectangle) { 5392 !selecting_sub_rectangle) {
5401 if (function_id == kTexImage2D) { 5393 if (function_id == kTexImage2D) {
5402 TexImage2DBase(target, level, internalformat, width, height, 0, format, 5394 TexImage2DBase(target, level, internalformat, width, height, 0, format,
5403 type, 0); 5395 type, 0);
5404 TexImageByGPU(function_id, texture, target, level, 0, 0, 0, bitmap, 5396 TexImageByGPU(function_id, texture, target, level, 0, 0, 0, bitmap,
5405 source_sub_rect); 5397 source_sub_rect);
5406 } else if (function_id == kTexSubImage2D) { 5398 } else if (function_id == kTexSubImage2D) {
5407 TexImageByGPU(function_id, texture, target, level, xoffset, yoffset, 0, 5399 TexImageByGPU(function_id, texture, target, level, xoffset, yoffset, 0,
5408 bitmap, source_sub_rect); 5400 bitmap, source_sub_rect);
5409 } 5401 }
(...skipping 2405 matching lines...) Expand 10 before | Expand all | Expand 10 after
7815 7807
7816 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( 7808 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas(
7817 HTMLCanvasElementOrOffscreenCanvas& result) const { 7809 HTMLCanvasElementOrOffscreenCanvas& result) const {
7818 if (canvas()) 7810 if (canvas())
7819 result.setHTMLCanvasElement(canvas()); 7811 result.setHTMLCanvasElement(canvas());
7820 else 7812 else
7821 result.setOffscreenCanvas(offscreenCanvas()); 7813 result.setOffscreenCanvas(offscreenCanvas());
7822 } 7814 }
7823 7815
7824 } // namespace blink 7816 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698