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

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

Issue 2594843002: Implementing promise-based commit for driving OffscreenCanvas animations (Closed)
Patch Set: rebase Created 3 years, 11 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 696 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 ImageBitmap* WebGLRenderingContextBase::transferToImageBitmapBase( 707 ImageBitmap* WebGLRenderingContextBase::transferToImageBitmapBase(
708 ScriptState* scriptState) { 708 ScriptState* scriptState) {
709 UseCounter::Feature feature = 709 UseCounter::Feature feature =
710 UseCounter::OffscreenCanvasTransferToImageBitmapWebGL; 710 UseCounter::OffscreenCanvasTransferToImageBitmapWebGL;
711 UseCounter::count(scriptState->getExecutionContext(), feature); 711 UseCounter::count(scriptState->getExecutionContext(), feature);
712 if (!drawingBuffer()) 712 if (!drawingBuffer())
713 return nullptr; 713 return nullptr;
714 return ImageBitmap::create(drawingBuffer()->transferToStaticBitmapImage()); 714 return ImageBitmap::create(drawingBuffer()->transferToStaticBitmapImage());
715 } 715 }
716 716
717 void WebGLRenderingContextBase::commit(ScriptState* scriptState, 717 ScriptPromise WebGLRenderingContextBase::commit(
718 ExceptionState& exceptionState) { 718 ScriptState* scriptState,
719 ExceptionState& exceptionState) {
719 UseCounter::Feature feature = UseCounter::OffscreenCanvasCommitWebGL; 720 UseCounter::Feature feature = UseCounter::OffscreenCanvasCommitWebGL;
720 UseCounter::count(scriptState->getExecutionContext(), feature); 721 UseCounter::count(scriptState->getExecutionContext(), feature);
721 if (!getOffscreenCanvas()) { 722 if (!offscreenCanvas()) {
722 exceptionState.throwDOMException(InvalidStateError, 723 exceptionState.throwDOMException(InvalidStateError,
723 "Commit() was called on a rendering " 724 "Commit() was called on a rendering "
724 "context that was not created from an " 725 "context that was not created from an "
725 "OffscreenCanvas."); 726 "OffscreenCanvas.");
726 return; 727 return exceptionState.reject(scriptState);
727 } 728 }
728 // no HTMLCanvas associated, thrown InvalidStateError 729 // no HTMLCanvas associated, thrown InvalidStateError
729 if (!getOffscreenCanvas()->hasPlaceholderCanvas()) { 730 if (!offscreenCanvas()->hasPlaceholderCanvas()) {
730 exceptionState.throwDOMException(InvalidStateError, 731 exceptionState.throwDOMException(InvalidStateError,
731 "Commit() was called on a context whose " 732 "Commit() was called on a context whose "
732 "OffscreenCanvas is not associated with a " 733 "OffscreenCanvas is not associated with a "
733 "canvas element."); 734 "canvas element.");
734 return; 735 return exceptionState.reject(scriptState);
735 } 736 }
736 if (!drawingBuffer()) 737 if (!drawingBuffer()) {
737 return; 738 return offscreenCanvas()->commit(nullptr, false, scriptState);
738 double commitStartTime = WTF::monotonicallyIncreasingTime(); 739 }
739 // TODO(crbug.com/646864): Make commit() work correctly with 740 // TODO(crbug.com/646864): Make commit() work correctly with
740 // { preserveDrawingBuffer : true }. 741 // { preserveDrawingBuffer : true }.
741 getOffscreenCanvas()->getOrCreateFrameDispatcher()->dispatchFrame( 742 return offscreenCanvas()->commit(
742 std::move(drawingBuffer()->transferToStaticBitmapImage()), 743 std::move(drawingBuffer()->transferToStaticBitmapImage()),
743 commitStartTime, 744 drawingBuffer()->contextProvider()->isSoftwareRendering(), scriptState);
744 drawingBuffer()->contextProvider()->isSoftwareRendering());
745 } 745 }
746 746
747 PassRefPtr<Image> WebGLRenderingContextBase::getImage( 747 PassRefPtr<Image> WebGLRenderingContextBase::getImage(
748 AccelerationHint hint, 748 AccelerationHint hint,
749 SnapshotReason reason) const { 749 SnapshotReason reason) const {
750 if (!drawingBuffer()) 750 if (!drawingBuffer())
751 return nullptr; 751 return nullptr;
752 752
753 drawingBuffer()->resolveAndBindForReadAndDraw(); 753 drawingBuffer()->resolveAndBindForReadAndDraw();
754 IntSize size = clampedCanvasSize(); 754 IntSize size = clampedCanvasSize();
(...skipping 6644 matching lines...) Expand 10 before | Expand all | Expand 10 after
7399 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason); 7399 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason);
7400 return false; 7400 return false;
7401 } 7401 }
7402 7402
7403 return true; 7403 return true;
7404 } 7404 }
7405 7405
7406 void WebGLRenderingContextBase::dispatchContextLostEvent(TimerBase*) { 7406 void WebGLRenderingContextBase::dispatchContextLostEvent(TimerBase*) {
7407 WebGLContextEvent* event = WebGLContextEvent::create( 7407 WebGLContextEvent* event = WebGLContextEvent::create(
7408 EventTypeNames::webglcontextlost, false, true, ""); 7408 EventTypeNames::webglcontextlost, false, true, "");
7409 if (getOffscreenCanvas()) 7409 if (offscreenCanvas())
7410 getOffscreenCanvas()->dispatchEvent(event); 7410 offscreenCanvas()->dispatchEvent(event);
7411 else 7411 else
7412 canvas()->dispatchEvent(event); 7412 canvas()->dispatchEvent(event);
7413 m_restoreAllowed = event->defaultPrevented(); 7413 m_restoreAllowed = event->defaultPrevented();
7414 if (m_restoreAllowed && !m_isHidden) { 7414 if (m_restoreAllowed && !m_isHidden) {
7415 if (m_autoRecoveryMethod == Auto) 7415 if (m_autoRecoveryMethod == Auto)
7416 m_restoreTimer.startOneShot(0, BLINK_FROM_HERE); 7416 m_restoreTimer.startOneShot(0, BLINK_FROM_HERE);
7417 } 7417 }
7418 } 7418 }
7419 7419
7420 void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) { 7420 void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) {
(...skipping 25 matching lines...) Expand all
7446 // enough. 7446 // enough.
7447 if (drawingBuffer()) { 7447 if (drawingBuffer()) {
7448 m_drawingBuffer->beginDestruction(); 7448 m_drawingBuffer->beginDestruction();
7449 m_drawingBuffer.clear(); 7449 m_drawingBuffer.clear();
7450 } 7450 }
7451 7451
7452 Platform::ContextAttributes attributes = 7452 Platform::ContextAttributes attributes =
7453 toPlatformContextAttributes(creationAttributes(), version()); 7453 toPlatformContextAttributes(creationAttributes(), version());
7454 Platform::GraphicsInfo glInfo; 7454 Platform::GraphicsInfo glInfo;
7455 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider; 7455 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider;
7456 const auto& url = canvas() 7456 const auto& url = canvas() ? canvas()->document().topDocument().url()
7457 ? canvas()->document().topDocument().url() 7457 : offscreenCanvas()->getExecutionContext()->url();
7458 : getOffscreenCanvas()->getExecutionContext()->url();
7459 if (isMainThread()) { 7458 if (isMainThread()) {
7460 contextProvider = WTF::wrapUnique( 7459 contextProvider = WTF::wrapUnique(
7461 Platform::current()->createOffscreenGraphicsContext3DProvider( 7460 Platform::current()->createOffscreenGraphicsContext3DProvider(
7462 attributes, url, 0, &glInfo)); 7461 attributes, url, 0, &glInfo));
7463 } else { 7462 } else {
7464 contextProvider = 7463 contextProvider =
7465 createContextProviderOnWorkerThread(attributes, &glInfo, url); 7464 createContextProviderOnWorkerThread(attributes, &glInfo, url);
7466 } 7465 }
7467 RefPtr<DrawingBuffer> buffer; 7466 RefPtr<DrawingBuffer> buffer;
7468 if (contextProvider && contextProvider->bindToCurrentThread()) { 7467 if (contextProvider && contextProvider->bindToCurrentThread()) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
7503 removeFromEvictedList(this); 7502 removeFromEvictedList(this);
7504 7503
7505 setupFlags(); 7504 setupFlags();
7506 initializeNewContext(); 7505 initializeNewContext();
7507 markContextChanged(CanvasContextChanged); 7506 markContextChanged(CanvasContextChanged);
7508 WebGLContextEvent* event = WebGLContextEvent::create( 7507 WebGLContextEvent* event = WebGLContextEvent::create(
7509 EventTypeNames::webglcontextrestored, false, true, ""); 7508 EventTypeNames::webglcontextrestored, false, true, "");
7510 if (canvas()) 7509 if (canvas())
7511 canvas()->dispatchEvent(event); 7510 canvas()->dispatchEvent(event);
7512 else 7511 else
7513 getOffscreenCanvas()->dispatchEvent(event); 7512 offscreenCanvas()->dispatchEvent(event);
7514 } 7513 }
7515 7514
7516 String WebGLRenderingContextBase::ensureNotNull(const String& text) const { 7515 String WebGLRenderingContextBase::ensureNotNull(const String& text) const {
7517 if (text.isNull()) 7516 if (text.isNull())
7518 return WTF::emptyString(); 7517 return WTF::emptyString();
7519 return text; 7518 return text;
7520 } 7519 }
7521 7520
7522 WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache( 7521 WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache(
7523 int capacity) 7522 int capacity)
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
7629 else 7628 else
7630 contextGL()->Disable(capability); 7629 contextGL()->Disable(capability);
7631 } 7630 }
7632 7631
7633 IntSize WebGLRenderingContextBase::clampedCanvasSize() const { 7632 IntSize WebGLRenderingContextBase::clampedCanvasSize() const {
7634 int width, height; 7633 int width, height;
7635 if (canvas()) { 7634 if (canvas()) {
7636 width = canvas()->width(); 7635 width = canvas()->width();
7637 height = canvas()->height(); 7636 height = canvas()->height();
7638 } else { 7637 } else {
7639 width = getOffscreenCanvas()->width(); 7638 width = offscreenCanvas()->width();
7640 height = getOffscreenCanvas()->height(); 7639 height = offscreenCanvas()->height();
7641 } 7640 }
7642 return IntSize(clamp(width, 1, m_maxViewportDims[0]), 7641 return IntSize(clamp(width, 1, m_maxViewportDims[0]),
7643 clamp(height, 1, m_maxViewportDims[1])); 7642 clamp(height, 1, m_maxViewportDims[1]));
7644 } 7643 }
7645 7644
7646 GLint WebGLRenderingContextBase::maxDrawBuffers() { 7645 GLint WebGLRenderingContextBase::maxDrawBuffers() {
7647 if (isContextLost() || 7646 if (isContextLost() ||
7648 !(extensionEnabled(WebGLDrawBuffersName) || isWebGL2OrHigher())) 7647 !(extensionEnabled(WebGLDrawBuffersName) || isWebGL2OrHigher()))
7649 return 0; 7648 return 0;
7650 if (!m_maxDrawBuffers) 7649 if (!m_maxDrawBuffers)
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
7792 void WebGLRenderingContextBase::restoreUnpackParameters() { 7791 void WebGLRenderingContextBase::restoreUnpackParameters() {
7793 if (m_unpackAlignment != 1) 7792 if (m_unpackAlignment != 1)
7794 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); 7793 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
7795 } 7794 }
7796 7795
7797 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( 7796 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas(
7798 HTMLCanvasElementOrOffscreenCanvas& result) const { 7797 HTMLCanvasElementOrOffscreenCanvas& result) const {
7799 if (canvas()) 7798 if (canvas())
7800 result.setHTMLCanvasElement(canvas()); 7799 result.setHTMLCanvasElement(canvas());
7801 else 7800 else
7802 result.setOffscreenCanvas(getOffscreenCanvas()); 7801 result.setOffscreenCanvas(offscreenCanvas());
7803 } 7802 }
7804 7803
7805 } // namespace blink 7804 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698