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

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

Issue 2121043002: 16 bpp video stream capture, render and WebGL usage - Realsense R200 & SR300 support. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tests: cc, skcanvas_video_renderer, wrtcrecorder... Fake capture supports Y16. Created 4 years, 2 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 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 508
509 ~ScopedFramebufferRestorer() 509 ~ScopedFramebufferRestorer()
510 { 510 {
511 m_context->restoreCurrentFramebuffer(); 511 m_context->restoreCurrentFramebuffer();
512 } 512 }
513 513
514 private: 514 private:
515 Member<WebGLRenderingContextBase> m_context; 515 Member<WebGLRenderingContextBase> m_context;
516 }; 516 };
517 517
518 class ScopedUnpackParametersResetRestore {
519 STACK_ALLOCATED();
520
521 public:
522 explicit ScopedUnpackParametersResetRestore(WebGLRenderingContextBase* conte xt, bool enabled = true)
523 : m_context(context)
524 , m_enabled(enabled)
525 {
526 if (enabled)
527 m_context->resetUnpackParameters();
528 }
529
530 ~ScopedUnpackParametersResetRestore()
531 {
532 if (m_enabled)
533 m_context->restoreUnpackParameters();
534 }
535
536 private:
537 Member<WebGLRenderingContextBase> m_context;
538 bool m_enabled;
539 };
540
518 static void formatWebGLStatusString(const StringView& glInfo, const StringView& infoString, StringBuilder& builder) 541 static void formatWebGLStatusString(const StringView& glInfo, const StringView& infoString, StringBuilder& builder)
519 { 542 {
520 if (infoString.isEmpty()) 543 if (infoString.isEmpty())
521 return; 544 return;
522 builder.append(", "); 545 builder.append(", ");
523 builder.append(glInfo); 546 builder.append(glInfo);
524 builder.append(" = "); 547 builder.append(" = ");
525 builder.append(infoString); 548 builder.append(infoString);
526 } 549 }
527 550
(...skipping 3503 matching lines...) Expand 10 before | Expand all | Expand 10 after
4031 bool needConversion = true; 4054 bool needConversion = true;
4032 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::Da taFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNo thing && !flipY) { 4055 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::Da taFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNo thing && !flipY) {
4033 needConversion = false; 4056 needConversion = false;
4034 } else { 4057 } else {
4035 if (!WebGLImageConversion::packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtrac tor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) { 4058 if (!WebGLImageConversion::packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtrac tor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) {
4036 synthesizeGLError(GL_INVALID_VALUE, funcName, "packImage error"); 4059 synthesizeGLError(GL_INVALID_VALUE, funcName, "packImage error");
4037 return; 4060 return;
4038 } 4061 }
4039 } 4062 }
4040 4063
4041 resetUnpackParameters(); 4064 ScopedUnpackParametersResetRestore temporaryResetUnpack(this);
4042 if (functionID == TexImage2D) { 4065 if (functionID == TexImage2D) {
4043 texImage2DBase(target, level, internalformat, imageExtractor.imageWidth( ), imageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : imagePixelData); 4066 texImage2DBase(target, level, internalformat, imageExtractor.imageWidth( ), imageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : imagePixelData);
4044 } else if (functionID == TexSubImage2D) { 4067 } else if (functionID == TexSubImage2D) {
4045 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, imageExtract or.imageWidth(), imageExtractor.imageHeight(), format, type, needConversion ? d ata.data() : imagePixelData); 4068 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, imageExtract or.imageWidth(), imageExtractor.imageHeight(), format, type, needConversion ? d ata.data() : imagePixelData);
4046 } else { 4069 } else {
4047 DCHECK_EQ(functionID, TexSubImage3D); 4070 DCHECK_EQ(functionID, TexSubImage3D);
4048 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, ima geExtractor.imageWidth(), imageExtractor.imageHeight(), 1, format, type, needCon version ? data.data() : imagePixelData); 4071 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, ima geExtractor.imageWidth(), imageExtractor.imageHeight(), 1, format, type, needCon version ? data.data() : imagePixelData);
4049 } 4072 }
4050 restoreUnpackParameters();
4051 } 4073 }
4052 4074
4053 bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexIma geFunctionType functionType, TexFuncValidationSourceType sourceType, GLenum targ et, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei d epth, GLint border, GLenum format, GLenum type, GLint xoffset, GLint yoffset, GL int zoffset) 4075 bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexIma geFunctionType functionType, TexFuncValidationSourceType sourceType, GLenum targ et, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei d epth, GLint border, GLenum format, GLenum type, GLint xoffset, GLint yoffset, GL int zoffset)
4054 { 4076 {
4055 if (!validateTexFuncLevel(functionName, target, level)) 4077 if (!validateTexFuncLevel(functionName, target, level))
4056 return false; 4078 return false;
4057 4079
4058 if (!validateTexFuncParameters(functionName, functionType, target, level, in ternalformat, width, height, depth, border, format, type)) 4080 if (!validateTexFuncParameters(functionName, functionType, target, level, in ternalformat, width, height, depth, border, format, type))
4059 return false; 4081 return false;
4060 4082
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
4182 // FIXME: implement flipY and premultiplyAlpha for tex(Sub)3D. 4204 // FIXME: implement flipY and premultiplyAlpha for tex(Sub)3D.
4183 if (functionID == TexImage3D) { 4205 if (functionID == TexImage3D) {
4184 contextGL()->TexImage3D(target, level, convertTexInternalFormat(internal format, type), width, height, depth, border, format, type, data); 4206 contextGL()->TexImage3D(target, level, convertTexInternalFormat(internal format, type), width, height, depth, border, format, type, data);
4185 return; 4207 return;
4186 } 4208 }
4187 if (functionID == TexSubImage3D) { 4209 if (functionID == TexSubImage3D) {
4188 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, wid th, height, depth, format, type, data); 4210 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, wid th, height, depth, format, type, data);
4189 return; 4211 return;
4190 } 4212 }
4191 4213
4192 if (changeUnpackAlignment) 4214 ScopedUnpackParametersResetRestore temporaryResetUnpack(this, changeUnpackAl ignment);
4193 resetUnpackParameters();
4194 if (functionID == TexImage2D) 4215 if (functionID == TexImage2D)
4195 texImage2DBase(target, level, internalformat, width, height, border, for mat, type, data); 4216 texImage2DBase(target, level, internalformat, width, height, border, for mat, type, data);
4196 else if (functionID == TexSubImage2D) 4217 else if (functionID == TexSubImage2D)
4197 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, width, heigh t, format, type, data); 4218 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, width, heigh t, format, type, data);
4198 if (changeUnpackAlignment)
4199 restoreUnpackParameters();
4200 } 4219 }
4201 4220
4202 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint int ernalformat, 4221 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint int ernalformat,
4203 GLsizei width, GLsizei height, GLint border, 4222 GLsizei width, GLsizei height, GLint border,
4204 GLenum format, GLenum type, DOMArrayBufferView* pixels) 4223 GLenum format, GLenum type, DOMArrayBufferView* pixels)
4205 { 4224 {
4206 texImageHelperDOMArrayBufferView(TexImage2D, target, level, internalformat, width, height, border, format, type, 1, 0, 0, 0, pixels); 4225 texImageHelperDOMArrayBufferView(TexImage2D, target, level, internalformat, width, height, border, format, type, 1, 0, 0, 0, pixels);
4207 } 4226 }
4208 4227
4209 void WebGLRenderingContextBase::texImageHelperImageData(TexImageFunctionID funct ionID, 4228 void WebGLRenderingContextBase::texImageHelperImageData(TexImageFunctionID funct ionID,
(...skipping 29 matching lines...) Expand all
4239 } else { 4258 } else {
4240 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { 4259 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) {
4241 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implement ed. 4260 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implement ed.
4242 type = GL_FLOAT; 4261 type = GL_FLOAT;
4243 } 4262 }
4244 if (!WebGLImageConversion::extractImageData(pixels->data()->data(), WebG LImageConversion::DataFormat::DataFormatRGBA8, pixels->size(), format, type, m_u npackFlipY, m_unpackPremultiplyAlpha, data)) { 4263 if (!WebGLImageConversion::extractImageData(pixels->data()->data(), WebG LImageConversion::DataFormat::DataFormatRGBA8, pixels->size(), format, type, m_u npackFlipY, m_unpackPremultiplyAlpha, data)) {
4245 synthesizeGLError(GL_INVALID_VALUE, funcName, "bad image data"); 4264 synthesizeGLError(GL_INVALID_VALUE, funcName, "bad image data");
4246 return; 4265 return;
4247 } 4266 }
4248 } 4267 }
4249 resetUnpackParameters(); 4268 ScopedUnpackParametersResetRestore temporaryResetUnpack(this);
4250 if (functionID == TexImage2D) { 4269 if (functionID == TexImage2D) {
4251 texImage2DBase(target, level, internalformat, pixels->width(), pixels->h eight(), border, format, type, needConversion ? data.data() : pixels->data()->da ta()); 4270 texImage2DBase(target, level, internalformat, pixels->width(), pixels->h eight(), border, format, type, needConversion ? data.data() : pixels->data()->da ta());
4252 } else if (functionID == TexSubImage2D) { 4271 } else if (functionID == TexSubImage2D) {
4253 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, pixels->widt h(), pixels->height(), format, type, needConversion ? data.data() : pixels->data ()->data()); 4272 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, pixels->widt h(), pixels->height(), format, type, needConversion ? data.data() : pixels->data ()->data());
4254 } else { 4273 } else {
4255 DCHECK_EQ(functionID, TexSubImage3D); 4274 DCHECK_EQ(functionID, TexSubImage3D);
4256 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, pix els->width(), pixels->height(), depth, format, type, needConversion ? data.data( ) : pixels->data()->data()); 4275 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, pix els->width(), pixels->height(), depth, format, type, needConversion ? data.data( ) : pixels->data()->data());
4257 } 4276 }
4258 restoreUnpackParameters();
4259 } 4277 }
4260 4278
4261 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint int ernalformat, 4279 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint int ernalformat,
4262 GLenum format, GLenum type, ImageData* pixels) 4280 GLenum format, GLenum type, ImageData* pixels)
4263 { 4281 {
4264 texImageHelperImageData(TexImage2D, target, level, internalformat, 0, format , type, 1, 0, 0, 0, pixels); 4282 texImageHelperImageData(TexImage2D, target, level, internalformat, 0, format , type, 1, 0, 0, 0, pixels);
4265 } 4283 }
4266 4284
4267 void WebGLRenderingContextBase::texImageHelperHTMLImageElement(TexImageFunctionI D functionID, 4285 void WebGLRenderingContextBase::texImageHelperHTMLImageElement(TexImageFunctionI D functionID,
4268 GLenum target, GLint level, GLint internalformat, GLenum format, GLenum type , GLint xoffset, 4286 GLenum target, GLint level, GLint internalformat, GLenum format, GLenum type , GLint xoffset,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4304 // TODO(crbug.com/622958): Implement GPU-to-GPU path for WebGL 2 and more in ternal formats. 4322 // TODO(crbug.com/622958): Implement GPU-to-GPU path for WebGL 2 and more in ternal formats.
4305 if (functionID == TexSubImage2D && (isWebGL2OrHigher() || extensionEnabled(O ESTextureFloatName) || extensionEnabled(OESTextureHalfFloatName) || extensionEna bled(EXTsRGBName))) 4323 if (functionID == TexSubImage2D && (isWebGL2OrHigher() || extensionEnabled(O ESTextureFloatName) || extensionEnabled(OESTextureHalfFloatName) || extensionEna bled(EXTsRGBName)))
4306 return false; 4324 return false;
4307 return true; 4325 return true;
4308 } 4326 }
4309 4327
4310 void WebGLRenderingContextBase::texImageCanvasByGPU(HTMLCanvasElement* canvas, G Luint targetTexture, GLenum targetInternalformat, GLenum targetType, GLint targe tLevel) 4328 void WebGLRenderingContextBase::texImageCanvasByGPU(HTMLCanvasElement* canvas, G Luint targetTexture, GLenum targetInternalformat, GLenum targetType, GLint targe tLevel)
4311 { 4329 {
4312 if (!canvas->is3D()) { 4330 if (!canvas->is3D()) {
4313 ImageBuffer* buffer = canvas->buffer(); 4331 ImageBuffer* buffer = canvas->buffer();
4314 if (!buffer->copyToPlatformTexture(contextGL(), targetTexture, targetInt ernalformat, targetType, 4332 if (extensionsUtil()->canUseCopyTextureCHROMIUM(targetTexture, targetInt ernalformat, targetType, targetLevel) && !buffer->copyToPlatformTexture(contextG L(), targetTexture, targetInternalformat, targetType, targetLevel, m_unpackPremu ltiplyAlpha, m_unpackFlipY)) {
4315 targetLevel, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
4316 NOTREACHED(); 4333 NOTREACHED();
4317 } 4334 }
4318 } else { 4335 } else {
4319 WebGLRenderingContextBase* gl = toWebGLRenderingContextBase(canvas->rend eringContext()); 4336 WebGLRenderingContextBase* gl = toWebGLRenderingContextBase(canvas->rend eringContext());
4320 ScopedTexture2DRestorer restorer(gl); 4337 ScopedTexture2DRestorer restorer(gl);
4321 if (!gl->drawingBuffer()->copyToPlatformTexture(contextGL(), targetTextu re, targetInternalformat, targetType, 4338 if (!gl->drawingBuffer()->copyToPlatformTexture(contextGL(), targetTextu re, targetInternalformat, targetType,
4322 targetLevel, m_unpackPremultiplyAlpha, !m_unpackFlipY, BackBuffer)) { 4339 targetLevel, m_unpackPremultiplyAlpha, !m_unpackFlipY, BackBuffer)) {
4323 NOTREACHED(); 4340 NOTREACHED();
4324 } 4341 }
4325 } 4342 }
4326 } 4343 }
4327 4344
4328 void WebGLRenderingContextBase::texImageByGPU(TexImageByGPUType functionType, We bGLTexture* texture, GLenum target, 4345 void WebGLRenderingContextBase::texImageByGPU(TexImageByGPUType functionType, We bGLTexture* texture, GLenum target,
4329 GLint level, GLint internalformat, GLenum type, GLint xoffset, GLint yoffset , GLint zoffset, CanvasImageSource* image) 4346 GLint level, GLint internalformat, GLenum type, GLint xoffset, GLint yoffset , GLint zoffset, CanvasImageSource* image)
4330 { 4347 {
4331 DCHECK(image->isCanvasElement() || image->isImageBitmap()); 4348 DCHECK(image->isCanvasElement() || image->isImageBitmap());
4332 int width = image->sourceWidth(); 4349 int width = image->sourceWidth();
4333 int height = image->sourceHeight(); 4350 int height = image->sourceHeight();
4334 4351
4335 ScopedTexture2DRestorer restorer(this); 4352 ScopedTexture2DRestorer restorer(this);
4336 4353
4337 GLuint targetTexture = texture->object(); 4354 GLuint targetTexture = texture->object();
4338 GLenum targetType = type; 4355 GLenum targetType = type;
4339 GLenum targetInternalformat = internalformat; 4356 GLenum targetInternalformat = internalformat;
4340 GLint targetLevel = level; 4357 GLint targetLevel = level;
4341 bool possibleDirectCopy = false; 4358 bool possibleDirectCopy = false;
4342 if (functionType == TexImage2DByGPU) { 4359 if (functionType == TexImage2DByGPU) {
4343 possibleDirectCopy = Extensions3DUtil::canUseCopyTextureCHROMIUM(target, internalformat, type, level); 4360 possibleDirectCopy = extensionsUtil()->canUseCopyTextureCHROMIUM(target, internalformat, type, level);
4344 } 4361 }
4345 4362
4346 // if direct copy is not possible, create a temporary texture and then copy from canvas to temporary texture to target texture. 4363 // if direct copy is not possible, create a temporary texture and then copy from canvas to temporary texture to target texture.
4347 if (!possibleDirectCopy) { 4364 if (!possibleDirectCopy) {
4348 targetLevel = 0; 4365 targetLevel = 0;
4349 targetInternalformat = GL_RGBA; 4366 targetInternalformat = GL_RGBA;
4350 targetType = GL_UNSIGNED_BYTE; 4367 targetType = GL_UNSIGNED_BYTE;
4351 contextGL()->GenTextures(1, &targetTexture); 4368 contextGL()->GenTextures(1, &targetTexture);
4352 contextGL()->BindTexture(GL_TEXTURE_2D, targetTexture); 4369 contextGL()->BindTexture(GL_TEXTURE_2D, targetTexture);
4353 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAR EST); 4370 contextGL()->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAR EST);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4457 if (!texture) 4474 if (!texture)
4458 return; 4475 return;
4459 TexImageFunctionType functionType; 4476 TexImageFunctionType functionType;
4460 if (functionID == TexImage2D) 4477 if (functionID == TexImage2D)
4461 functionType = TexImage; 4478 functionType = TexImage;
4462 else 4479 else
4463 functionType = TexSubImage; 4480 functionType = TexSubImage;
4464 if (!validateTexFunc(funcName, functionType, SourceHTMLVideoElement, target, level, internalformat, video->videoWidth(), video->videoHeight(), 1, 0, format, type, xoffset, yoffset, zoffset)) 4481 if (!validateTexFunc(funcName, functionType, SourceHTMLVideoElement, target, level, internalformat, video->videoWidth(), video->videoHeight(), 1, 0, format, type, xoffset, yoffset, zoffset))
4465 return; 4482 return;
4466 4483
4467 if (functionID == TexImage2D) { 4484 if (functionID == TexImage2D && GL_TEXTURE_2D == target && extensionsUtil()- >canUseCopyTextureCHROMIUM(target, internalformat, type, level)) {
4468 // Go through the fast path doing a GPU-GPU textures copy without a read back to system memory if possible. 4485 // Go through the fast path doing a GPU-GPU textures copy without a read back to system memory if possible.
4469 // Otherwise, it will fall back to the normal SW path. 4486 // Otherwise, it will fall back to the normal SW path.
4470 if (GL_TEXTURE_2D == target) { 4487 if (video->copyVideoTextureToPlatformTexture(contextGL(), texture->objec t(), internalformat, type, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
4471 if (Extensions3DUtil::canUseCopyTextureCHROMIUM(target, internalform at, type, level) 4488 return;
4472 && video->copyVideoTextureToPlatformTexture(contextGL(), texture ->object(), internalformat, type, m_unpackPremultiplyAlpha, m_unpackFlipY)) { 4489 }
4473 return; 4490 }
4474 }
4475 4491
4476 // Try using an accelerated image buffer, this allows YUV conversion to be done on the GPU. 4492 {
4477 std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new Acceler atedImageBufferSurface(IntSize(video->videoWidth(), video->videoHeight()))); 4493 // Try using optimized CPU-GPU path for some formats: e.g. Y16 and Y8. I t leaves early for other formats or if frame is stored on GPU.
4478 if (surface->isValid()) { 4494 ScopedUnpackParametersResetRestore(this, m_unpackFlipY || m_unpackPremul tiplyAlpha);
4479 std::unique_ptr<ImageBuffer> imageBuffer(ImageBuffer::create(std ::move(surface))); 4495 if (video->texImageImpl(getTexImageFunctionName(functionID), target, con textGL(), level, internalformat, format, type, xoffset, yoffset, zoffset,
4480 if (imageBuffer) { 4496 m_unpackFlipY, m_unpackPremultiplyAlpha && m_unpackColorspaceConvers ion == GL_NONE))
4481 // The video element paints an RGBA frame into our surface h ere. By using an AcceleratedImageBufferSurface, 4497 return;
4482 // we enable the WebMediaPlayer implementation to do any nec essary color space conversion on the GPU (though it 4498 }
4483 // may still do a CPU conversion and upload the results).
4484 video->paintCurrentFrame(imageBuffer->canvas(), IntRect(0, 0 , video->videoWidth(), video->videoHeight()), nullptr);
4485 4499
4486 // This is a straight GPU-GPU copy, any necessary color spac e conversion was handled in the paintCurrentFrameInContext() call. 4500 if (functionID == TexImage2D && GL_TEXTURE_2D == target && extensionsUtil()- >canUseCopyTextureCHROMIUM(target, internalformat, type, level)) {
4487 if (imageBuffer->copyToPlatformTexture(contextGL(), texture- >object(), internalformat, type, 4501 // Try using an accelerated image buffer, this allows YUV conversion to be done on the GPU.
4502 std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new Accelerated ImageBufferSurface(IntSize(video->videoWidth(), video->videoHeight())));
4503 if (surface->isValid()) {
4504 std::unique_ptr<ImageBuffer> imageBuffer(ImageBuffer::create(std::mo ve(surface)));
4505 if (imageBuffer) {
4506 // The video element paints an RGBA frame into our surface here. By using an AcceleratedImageBufferSurface,
4507 // we enable the WebMediaPlayer implementation to do any necessa ry color space conversion on the GPU (though it
4508 // may still do a CPU conversion and upload the results).
4509 video->paintCurrentFrame(imageBuffer->canvas(), IntRect(0, 0, vi deo->videoWidth(), video->videoHeight()), nullptr);
4510
4511 // This is a straight GPU-GPU copy, any necessary color space co nversion was handled in the paintCurrentFrameInContext() call.
4512 if (imageBuffer->copyToPlatformTexture(contextGL(), texture->obj ect(), internalformat, type,
4488 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { 4513 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
4489 return; 4514 return;
4490 }
4491 } 4515 }
4492 } 4516 }
4493 } 4517 }
4494 } 4518 }
4495 4519
4496 RefPtr<Image> image = videoFrameToImage(video); 4520 RefPtr<Image> image = videoFrameToImage(video);
4497 if (!image) 4521 if (!image)
4498 return; 4522 return;
4499 texImageImpl(functionID, target, level, internalformat, xoffset, yoffset, zo ffset, format, type, image.get(), WebGLImageConversion::HtmlDomVideo, m_unpackFl ipY, m_unpackPremultiplyAlpha); 4523 texImageImpl(functionID, target, level, internalformat, xoffset, yoffset, zo ffset, format, type, image.get(), WebGLImageConversion::HtmlDomVideo, m_unpackFl ipY, m_unpackPremultiplyAlpha);
4500 } 4524 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
4565 type = GL_FLOAT; 4589 type = GL_FLOAT;
4566 } 4590 }
4567 // In the case of ImageBitmap, we do not need to apply flipY or premulti plyAlpha. 4591 // In the case of ImageBitmap, we do not need to apply flipY or premulti plyAlpha.
4568 bool isPixelDataBGRA = pixmap.colorType() == SkColorType::kBGRA_8888_SkC olorType; 4592 bool isPixelDataBGRA = pixmap.colorType() == SkColorType::kBGRA_8888_SkC olorType;
4569 if ((isPixelDataBGRA && !WebGLImageConversion::extractImageData(pixelDat aPtr, WebGLImageConversion::DataFormat::DataFormatBGRA8, bitmap->size(), format, type, false, false, data)) 4593 if ((isPixelDataBGRA && !WebGLImageConversion::extractImageData(pixelDat aPtr, WebGLImageConversion::DataFormat::DataFormatBGRA8, bitmap->size(), format, type, false, false, data))
4570 || (isPixelDataRGBA && !WebGLImageConversion::extractImageData(pixel DataPtr, WebGLImageConversion::DataFormat::DataFormatRGBA8, bitmap->size(), form at, type, false, false, data))) { 4594 || (isPixelDataRGBA && !WebGLImageConversion::extractImageData(pixel DataPtr, WebGLImageConversion::DataFormat::DataFormatRGBA8, bitmap->size(), form at, type, false, false, data))) {
4571 synthesizeGLError(GL_INVALID_VALUE, funcName, "bad image data"); 4595 synthesizeGLError(GL_INVALID_VALUE, funcName, "bad image data");
4572 return; 4596 return;
4573 } 4597 }
4574 } 4598 }
4575 resetUnpackParameters(); 4599 ScopedUnpackParametersResetRestore temporaryResetUnpack(this);
4576 if (functionID == TexImage2D) { 4600 if (functionID == TexImage2D) {
4577 texImage2DBase(target, level, internalformat, bitmap->width(), bitmap->h eight(), 0, format, type, needConversion ? data.data() : pixelDataPtr); 4601 texImage2DBase(target, level, internalformat, bitmap->width(), bitmap->h eight(), 0, format, type, needConversion ? data.data() : pixelDataPtr);
4578 } else if (functionID == TexSubImage2D) { 4602 } else if (functionID == TexSubImage2D) {
4579 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, bitmap->widt h(), bitmap->height(), format, type, needConversion ? data.data() : pixelDataPtr ); 4603 contextGL()->TexSubImage2D(target, level, xoffset, yoffset, bitmap->widt h(), bitmap->height(), format, type, needConversion ? data.data() : pixelDataPtr );
4580 } else { 4604 } else {
4581 DCHECK_EQ(functionID, TexSubImage3D); 4605 DCHECK_EQ(functionID, TexSubImage3D);
4582 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, bit map->width(), bitmap->height(), 1, format, type, needConversion ? data.data() : pixelDataPtr); 4606 contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, bit map->width(), bitmap->height(), 1, format, type, needConversion ? data.data() : pixelDataPtr);
4583 } 4607 }
4584 restoreUnpackParameters();
4585 } 4608 }
4586 4609
4587 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint int ernalformat, 4610 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint int ernalformat,
4588 GLenum format, GLenum type, ImageBitmap* bitmap, ExceptionState& exceptionSt ate) 4611 GLenum format, GLenum type, ImageBitmap* bitmap, ExceptionState& exceptionSt ate)
4589 { 4612 {
4590 texImageHelperImageBitmap(TexImage2D, target, level, internalformat, format, type, 0, 0, 0, bitmap, exceptionState); 4613 texImageHelperImageBitmap(TexImage2D, target, level, internalformat, format, type, 0, 0, 0, bitmap, exceptionState);
4591 } 4614 }
4592 4615
4593 void WebGLRenderingContextBase::texParameter(GLenum target, GLenum pname, GLfloa t paramf, GLint parami, bool isFloat) 4616 void WebGLRenderingContextBase::texParameter(GLenum target, GLenum pname, GLfloa t paramf, GLint parami, bool isFloat)
4594 { 4617 {
(...skipping 1909 matching lines...) Expand 10 before | Expand all | Expand 10 after
6504 6527
6505 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas(HTMLCanvasElementOrOffs creenCanvas& result) const 6528 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas(HTMLCanvasElementOrOffs creenCanvas& result) const
6506 { 6529 {
6507 if (canvas()) 6530 if (canvas())
6508 result.setHTMLCanvasElement(canvas()); 6531 result.setHTMLCanvasElement(canvas());
6509 else 6532 else
6510 result.setOffscreenCanvas(getOffscreenCanvas()); 6533 result.setOffscreenCanvas(getOffscreenCanvas());
6511 } 6534 }
6512 6535
6513 } // namespace blink 6536 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698