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

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

Issue 2080623002: Revert "Remove OwnPtr from Blink." (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 #include "platform/RuntimeEnabledFeatures.h" 86 #include "platform/RuntimeEnabledFeatures.h"
87 #include "platform/ThreadSafeFunctional.h" 87 #include "platform/ThreadSafeFunctional.h"
88 #include "platform/WaitableEvent.h" 88 #include "platform/WaitableEvent.h"
89 #include "platform/geometry/IntSize.h" 89 #include "platform/geometry/IntSize.h"
90 #include "platform/graphics/GraphicsContext.h" 90 #include "platform/graphics/GraphicsContext.h"
91 #include "platform/graphics/UnacceleratedImageBufferSurface.h" 91 #include "platform/graphics/UnacceleratedImageBufferSurface.h"
92 #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h" 92 #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h"
93 #include "public/platform/Platform.h" 93 #include "public/platform/Platform.h"
94 #include "public/platform/functional/WebFunction.h" 94 #include "public/platform/functional/WebFunction.h"
95 #include "wtf/Functional.h" 95 #include "wtf/Functional.h"
96 #include "wtf/PtrUtil.h" 96 #include "wtf/PassOwnPtr.h"
97 #include "wtf/text/StringBuilder.h" 97 #include "wtf/text/StringBuilder.h"
98 #include "wtf/text/StringUTF8Adaptor.h" 98 #include "wtf/text/StringUTF8Adaptor.h"
99 #include "wtf/typed_arrays/ArrayBufferContents.h" 99 #include "wtf/typed_arrays/ArrayBufferContents.h"
100
100 #include <memory> 101 #include <memory>
101 102
102 namespace blink { 103 namespace blink {
103 104
104 namespace { 105 namespace {
105 106
106 const double secondsBetweenRestoreAttempts = 1.0; 107 const double secondsBetweenRestoreAttempts = 1.0;
107 const int maxGLErrorsAllowedToConsole = 256; 108 const int maxGLErrorsAllowedToConsole = 256;
108 const unsigned maxGLActiveContexts = 16; 109 const unsigned maxGLActiveContexts = 16;
109 const unsigned maxGLActiveContextsOnWorker = 4; 110 const unsigned maxGLActiveContextsOnWorker = 4;
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 statusMessage.append("."); 530 statusMessage.append(".");
530 return statusMessage; 531 return statusMessage;
531 } 532 }
532 533
533 struct ContextProviderCreationInfo { 534 struct ContextProviderCreationInfo {
534 // Inputs. 535 // Inputs.
535 Platform::ContextAttributes contextAttributes; 536 Platform::ContextAttributes contextAttributes;
536 Platform::GraphicsInfo* glInfo; 537 Platform::GraphicsInfo* glInfo;
537 ScriptState* scriptState; 538 ScriptState* scriptState;
538 // Outputs. 539 // Outputs.
539 std::unique_ptr<WebGraphicsContext3DProvider> createdContextProvider; 540 OwnPtr<WebGraphicsContext3DProvider> createdContextProvider;
540 }; 541 };
541 542
542 static void createContextProviderOnMainThread(ContextProviderCreationInfo* creat ionInfo, WaitableEvent* waitableEvent) 543 static void createContextProviderOnMainThread(ContextProviderCreationInfo* creat ionInfo, WaitableEvent* waitableEvent)
543 { 544 {
544 ASSERT(isMainThread()); 545 ASSERT(isMainThread());
545 creationInfo->createdContextProvider = wrapUnique(Platform::current()->creat eOffscreenGraphicsContext3DProvider( 546 creationInfo->createdContextProvider = adoptPtr(Platform::current()->createO ffscreenGraphicsContext3DProvider(
546 creationInfo->contextAttributes, creationInfo->scriptState->getExecution Context()->url(), 0, creationInfo->glInfo)); 547 creationInfo->contextAttributes, creationInfo->scriptState->getExecution Context()->url(), 0, creationInfo->glInfo));
547 waitableEvent->signal(); 548 waitableEvent->signal();
548 } 549 }
549 550
550 static std::unique_ptr<WebGraphicsContext3DProvider> createContextProviderOnWork erThread(Platform::ContextAttributes contextAttributes, Platform::GraphicsInfo* glInfo, ScriptState* scriptState) 551 static PassOwnPtr<WebGraphicsContext3DProvider> createContextProviderOnWorkerThr ead(Platform::ContextAttributes contextAttributes, Platform::GraphicsInfo* glInf o, ScriptState* scriptState)
551 { 552 {
552 WaitableEvent waitableEvent; 553 WaitableEvent waitableEvent;
553 ContextProviderCreationInfo creationInfo; 554 ContextProviderCreationInfo creationInfo;
554 creationInfo.contextAttributes = contextAttributes; 555 creationInfo.contextAttributes = contextAttributes;
555 creationInfo.glInfo = glInfo; 556 creationInfo.glInfo = glInfo;
556 creationInfo.scriptState = scriptState; 557 creationInfo.scriptState = scriptState;
557 WebTaskRunner* taskRunner = Platform::current()->mainThread()->getWebTaskRun ner(); 558 WebTaskRunner* taskRunner = Platform::current()->mainThread()->getWebTaskRun ner();
558 taskRunner->postTask(BLINK_FROM_HERE, threadSafeBind(&createContextProviderO nMainThread, AllowCrossThreadAccess(&creationInfo), AllowCrossThreadAccess(&wait ableEvent))); 559 taskRunner->postTask(BLINK_FROM_HERE, threadSafeBind(&createContextProviderO nMainThread, AllowCrossThreadAccess(&creationInfo), AllowCrossThreadAccess(&wait ableEvent)));
559 waitableEvent.wait(); 560 waitableEvent.wait();
560 return std::move(creationInfo.createdContextProvider); 561 return std::move(creationInfo.createdContextProvider);
561 } 562 }
562 563
563 std::unique_ptr<WebGraphicsContext3DProvider> WebGLRenderingContextBase::createC ontextProviderInternal(HTMLCanvasElement* canvas, ScriptState* scriptState, WebG LContextAttributes attributes, unsigned webGLVersion) 564 PassOwnPtr<WebGraphicsContext3DProvider> WebGLRenderingContextBase::createContex tProviderInternal(HTMLCanvasElement* canvas, ScriptState* scriptState, WebGLCont extAttributes attributes, unsigned webGLVersion)
564 { 565 {
565 // Exactly one of these must be provided. 566 // Exactly one of these must be provided.
566 DCHECK_EQ(!canvas, !!scriptState); 567 DCHECK_EQ(!canvas, !!scriptState);
567 // The canvas is only given on the main thread. 568 // The canvas is only given on the main thread.
568 DCHECK(!canvas || isMainThread()); 569 DCHECK(!canvas || isMainThread());
569 570
570 Platform::ContextAttributes contextAttributes = toPlatformContextAttributes( attributes, webGLVersion); 571 Platform::ContextAttributes contextAttributes = toPlatformContextAttributes( attributes, webGLVersion);
571 Platform::GraphicsInfo glInfo; 572 Platform::GraphicsInfo glInfo;
572 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider; 573 OwnPtr<WebGraphicsContext3DProvider> contextProvider;
573 if (isMainThread()) { 574 if (isMainThread()) {
574 const auto& url = canvas ? canvas->document().topDocument().url() : scri ptState->getExecutionContext()->url(); 575 const auto& url = canvas ? canvas->document().topDocument().url() : scri ptState->getExecutionContext()->url();
575 contextProvider = wrapUnique(Platform::current()->createOffscreenGraphic sContext3DProvider( 576 contextProvider = adoptPtr(Platform::current()->createOffscreenGraphicsC ontext3DProvider(
576 contextAttributes, url, 0, &glInfo)); 577 contextAttributes, url, 0, &glInfo));
577 } else { 578 } else {
578 contextProvider = createContextProviderOnWorkerThread(contextAttributes, &glInfo, scriptState); 579 contextProvider = createContextProviderOnWorkerThread(contextAttributes, &glInfo, scriptState);
579 } 580 }
580 if (contextProvider && !contextProvider->bindToCurrentThread()) { 581 if (contextProvider && !contextProvider->bindToCurrentThread()) {
581 contextProvider = nullptr; 582 contextProvider = nullptr;
582 String errorString(glInfo.errorMessage.utf8().data()); 583 String errorString(glInfo.errorMessage.utf8().data());
583 errorString.insert("bindToCurrentThread failed: ", 0); 584 errorString.insert("bindToCurrentThread failed: ", 0);
584 glInfo.errorMessage = errorString; 585 glInfo.errorMessage = errorString;
585 } 586 }
586 if (!contextProvider || shouldFailContextCreationForTesting) { 587 if (!contextProvider || shouldFailContextCreationForTesting) {
587 shouldFailContextCreationForTesting = false; 588 shouldFailContextCreationForTesting = false;
588 if (canvas) 589 if (canvas)
589 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webg lcontextcreationerror, false, true, extractWebGLContextCreationError(glInfo))); 590 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webg lcontextcreationerror, false, true, extractWebGLContextCreationError(glInfo)));
590 return nullptr; 591 return nullptr;
591 } 592 }
592 gpu::gles2::GLES2Interface* gl = contextProvider->contextGL(); 593 gpu::gles2::GLES2Interface* gl = contextProvider->contextGL();
593 if (!String(gl->GetString(GL_EXTENSIONS)).contains("GL_OES_packed_depth_sten cil")) { 594 if (!String(gl->GetString(GL_EXTENSIONS)).contains("GL_OES_packed_depth_sten cil")) {
594 if (canvas) 595 if (canvas)
595 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webg lcontextcreationerror, false, true, "OES_packed_depth_stencil support is require d.")); 596 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webg lcontextcreationerror, false, true, "OES_packed_depth_stencil support is require d."));
596 return nullptr; 597 return nullptr;
597 } 598 }
598 return contextProvider; 599 return contextProvider;
599 } 600 }
600 601
601 std::unique_ptr<WebGraphicsContext3DProvider> WebGLRenderingContextBase::createW ebGraphicsContext3DProvider(HTMLCanvasElement* canvas, WebGLContextAttributes at tributes, unsigned webGLVersion) 602 PassOwnPtr<WebGraphicsContext3DProvider> WebGLRenderingContextBase::createWebGra phicsContext3DProvider(HTMLCanvasElement* canvas, WebGLContextAttributes attribu tes, unsigned webGLVersion)
602 { 603 {
603 Document& document = canvas->document(); 604 Document& document = canvas->document();
604 LocalFrame* frame = document.frame(); 605 LocalFrame* frame = document.frame();
605 if (!frame) { 606 if (!frame) {
606 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon textcreationerror, false, true, "Web page was not allowed to create a WebGL cont ext.")); 607 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon textcreationerror, false, true, "Web page was not allowed to create a WebGL cont ext."));
607 return nullptr; 608 return nullptr;
608 } 609 }
609 Settings* settings = frame->settings(); 610 Settings* settings = frame->settings();
610 611
611 // The FrameLoaderClient might block creation of a new WebGL context despite the page settings; in 612 // The FrameLoaderClient might block creation of a new WebGL context despite the page settings; in
612 // particular, if WebGL contexts were lost one or more times via the GL_ARB_ robustness extension. 613 // particular, if WebGL contexts were lost one or more times via the GL_ARB_ robustness extension.
613 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled ())) { 614 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled ())) {
614 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon textcreationerror, false, true, "Web page was not allowed to create a WebGL cont ext.")); 615 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon textcreationerror, false, true, "Web page was not allowed to create a WebGL cont ext."));
615 return nullptr; 616 return nullptr;
616 } 617 }
617 618
618 return createContextProviderInternal(canvas, nullptr, attributes, webGLVersi on); 619 return createContextProviderInternal(canvas, nullptr, attributes, webGLVersi on);
619 } 620 }
620 621
621 std::unique_ptr<WebGraphicsContext3DProvider> WebGLRenderingContextBase::createW ebGraphicsContext3DProvider(ScriptState* scriptState, WebGLContextAttributes att ributes, unsigned webGLVersion) 622 PassOwnPtr<WebGraphicsContext3DProvider> WebGLRenderingContextBase::createWebGra phicsContext3DProvider(ScriptState* scriptState, WebGLContextAttributes attribut es, unsigned webGLVersion)
622 { 623 {
623 return createContextProviderInternal(nullptr, scriptState, attributes, webGL Version); 624 return createContextProviderInternal(nullptr, scriptState, attributes, webGL Version);
624 } 625 }
625 626
626 void WebGLRenderingContextBase::forceNextWebGLContextCreationToFail() 627 void WebGLRenderingContextBase::forceNextWebGLContextCreationToFail()
627 { 628 {
628 shouldFailContextCreationForTesting = true; 629 shouldFailContextCreationForTesting = true;
629 } 630 }
630 631
631 ImageBitmap* WebGLRenderingContextBase::transferToImageBitmapBase() 632 ImageBitmap* WebGLRenderingContextBase::transferToImageBitmapBase()
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 case GL_SRGB8: 871 case GL_SRGB8:
871 case GL_SRGB8_ALPHA8: 872 case GL_SRGB8_ALPHA8:
872 return true; 873 return true;
873 default: 874 default:
874 return false; 875 return false;
875 } 876 }
876 } 877 }
877 878
878 } // namespace 879 } // namespace
879 880
880 WebGLRenderingContextBase::WebGLRenderingContextBase(OffscreenCanvas* passedOffs creenCanvas, std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, cons t WebGLContextAttributes& requestedAttributes) 881 WebGLRenderingContextBase::WebGLRenderingContextBase(OffscreenCanvas* passedOffs creenCanvas, PassOwnPtr<WebGraphicsContext3DProvider> contextProvider, const Web GLContextAttributes& requestedAttributes)
881 : WebGLRenderingContextBase(nullptr, passedOffscreenCanvas, std::move(contex tProvider), requestedAttributes) 882 : WebGLRenderingContextBase(nullptr, passedOffscreenCanvas, std::move(contex tProvider), requestedAttributes)
882 { } 883 { }
883 884
884 WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCa nvas, std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, const WebGL ContextAttributes& requestedAttributes) 885 WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCa nvas, PassOwnPtr<WebGraphicsContext3DProvider> contextProvider, const WebGLConte xtAttributes& requestedAttributes)
885 : WebGLRenderingContextBase(passedCanvas, nullptr, std::move(contextProvider ), requestedAttributes) 886 : WebGLRenderingContextBase(passedCanvas, nullptr, std::move(contextProvider ), requestedAttributes)
886 { } 887 { }
887 888
888 WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCa nvas, OffscreenCanvas* passedOffscreenCanvas, std::unique_ptr<WebGraphicsContext 3DProvider> contextProvider, const WebGLContextAttributes& requestedAttributes) 889 WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCa nvas, OffscreenCanvas* passedOffscreenCanvas, PassOwnPtr<WebGraphicsContext3DPro vider> contextProvider, const WebGLContextAttributes& requestedAttributes)
889 : CanvasRenderingContext(passedCanvas, passedOffscreenCanvas) 890 : CanvasRenderingContext(passedCanvas, passedOffscreenCanvas)
890 , m_isHidden(false) 891 , m_isHidden(false)
891 , m_contextLostMode(NotLostContext) 892 , m_contextLostMode(NotLostContext)
892 , m_autoRecoveryMethod(Manual) 893 , m_autoRecoveryMethod(Manual)
893 , m_dispatchContextLostEventTimer(this, &WebGLRenderingContextBase::dispatch ContextLostEvent) 894 , m_dispatchContextLostEventTimer(this, &WebGLRenderingContextBase::dispatch ContextLostEvent)
894 , m_restoreAllowed(false) 895 , m_restoreAllowed(false)
895 , m_restoreTimer(this, &WebGLRenderingContextBase::maybeRestoreContext) 896 , m_restoreTimer(this, &WebGLRenderingContextBase::maybeRestoreContext)
896 , m_preservedDefaultVAOObjectWrapper(false) 897 , m_preservedDefaultVAOObjectWrapper(false)
897 , m_generatedImageCache(4) 898 , m_generatedImageCache(4)
898 , m_requestedAttributes(requestedAttributes) 899 , m_requestedAttributes(requestedAttributes)
(...skipping 30 matching lines...) Expand all
929 for (size_t i = 0; i < WTF_ARRAY_LENGTH(values); ++i) { \ 930 for (size_t i = 0; i < WTF_ARRAY_LENGTH(values); ++i) { \
930 set.insert(values[i]); \ 931 set.insert(values[i]); \
931 } 932 }
932 933
933 ADD_VALUES_TO_SET(m_supportedInternalFormats, kSupportedInternalFormatsES2); 934 ADD_VALUES_TO_SET(m_supportedInternalFormats, kSupportedInternalFormatsES2);
934 ADD_VALUES_TO_SET(m_supportedInternalFormatsCopyTexImage, kSupportedInternal FormatsES2); 935 ADD_VALUES_TO_SET(m_supportedInternalFormatsCopyTexImage, kSupportedInternal FormatsES2);
935 ADD_VALUES_TO_SET(m_supportedFormats, kSupportedFormatsES2); 936 ADD_VALUES_TO_SET(m_supportedFormats, kSupportedFormatsES2);
936 ADD_VALUES_TO_SET(m_supportedTypes, kSupportedTypesES2); 937 ADD_VALUES_TO_SET(m_supportedTypes, kSupportedTypesES2);
937 } 938 }
938 939
939 PassRefPtr<DrawingBuffer> WebGLRenderingContextBase::createDrawingBuffer(std::un ique_ptr<WebGraphicsContext3DProvider> contextProvider) 940 PassRefPtr<DrawingBuffer> WebGLRenderingContextBase::createDrawingBuffer(PassOwn Ptr<WebGraphicsContext3DProvider> contextProvider)
940 { 941 {
941 bool premultipliedAlpha = m_requestedAttributes.premultipliedAlpha(); 942 bool premultipliedAlpha = m_requestedAttributes.premultipliedAlpha();
942 bool wantAlphaChannel = m_requestedAttributes.alpha(); 943 bool wantAlphaChannel = m_requestedAttributes.alpha();
943 bool wantDepthBuffer = m_requestedAttributes.depth(); 944 bool wantDepthBuffer = m_requestedAttributes.depth();
944 bool wantStencilBuffer = m_requestedAttributes.stencil(); 945 bool wantStencilBuffer = m_requestedAttributes.stencil();
945 bool wantAntialiasing = m_requestedAttributes.antialias(); 946 bool wantAntialiasing = m_requestedAttributes.antialias();
946 DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes.preser veDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard; 947 DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes.preser veDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
947 return DrawingBuffer::create( 948 return DrawingBuffer::create(
948 std::move(contextProvider), 949 std::move(contextProvider),
949 clampedCanvasSize(), 950 clampedCanvasSize(),
(...skipping 3476 matching lines...) Expand 10 before | Expand all | Expand 10 after
4426 if (functionID == TexImage2D) { 4427 if (functionID == TexImage2D) {
4427 // Go through the fast path doing a GPU-GPU textures copy without a read back to system memory if possible. 4428 // Go through the fast path doing a GPU-GPU textures copy without a read back to system memory if possible.
4428 // Otherwise, it will fall back to the normal SW path. 4429 // Otherwise, it will fall back to the normal SW path.
4429 if (GL_TEXTURE_2D == target) { 4430 if (GL_TEXTURE_2D == target) {
4430 if (Extensions3DUtil::canUseCopyTextureCHROMIUM(target, internalform at, type, level) 4431 if (Extensions3DUtil::canUseCopyTextureCHROMIUM(target, internalform at, type, level)
4431 && video->copyVideoTextureToPlatformTexture(contextGL(), texture ->object(), internalformat, type, m_unpackPremultiplyAlpha, m_unpackFlipY)) { 4432 && video->copyVideoTextureToPlatformTexture(contextGL(), texture ->object(), internalformat, type, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
4432 return; 4433 return;
4433 } 4434 }
4434 4435
4435 // Try using an accelerated image buffer, this allows YUV conversion to be done on the GPU. 4436 // Try using an accelerated image buffer, this allows YUV conversion to be done on the GPU.
4436 std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new Acceler atedImageBufferSurface(IntSize(video->videoWidth(), video->videoHeight()))); 4437 OwnPtr<ImageBufferSurface> surface = adoptPtr(new AcceleratedImageBu fferSurface(IntSize(video->videoWidth(), video->videoHeight())));
4437 if (surface->isValid()) { 4438 if (surface->isValid()) {
4438 std::unique_ptr<ImageBuffer> imageBuffer(ImageBuffer::create(std ::move(surface))); 4439 OwnPtr<ImageBuffer> imageBuffer(ImageBuffer::create(std::move(su rface)));
4439 if (imageBuffer) { 4440 if (imageBuffer) {
4440 // The video element paints an RGBA frame into our surface h ere. By using an AcceleratedImageBufferSurface, 4441 // The video element paints an RGBA frame into our surface h ere. By using an AcceleratedImageBufferSurface,
4441 // we enable the WebMediaPlayer implementation to do any nec essary color space conversion on the GPU (though it 4442 // we enable the WebMediaPlayer implementation to do any nec essary color space conversion on the GPU (though it
4442 // may still do a CPU conversion and upload the results). 4443 // may still do a CPU conversion and upload the results).
4443 video->paintCurrentFrame(imageBuffer->canvas(), IntRect(0, 0 , video->videoWidth(), video->videoHeight()), nullptr); 4444 video->paintCurrentFrame(imageBuffer->canvas(), IntRect(0, 0 , video->videoWidth(), video->videoHeight()), nullptr);
4444 4445
4445 // This is a straight GPU-GPU copy, any necessary color spac e conversion was handled in the paintCurrentFrameInContext() call. 4446 // This is a straight GPU-GPU copy, any necessary color spac e conversion was handled in the paintCurrentFrameInContext() call.
4446 if (imageBuffer->copyToPlatformTexture(contextGL(), texture- >object(), internalformat, type, 4447 if (imageBuffer->copyToPlatformTexture(contextGL(), texture- >object(), internalformat, type,
4447 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { 4448 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
4448 return; 4449 return;
(...skipping 29 matching lines...) Expand all
4478 TexImageFunctionType functionType; 4479 TexImageFunctionType functionType;
4479 if (functionID == TexImage2D) 4480 if (functionID == TexImage2D)
4480 functionType = TexImage; 4481 functionType = TexImage;
4481 else 4482 else
4482 functionType = TexSubImage; 4483 functionType = TexSubImage;
4483 if (!validateTexFunc(funcName, functionType, SourceImageBitmap, target, leve l, internalformat, bitmap->width(), bitmap->height(), 1, 0, format, type, xoffse t, yoffset, zoffset)) 4484 if (!validateTexFunc(funcName, functionType, SourceImageBitmap, target, leve l, internalformat, bitmap->width(), bitmap->height(), 1, 0, format, type, xoffse t, yoffset, zoffset))
4484 return; 4485 return;
4485 ASSERT(bitmap->bitmapImage()); 4486 ASSERT(bitmap->bitmapImage());
4486 RefPtr<SkImage> skImage = bitmap->bitmapImage()->imageForCurrentFrame(); 4487 RefPtr<SkImage> skImage = bitmap->bitmapImage()->imageForCurrentFrame();
4487 SkPixmap pixmap; 4488 SkPixmap pixmap;
4488 std::unique_ptr<uint8_t[]> pixelData; 4489 OwnPtr<uint8_t[]> pixelData;
4489 uint8_t* pixelDataPtr = nullptr; 4490 uint8_t* pixelDataPtr = nullptr;
4490 // TODO(crbug.com/613411): peekPixels fails if the SkImage is texture-backed 4491 // TODO(crbug.com/613411): peekPixels fails if the SkImage is texture-backed
4491 // Use texture mailbox in that case. 4492 // Use texture mailbox in that case.
4492 bool peekSucceed = skImage->peekPixels(&pixmap); 4493 bool peekSucceed = skImage->peekPixels(&pixmap);
4493 if (peekSucceed) { 4494 if (peekSucceed) {
4494 pixelDataPtr = static_cast<uint8_t*>(pixmap.writable_addr()); 4495 pixelDataPtr = static_cast<uint8_t*>(pixmap.writable_addr());
4495 } else if (skImage->isTextureBacked()) { 4496 } else if (skImage->isTextureBacked()) {
4496 pixelData = bitmap->copyBitmapData(bitmap->isPremultiplied() ? Premultip lyAlpha : DontPremultiplyAlpha); 4497 pixelData = bitmap->copyBitmapData(bitmap->isPremultiplied() ? Premultip lyAlpha : DontPremultiplyAlpha);
4497 pixelDataPtr = pixelData.get(); 4498 pixelDataPtr = pixelData.get();
4498 } 4499 }
(...skipping 1584 matching lines...) Expand 10 before | Expand all | Expand 10 after
6083 return; 6084 return;
6084 6085
6085 // If the context was lost due to RealLostContext, we need to destroy the ol d DrawingBuffer before creating new DrawingBuffer to ensure resource budget enou gh. 6086 // If the context was lost due to RealLostContext, we need to destroy the ol d DrawingBuffer before creating new DrawingBuffer to ensure resource budget enou gh.
6086 if (drawingBuffer()) { 6087 if (drawingBuffer()) {
6087 m_drawingBuffer->beginDestruction(); 6088 m_drawingBuffer->beginDestruction();
6088 m_drawingBuffer.clear(); 6089 m_drawingBuffer.clear();
6089 } 6090 }
6090 6091
6091 Platform::ContextAttributes attributes = toPlatformContextAttributes(m_reque stedAttributes, version()); 6092 Platform::ContextAttributes attributes = toPlatformContextAttributes(m_reque stedAttributes, version());
6092 Platform::GraphicsInfo glInfo; 6093 Platform::GraphicsInfo glInfo;
6093 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider = wrapUnique(P latform::current()->createOffscreenGraphicsContext3DProvider( 6094 OwnPtr<WebGraphicsContext3DProvider> contextProvider = adoptPtr(Platform::cu rrent()->createOffscreenGraphicsContext3DProvider(
6094 attributes, canvas()->document().topDocument().url(), 0, &glInfo)); 6095 attributes, canvas()->document().topDocument().url(), 0, &glInfo));
6095 RefPtr<DrawingBuffer> buffer; 6096 RefPtr<DrawingBuffer> buffer;
6096 if (contextProvider->bindToCurrentThread()) { 6097 if (contextProvider->bindToCurrentThread()) {
6097 // Construct a new drawing buffer with the new GL context. 6098 // Construct a new drawing buffer with the new GL context.
6098 buffer = createDrawingBuffer(std::move(contextProvider)); 6099 buffer = createDrawingBuffer(std::move(contextProvider));
6099 // If DrawingBuffer::create() fails to allocate a fbo, |drawingBuffer| i s set to null. 6100 // If DrawingBuffer::create() fails to allocate a fbo, |drawingBuffer| i s set to null.
6100 } 6101 }
6101 if (!buffer) { 6102 if (!buffer) {
6102 if (m_contextLostMode == RealLostContext) { 6103 if (m_contextLostMode == RealLostContext) {
6103 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts, BLINK_FRO M_HERE); 6104 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts, BLINK_FRO M_HERE);
(...skipping 21 matching lines...) Expand all
6125 } 6126 }
6126 6127
6127 String WebGLRenderingContextBase::ensureNotNull(const String& text) const 6128 String WebGLRenderingContextBase::ensureNotNull(const String& text) const
6128 { 6129 {
6129 if (text.isNull()) 6130 if (text.isNull())
6130 return WTF::emptyString(); 6131 return WTF::emptyString();
6131 return text; 6132 return text;
6132 } 6133 }
6133 6134
6134 WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache(int capacity ) 6135 WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache(int capacity )
6135 : m_buffers(wrapArrayUnique(new std::unique_ptr<ImageBuffer>[capacity])) 6136 : m_buffers(adoptArrayPtr(new OwnPtr<ImageBuffer>[capacity]))
6136 , m_capacity(capacity) 6137 , m_capacity(capacity)
6137 { 6138 {
6138 } 6139 }
6139 6140
6140 ImageBuffer* WebGLRenderingContextBase::LRUImageBufferCache::imageBuffer(const I ntSize& size) 6141 ImageBuffer* WebGLRenderingContextBase::LRUImageBufferCache::imageBuffer(const I ntSize& size)
6141 { 6142 {
6142 int i; 6143 int i;
6143 for (i = 0; i < m_capacity; ++i) { 6144 for (i = 0; i < m_capacity; ++i) {
6144 ImageBuffer* buf = m_buffers[i].get(); 6145 ImageBuffer* buf = m_buffers[i].get();
6145 if (!buf) 6146 if (!buf)
6146 break; 6147 break;
6147 if (buf->size() != size) 6148 if (buf->size() != size)
6148 continue; 6149 continue;
6149 bubbleToFront(i); 6150 bubbleToFront(i);
6150 return buf; 6151 return buf;
6151 } 6152 }
6152 6153
6153 std::unique_ptr<ImageBuffer> temp(ImageBuffer::create(size)); 6154 OwnPtr<ImageBuffer> temp(ImageBuffer::create(size));
6154 if (!temp) 6155 if (!temp)
6155 return nullptr; 6156 return nullptr;
6156 i = std::min(m_capacity - 1, i); 6157 i = std::min(m_capacity - 1, i);
6157 m_buffers[i] = std::move(temp); 6158 m_buffers[i] = std::move(temp);
6158 6159
6159 ImageBuffer* buf = m_buffers[i].get(); 6160 ImageBuffer* buf = m_buffers[i].get();
6160 bubbleToFront(i); 6161 bubbleToFront(i);
6161 return buf; 6162 return buf;
6162 } 6163 }
6163 6164
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
6424 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, 1); 6425 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, 1);
6425 } 6426 }
6426 6427
6427 void WebGLRenderingContextBase::restoreUnpackParameters() 6428 void WebGLRenderingContextBase::restoreUnpackParameters()
6428 { 6429 {
6429 if (m_unpackAlignment != 1) 6430 if (m_unpackAlignment != 1)
6430 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); 6431 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
6431 } 6432 }
6432 6433
6433 } // namespace blink 6434 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698