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

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

Issue 2557783002: Improve metrics for display list canvas fallback reason (Closed)
Patch Set: Created 4 years 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 4844 matching lines...) Expand 10 before | Expand all | Expand 10 after
4855 // TODO(crbug.com/622958): Implement GPU-to-GPU path for WebGL 2 and more 4855 // TODO(crbug.com/622958): Implement GPU-to-GPU path for WebGL 2 and more
4856 // internal formats. 4856 // internal formats.
4857 if (functionID == TexSubImage2D && 4857 if (functionID == TexSubImage2D &&
4858 (isWebGL2OrHigher() || extensionEnabled(OESTextureFloatName) || 4858 (isWebGL2OrHigher() || extensionEnabled(OESTextureFloatName) ||
4859 extensionEnabled(OESTextureHalfFloatName) || 4859 extensionEnabled(OESTextureHalfFloatName) ||
4860 extensionEnabled(EXTsRGBName))) 4860 extensionEnabled(EXTsRGBName)))
4861 return false; 4861 return false;
4862 return true; 4862 return true;
4863 } 4863 }
4864 4864
4865 SnapshotReason WebGLRenderingContextBase::functionIDToSnapshotReason(
4866 TexImageFunctionID id) {
4867 switch (id) {
4868 case TexImage2D:
4869 return SnapshotReasonWebGLTexImage2D;
4870 case TexSubImage2D:
4871 return SnapshotReasonWebGLTexSubImage2D;
4872 case TexImage3D:
4873 return SnapshotReasonWebGLTexImage3D;
4874 case TexSubImage3D:
4875 return SnapshotReasonWebGLTexSubImage3D;
4876 }
4877 NOTREACHED();
4878 return SnapshotReasonUnknown;
4879 }
4880
4865 void WebGLRenderingContextBase::texImageCanvasByGPU( 4881 void WebGLRenderingContextBase::texImageCanvasByGPU(
4882 TexImageFunctionID functionID,
4866 HTMLCanvasElement* canvas, 4883 HTMLCanvasElement* canvas,
4867 GLuint targetTexture, 4884 GLuint targetTexture,
4868 GLenum targetInternalformat, 4885 GLenum targetInternalformat,
4869 GLenum targetType, 4886 GLenum targetType,
4870 GLint targetLevel, 4887 GLint targetLevel,
4871 GLint xoffset, 4888 GLint xoffset,
4872 GLint yoffset, 4889 GLint yoffset,
4873 const IntRect& sourceSubRectangle) { 4890 const IntRect& sourceSubRectangle) {
4874 if (!canvas->is3D()) { 4891 if (!canvas->is3D()) {
4875 ImageBuffer* buffer = canvas->buffer(); 4892 ImageBuffer* buffer = canvas->buffer();
4876 if (buffer && 4893 if (buffer &&
4877 !buffer->copyToPlatformTexture( 4894 !buffer->copyToPlatformTexture(
4878 contextGL(), targetTexture, targetInternalformat, targetType, 4895 functionIDToSnapshotReason(functionID), contextGL(), targetTexture,
4879 targetLevel, m_unpackPremultiplyAlpha, m_unpackFlipY, 4896 targetInternalformat, targetType, targetLevel,
4880 IntPoint(xoffset, yoffset), sourceSubRectangle)) { 4897 m_unpackPremultiplyAlpha, m_unpackFlipY, IntPoint(xoffset, yoffset),
4898 sourceSubRectangle)) {
4881 NOTREACHED(); 4899 NOTREACHED();
4882 } 4900 }
4883 } else { 4901 } else {
4884 WebGLRenderingContextBase* gl = 4902 WebGLRenderingContextBase* gl =
4885 toWebGLRenderingContextBase(canvas->renderingContext()); 4903 toWebGLRenderingContextBase(canvas->renderingContext());
4886 ScopedTexture2DRestorer restorer(gl); 4904 ScopedTexture2DRestorer restorer(gl);
4887 if (!gl->drawingBuffer()->copyToPlatformTexture( 4905 if (!gl->drawingBuffer()->copyToPlatformTexture(
4888 contextGL(), targetTexture, targetInternalformat, targetType, 4906 contextGL(), targetTexture, targetInternalformat, targetType,
4889 targetLevel, m_unpackPremultiplyAlpha, !m_unpackFlipY, 4907 targetLevel, m_unpackPremultiplyAlpha, !m_unpackFlipY,
4890 IntPoint(xoffset, yoffset), sourceSubRectangle, BackBuffer)) { 4908 IntPoint(xoffset, yoffset), sourceSubRectangle, BackBuffer)) {
4891 NOTREACHED(); 4909 NOTREACHED();
4892 } 4910 }
4893 } 4911 }
4894 } 4912 }
4895 4913
4896 void WebGLRenderingContextBase::texImageByGPU( 4914 void WebGLRenderingContextBase::texImageByGPU(
4897 TexImageByGPUType functionType, 4915 TexImageFunctionID functionID,
4898 WebGLTexture* texture, 4916 WebGLTexture* texture,
4899 GLenum target, 4917 GLenum target,
4900 GLint level, 4918 GLint level,
4901 GLint internalformat, 4919 GLint internalformat,
4902 GLenum type, 4920 GLenum type,
4903 GLint xoffset, 4921 GLint xoffset,
4904 GLint yoffset, 4922 GLint yoffset,
4905 GLint zoffset, 4923 GLint zoffset,
4906 CanvasImageSource* image, 4924 CanvasImageSource* image,
4907 const IntRect& sourceSubRectangle) { 4925 const IntRect& sourceSubRectangle) {
4908 DCHECK(image->isCanvasElement() || image->isImageBitmap()); 4926 DCHECK(image->isCanvasElement() || image->isImageBitmap());
4909 int width = sourceSubRectangle.width(); 4927 int width = sourceSubRectangle.width();
4910 int height = sourceSubRectangle.height(); 4928 int height = sourceSubRectangle.height();
4911 4929
4912 ScopedTexture2DRestorer restorer(this); 4930 ScopedTexture2DRestorer restorer(this);
4913 4931
4914 GLuint targetTexture = texture->object(); 4932 GLuint targetTexture = texture->object();
4915 GLenum targetType = type; 4933 GLenum targetType = type;
4916 GLenum targetInternalformat = internalformat; 4934 GLenum targetInternalformat = internalformat;
4917 GLint targetLevel = level; 4935 GLint targetLevel = level;
4918 bool possibleDirectCopy = false; 4936 bool possibleDirectCopy = false;
4919 if (functionType == TexImage2DByGPU) { 4937 if (functionID == TexImage2D) {
4920 possibleDirectCopy = Extensions3DUtil::canUseCopyTextureCHROMIUM( 4938 possibleDirectCopy = Extensions3DUtil::canUseCopyTextureCHROMIUM(
4921 target, internalformat, type, level); 4939 target, internalformat, type, level);
4922 } 4940 }
4923 4941
4924 GLint copyXOffset = xoffset; 4942 GLint copyXOffset = xoffset;
4925 GLint copyYOffset = yoffset; 4943 GLint copyYOffset = yoffset;
4926 4944
4927 // if direct copy is not possible, create a temporary texture and then copy 4945 // if direct copy is not possible, create a temporary texture and then copy
4928 // from canvas to temporary texture to target texture. 4946 // from canvas to temporary texture to target texture.
4929 if (!possibleDirectCopy) { 4947 if (!possibleDirectCopy) {
(...skipping 10 matching lines...) Expand all
4940 GL_CLAMP_TO_EDGE); 4958 GL_CLAMP_TO_EDGE);
4941 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 4959 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
4942 GL_CLAMP_TO_EDGE); 4960 GL_CLAMP_TO_EDGE);
4943 contextGL()->TexImage2D(GL_TEXTURE_2D, 0, targetInternalformat, width, 4961 contextGL()->TexImage2D(GL_TEXTURE_2D, 0, targetInternalformat, width,
4944 height, 0, GL_RGBA, targetType, 0); 4962 height, 0, GL_RGBA, targetType, 0);
4945 copyXOffset = 0; 4963 copyXOffset = 0;
4946 copyYOffset = 0; 4964 copyYOffset = 0;
4947 } 4965 }
4948 4966
4949 if (image->isCanvasElement()) { 4967 if (image->isCanvasElement()) {
4950 texImageCanvasByGPU(static_cast<HTMLCanvasElement*>(image), targetTexture, 4968 texImageCanvasByGPU(functionID, static_cast<HTMLCanvasElement*>(image),
4951 targetInternalformat, targetType, targetLevel, 4969 targetTexture, targetInternalformat, targetType,
4952 copyXOffset, copyYOffset, sourceSubRectangle); 4970 targetLevel, copyXOffset, copyYOffset,
4971 sourceSubRectangle);
4953 } else { 4972 } else {
4954 texImageBitmapByGPU(static_cast<ImageBitmap*>(image), targetTexture, 4973 texImageBitmapByGPU(static_cast<ImageBitmap*>(image), targetTexture,
4955 targetInternalformat, targetType, targetLevel, 4974 targetInternalformat, targetType, targetLevel,
4956 !m_unpackFlipY); 4975 !m_unpackFlipY);
4957 } 4976 }
4958 4977
4959 if (!possibleDirectCopy) { 4978 if (!possibleDirectCopy) {
4960 GLuint tmpFBO; 4979 GLuint tmpFBO;
4961 contextGL()->GenFramebuffers(1, &tmpFBO); 4980 contextGL()->GenFramebuffers(1, &tmpFBO);
4962 contextGL()->BindFramebuffer(GL_FRAMEBUFFER, tmpFBO); 4981 contextGL()->BindFramebuffer(GL_FRAMEBUFFER, tmpFBO);
4963 contextGL()->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 4982 contextGL()->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
4964 GL_TEXTURE_2D, targetTexture, 0); 4983 GL_TEXTURE_2D, targetTexture, 0);
4965 contextGL()->BindTexture(texture->getTarget(), texture->object()); 4984 contextGL()->BindTexture(texture->getTarget(), texture->object());
4966 if (functionType == TexImage2DByGPU) { 4985 if (functionID == TexImage2D) {
4967 contextGL()->CopyTexSubImage2D(target, level, 0, 0, 0, 0, width, height); 4986 contextGL()->CopyTexSubImage2D(target, level, 0, 0, 0, 0, width, height);
4968 } else if (functionType == TexSubImage2DByGPU) { 4987 } else if (functionID == TexSubImage2D) {
4969 contextGL()->CopyTexSubImage2D(target, level, xoffset, yoffset, 0, 0, 4988 contextGL()->CopyTexSubImage2D(target, level, xoffset, yoffset, 0, 0,
4970 width, height); 4989 width, height);
4971 } else if (functionType == TexSubImage3DByGPU) { 4990 } else if (functionID == TexSubImage3D) {
4972 contextGL()->CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, 4991 contextGL()->CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset,
4973 0, 0, width, height); 4992 0, 0, width, height);
4974 } 4993 }
4975 contextGL()->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 4994 contextGL()->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
4976 GL_TEXTURE_2D, 0, 0); 4995 GL_TEXTURE_2D, 0, 0);
4977 restoreCurrentFramebuffer(); 4996 restoreCurrentFramebuffer();
4978 contextGL()->DeleteFramebuffers(1, &tmpFBO); 4997 contextGL()->DeleteFramebuffers(1, &tmpFBO);
4979 contextGL()->DeleteTextures(1, &targetTexture); 4998 contextGL()->DeleteTextures(1, &targetTexture);
4980 } 4999 }
4981 } 5000 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
5027 // texImageByGPU relies on copyTextureCHROMIUM which doesn't support 5046 // texImageByGPU relies on copyTextureCHROMIUM which doesn't support
5028 // float/integer/sRGB internal format. 5047 // float/integer/sRGB internal format.
5029 // TODO(crbug.com/622958): relax the constrains if copyTextureCHROMIUM is 5048 // TODO(crbug.com/622958): relax the constrains if copyTextureCHROMIUM is
5030 // upgraded to handle more formats. 5049 // upgraded to handle more formats.
5031 if (!canvas->renderingContext() || 5050 if (!canvas->renderingContext() ||
5032 !canvas->renderingContext()->isAccelerated() || 5051 !canvas->renderingContext()->isAccelerated() ||
5033 !canUseTexImageByGPU(functionID, internalformat, type)) { 5052 !canUseTexImageByGPU(functionID, internalformat, type)) {
5034 // 2D canvas has only FrontBuffer. 5053 // 2D canvas has only FrontBuffer.
5035 texImageImpl(functionID, target, level, internalformat, xoffset, yoffset, 5054 texImageImpl(functionID, target, level, internalformat, xoffset, yoffset,
5036 zoffset, format, type, 5055 zoffset, format, type,
5037 canvas->copiedImage(FrontBuffer, PreferAcceleration).get(), 5056 canvas
5057 ->copiedImage(FrontBuffer, PreferAcceleration,
5058 functionIDToSnapshotReason(functionID))
5059 .get(),
5038 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, 5060 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY,
5039 m_unpackPremultiplyAlpha, sourceSubRectangle, 1, 0); 5061 m_unpackPremultiplyAlpha, sourceSubRectangle, 1, 0);
5040 return; 5062 return;
5041 } 5063 }
5042 5064
5043 // The GPU-GPU copy path uses the Y-up coordinate system. 5065 // The GPU-GPU copy path uses the Y-up coordinate system.
5044 IntRect adjustedSourceSubRectangle = sourceSubRectangle; 5066 IntRect adjustedSourceSubRectangle = sourceSubRectangle;
5045 if (!m_unpackFlipY) { 5067 if (!m_unpackFlipY) {
5046 adjustedSourceSubRectangle.setY(canvas->height() - 5068 adjustedSourceSubRectangle.setY(canvas->height() -
5047 adjustedSourceSubRectangle.maxY()); 5069 adjustedSourceSubRectangle.maxY());
5048 } 5070 }
5049 5071
5050 if (functionID == TexImage2D) { 5072 if (functionID == TexImage2D) {
5051 texImage2DBase(target, level, internalformat, sourceSubRectangle.width(), 5073 texImage2DBase(target, level, internalformat, sourceSubRectangle.width(),
5052 sourceSubRectangle.height(), 0, format, type, 0); 5074 sourceSubRectangle.height(), 0, format, type, 0);
5053 texImageByGPU(TexImage2DByGPU, texture, target, level, internalformat, 5075 texImageByGPU(functionID, texture, target, level, internalformat, type, 0,
5054 type, 0, 0, 0, canvas, adjustedSourceSubRectangle); 5076 0, 0, canvas, adjustedSourceSubRectangle);
5055 } else { 5077 } else {
5056 texImageByGPU(TexSubImage2DByGPU, texture, target, level, GL_RGBA, type, 5078 texImageByGPU(functionID, texture, target, level, GL_RGBA, type, xoffset,
5057 xoffset, yoffset, 0, canvas, adjustedSourceSubRectangle); 5079 yoffset, 0, canvas, adjustedSourceSubRectangle);
5058 } 5080 }
5059 } else { 5081 } else {
5060 // 3D functions. 5082 // 3D functions.
5061 5083
5062 // TODO(zmo): Implement GPU-to-GPU copy path (crbug.com/612542). 5084 // TODO(zmo): Implement GPU-to-GPU copy path (crbug.com/612542).
5063 // Note that code will also be needed to copy to layers of 3D 5085 // Note that code will also be needed to copy to layers of 3D
5064 // textures, and elements of 2D texture arrays. 5086 // textures, and elements of 2D texture arrays.
5065 texImageImpl(functionID, target, level, internalformat, xoffset, yoffset, 5087 texImageImpl(
5066 zoffset, format, type, 5088 functionID, target, level, internalformat, xoffset, yoffset, zoffset,
5067 canvas->copiedImage(FrontBuffer, PreferAcceleration).get(), 5089 format, type, canvas
5068 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, 5090 ->copiedImage(FrontBuffer, PreferAcceleration,
5069 m_unpackPremultiplyAlpha, sourceSubRectangle, depth, 5091 functionIDToSnapshotReason(functionID))
5070 unpackImageHeight); 5092 .get(),
5093 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY,
5094 m_unpackPremultiplyAlpha, sourceSubRectangle, depth, unpackImageHeight);
5071 } 5095 }
5072 } 5096 }
5073 5097
5074 void WebGLRenderingContextBase::texImage2D(GLenum target, 5098 void WebGLRenderingContextBase::texImage2D(GLenum target,
5075 GLint level, 5099 GLint level,
5076 GLint internalformat, 5100 GLint internalformat,
5077 GLenum format, 5101 GLenum format,
5078 GLenum type, 5102 GLenum type,
5079 HTMLCanvasElement* canvas, 5103 HTMLCanvasElement* canvas,
5080 ExceptionState& exceptionState) { 5104 ExceptionState& exceptionState) {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
5168 5192
5169 // This is a straight GPU-GPU copy, any necessary color space conversion 5193 // This is a straight GPU-GPU copy, any necessary color space conversion
5170 // was handled in the paintCurrentFrameInContext() call. 5194 // was handled in the paintCurrentFrameInContext() call.
5171 5195
5172 // Note that copyToPlatformTexture no longer allocates the destination 5196 // Note that copyToPlatformTexture no longer allocates the destination
5173 // texture. 5197 // texture.
5174 texImage2DBase(target, level, internalformat, video->videoWidth(), 5198 texImage2DBase(target, level, internalformat, video->videoWidth(),
5175 video->videoHeight(), 0, format, type, nullptr); 5199 video->videoHeight(), 0, format, type, nullptr);
5176 5200
5177 if (imageBuffer->copyToPlatformTexture( 5201 if (imageBuffer->copyToPlatformTexture(
5178 contextGL(), texture->object(), internalformat, type, level, 5202 functionIDToSnapshotReason(functionID), contextGL(),
5203 texture->object(), internalformat, type, level,
5179 m_unpackPremultiplyAlpha, m_unpackFlipY, IntPoint(0, 0), 5204 m_unpackPremultiplyAlpha, m_unpackFlipY, IntPoint(0, 0),
5180 IntRect(0, 0, video->videoWidth(), video->videoHeight()))) { 5205 IntRect(0, 0, video->videoWidth(), video->videoHeight()))) {
5181 return; 5206 return;
5182 } 5207 }
5183 } 5208 }
5184 } 5209 }
5185 } 5210 }
5186 5211
5187 if (sourceImageRectIsDefault) { 5212 if (sourceImageRectIsDefault) {
5188 // Try using optimized CPU-GPU path for some formats: e.g. Y16 and Y8. It 5213 // Try using optimized CPU-GPU path for some formats: e.g. Y16 and Y8. It
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
5277 ASSERT(bitmap->bitmapImage()); 5302 ASSERT(bitmap->bitmapImage());
5278 5303
5279 // TODO(kbr): make this work for sub-rectangles of ImageBitmaps. 5304 // TODO(kbr): make this work for sub-rectangles of ImageBitmaps.
5280 if (functionID != TexSubImage3D && functionID != TexImage3D && 5305 if (functionID != TexSubImage3D && functionID != TexImage3D &&
5281 bitmap->isAccelerated() && 5306 bitmap->isAccelerated() &&
5282 canUseTexImageByGPU(functionID, internalformat, type) && 5307 canUseTexImageByGPU(functionID, internalformat, type) &&
5283 !selectingSubRectangle) { 5308 !selectingSubRectangle) {
5284 if (functionID == TexImage2D) { 5309 if (functionID == TexImage2D) {
5285 texImage2DBase(target, level, internalformat, width, height, 0, format, 5310 texImage2DBase(target, level, internalformat, width, height, 0, format,
5286 type, 0); 5311 type, 0);
5287 texImageByGPU(TexImage2DByGPU, texture, target, level, internalformat, 5312 texImageByGPU(functionID, texture, target, level, internalformat, type, 0,
5288 type, 0, 0, 0, bitmap, sourceSubRect); 5313 0, 0, bitmap, sourceSubRect);
5289 } else if (functionID == TexSubImage2D) { 5314 } else if (functionID == TexSubImage2D) {
5290 texImageByGPU(TexSubImage2DByGPU, texture, target, level, GL_RGBA, type, 5315 texImageByGPU(functionID, texture, target, level, GL_RGBA, type, xoffset,
5291 xoffset, yoffset, 0, bitmap, sourceSubRect); 5316 yoffset, 0, bitmap, sourceSubRect);
5292 } 5317 }
5293 return; 5318 return;
5294 } 5319 }
5295 sk_sp<SkImage> skImage = bitmap->bitmapImage()->imageForCurrentFrame(); 5320 sk_sp<SkImage> skImage = bitmap->bitmapImage()->imageForCurrentFrame();
5296 SkPixmap pixmap; 5321 SkPixmap pixmap;
5297 uint8_t* pixelDataPtr = nullptr; 5322 uint8_t* pixelDataPtr = nullptr;
5298 RefPtr<Uint8Array> pixelData; 5323 RefPtr<Uint8Array> pixelData;
5299 // In the case where an ImageBitmap is not texture backed, peekPixels() always 5324 // In the case where an ImageBitmap is not texture backed, peekPixels() always
5300 // succeed. However, when it is texture backed and !canUseTexImageByGPU, we 5325 // succeed. However, when it is texture backed and !canUseTexImageByGPU, we
5301 // do a GPU read back. 5326 // do a GPU read back.
(...skipping 2441 matching lines...) Expand 10 before | Expand all | Expand 10 after
7743 7768
7744 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( 7769 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas(
7745 HTMLCanvasElementOrOffscreenCanvas& result) const { 7770 HTMLCanvasElementOrOffscreenCanvas& result) const {
7746 if (canvas()) 7771 if (canvas())
7747 result.setHTMLCanvasElement(canvas()); 7772 result.setHTMLCanvasElement(canvas());
7748 else 7773 else
7749 result.setOffscreenCanvas(getOffscreenCanvas()); 7774 result.setOffscreenCanvas(getOffscreenCanvas());
7750 } 7775 }
7751 7776
7752 } // namespace blink 7777 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698