| OLD | NEW |
| 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 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 ImageBitmap* WebGLRenderingContextBase::transferToImageBitmapBase( | 705 ImageBitmap* WebGLRenderingContextBase::transferToImageBitmapBase( |
| 706 ScriptState* scriptState) { | 706 ScriptState* scriptState) { |
| 707 UseCounter::Feature feature = | 707 UseCounter::Feature feature = |
| 708 UseCounter::OffscreenCanvasTransferToImageBitmapWebGL; | 708 UseCounter::OffscreenCanvasTransferToImageBitmapWebGL; |
| 709 UseCounter::count(scriptState->getExecutionContext(), feature); | 709 UseCounter::count(scriptState->getExecutionContext(), feature); |
| 710 if (!drawingBuffer()) | 710 if (!drawingBuffer()) |
| 711 return nullptr; | 711 return nullptr; |
| 712 return ImageBitmap::create(drawingBuffer()->transferToStaticBitmapImage()); | 712 return ImageBitmap::create(drawingBuffer()->transferToStaticBitmapImage()); |
| 713 } | 713 } |
| 714 | 714 |
| 715 void WebGLRenderingContextBase::commit(ScriptState* scriptState, | 715 ScriptPromise WebGLRenderingContextBase::commit( |
| 716 ExceptionState& exceptionState) { | 716 ScriptState* scriptState, |
| 717 ExceptionState& exceptionState) { |
| 717 UseCounter::Feature feature = UseCounter::OffscreenCanvasCommitWebGL; | 718 UseCounter::Feature feature = UseCounter::OffscreenCanvasCommitWebGL; |
| 718 UseCounter::count(scriptState->getExecutionContext(), feature); | 719 UseCounter::count(scriptState->getExecutionContext(), feature); |
| 719 if (!getOffscreenCanvas()) { | 720 if (!offscreenCanvas()) { |
| 720 exceptionState.throwDOMException(InvalidStateError, | 721 exceptionState.throwDOMException(InvalidStateError, |
| 721 "Commit() was called on a rendering " | 722 "Commit() was called on a rendering " |
| 722 "context that was not created from an " | 723 "context that was not created from an " |
| 723 "OffscreenCanvas."); | 724 "OffscreenCanvas."); |
| 724 return; | 725 return exceptionState.reject(scriptState); |
| 725 } | 726 } |
| 726 // no HTMLCanvas associated, thrown InvalidStateError | 727 // no HTMLCanvas associated, thrown InvalidStateError |
| 727 if (!getOffscreenCanvas()->hasPlaceholderCanvas()) { | 728 if (!offscreenCanvas()->hasPlaceholderCanvas()) { |
| 728 exceptionState.throwDOMException(InvalidStateError, | 729 exceptionState.throwDOMException(InvalidStateError, |
| 729 "Commit() was called on a context whose " | 730 "Commit() was called on a context whose " |
| 730 "OffscreenCanvas is not associated with a " | 731 "OffscreenCanvas is not associated with a " |
| 731 "canvas element."); | 732 "canvas element."); |
| 732 return; | 733 return exceptionState.reject(scriptState); |
| 733 } | 734 } |
| 734 if (!drawingBuffer()) | 735 if (!drawingBuffer()) { |
| 735 return; | 736 exceptionState.throwDOMException(InvalidStateError, |
| 736 double commitStartTime = WTF::monotonicallyIncreasingTime(); | 737 "WebGL context has no drawing buffer."); |
| 738 return exceptionState.reject(scriptState); |
| 739 } |
| 737 // TODO(crbug.com/646864): Make commit() work correctly with | 740 // TODO(crbug.com/646864): Make commit() work correctly with |
| 738 // { preserveDrawingBuffer : true }. | 741 // { preserveDrawingBuffer : true }. |
| 739 getOffscreenCanvas()->getOrCreateFrameDispatcher()->dispatchFrame( | 742 return offscreenCanvas()->commit( |
| 740 std::move(drawingBuffer()->transferToStaticBitmapImage()), | 743 std::move(drawingBuffer()->transferToStaticBitmapImage()), |
| 741 commitStartTime, | 744 drawingBuffer()->contextProvider()->isSoftwareRendering(), scriptState); |
| 742 drawingBuffer()->contextProvider()->isSoftwareRendering()); | |
| 743 } | 745 } |
| 744 | 746 |
| 745 PassRefPtr<Image> WebGLRenderingContextBase::getImage( | 747 PassRefPtr<Image> WebGLRenderingContextBase::getImage( |
| 746 AccelerationHint hint, | 748 AccelerationHint hint, |
| 747 SnapshotReason reason) const { | 749 SnapshotReason reason) const { |
| 748 if (!drawingBuffer()) | 750 if (!drawingBuffer()) |
| 749 return nullptr; | 751 return nullptr; |
| 750 | 752 |
| 751 drawingBuffer()->resolveAndBindForReadAndDraw(); | 753 drawingBuffer()->resolveAndBindForReadAndDraw(); |
| 752 IntSize size = clampedCanvasSize(); | 754 IntSize size = clampedCanvasSize(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 773 // images. See crbug.com/657531. | 775 // images. See crbug.com/657531. |
| 774 ImageData* imageData = nullptr; | 776 ImageData* imageData = nullptr; |
| 775 // TODO(ccameron): WebGL should produce sRGB images. | 777 // TODO(ccameron): WebGL should produce sRGB images. |
| 776 // https://crbug.com/672299 | 778 // https://crbug.com/672299 |
| 777 if (this->drawingBuffer()) { | 779 if (this->drawingBuffer()) { |
| 778 sk_sp<SkImage> snapshot = | 780 sk_sp<SkImage> snapshot = |
| 779 this->drawingBuffer() | 781 this->drawingBuffer() |
| 780 ->transferToStaticBitmapImage() | 782 ->transferToStaticBitmapImage() |
| 781 ->imageForCurrentFrame(ColorBehavior::transformToGlobalTarget()); | 783 ->imageForCurrentFrame(ColorBehavior::transformToGlobalTarget()); |
| 782 if (snapshot) { | 784 if (snapshot) { |
| 783 imageData = ImageData::create(this->getOffscreenCanvas()->size()); | 785 imageData = ImageData::create(this->offscreenCanvas()->size()); |
| 784 SkImageInfo imageInfo = SkImageInfo::Make( | 786 SkImageInfo imageInfo = SkImageInfo::Make( |
| 785 this->drawingBufferWidth(), this->drawingBufferHeight(), | 787 this->drawingBufferWidth(), this->drawingBufferHeight(), |
| 786 kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); | 788 kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); |
| 787 snapshot->readPixels(imageInfo, imageData->data()->data(), | 789 snapshot->readPixels(imageInfo, imageData->data()->data(), |
| 788 imageInfo.minRowBytes(), 0, 0); | 790 imageInfo.minRowBytes(), 0, 0); |
| 789 } | 791 } |
| 790 } | 792 } |
| 791 return imageData; | 793 return imageData; |
| 792 } | 794 } |
| 793 | 795 |
| (...skipping 6583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7377 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason); | 7379 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason); |
| 7378 return false; | 7380 return false; |
| 7379 } | 7381 } |
| 7380 | 7382 |
| 7381 return true; | 7383 return true; |
| 7382 } | 7384 } |
| 7383 | 7385 |
| 7384 void WebGLRenderingContextBase::dispatchContextLostEvent(TimerBase*) { | 7386 void WebGLRenderingContextBase::dispatchContextLostEvent(TimerBase*) { |
| 7385 WebGLContextEvent* event = WebGLContextEvent::create( | 7387 WebGLContextEvent* event = WebGLContextEvent::create( |
| 7386 EventTypeNames::webglcontextlost, false, true, ""); | 7388 EventTypeNames::webglcontextlost, false, true, ""); |
| 7387 if (getOffscreenCanvas()) | 7389 if (offscreenCanvas()) |
| 7388 getOffscreenCanvas()->dispatchEvent(event); | 7390 offscreenCanvas()->dispatchEvent(event); |
| 7389 else | 7391 else |
| 7390 canvas()->dispatchEvent(event); | 7392 canvas()->dispatchEvent(event); |
| 7391 m_restoreAllowed = event->defaultPrevented(); | 7393 m_restoreAllowed = event->defaultPrevented(); |
| 7392 if (m_restoreAllowed && !m_isHidden) { | 7394 if (m_restoreAllowed && !m_isHidden) { |
| 7393 if (m_autoRecoveryMethod == Auto) | 7395 if (m_autoRecoveryMethod == Auto) |
| 7394 m_restoreTimer.startOneShot(0, BLINK_FROM_HERE); | 7396 m_restoreTimer.startOneShot(0, BLINK_FROM_HERE); |
| 7395 } | 7397 } |
| 7396 } | 7398 } |
| 7397 | 7399 |
| 7398 void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) { | 7400 void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 7424 // enough. | 7426 // enough. |
| 7425 if (drawingBuffer()) { | 7427 if (drawingBuffer()) { |
| 7426 m_drawingBuffer->beginDestruction(); | 7428 m_drawingBuffer->beginDestruction(); |
| 7427 m_drawingBuffer.clear(); | 7429 m_drawingBuffer.clear(); |
| 7428 } | 7430 } |
| 7429 | 7431 |
| 7430 Platform::ContextAttributes attributes = | 7432 Platform::ContextAttributes attributes = |
| 7431 toPlatformContextAttributes(creationAttributes(), version()); | 7433 toPlatformContextAttributes(creationAttributes(), version()); |
| 7432 Platform::GraphicsInfo glInfo; | 7434 Platform::GraphicsInfo glInfo; |
| 7433 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider; | 7435 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider; |
| 7434 const auto& url = canvas() | 7436 const auto& url = canvas() ? canvas()->document().topDocument().url() |
| 7435 ? canvas()->document().topDocument().url() | 7437 : offscreenCanvas()->getExecutionContext()->url(); |
| 7436 : getOffscreenCanvas()->getExecutionContext()->url(); | |
| 7437 if (isMainThread()) { | 7438 if (isMainThread()) { |
| 7438 contextProvider = WTF::wrapUnique( | 7439 contextProvider = WTF::wrapUnique( |
| 7439 Platform::current()->createOffscreenGraphicsContext3DProvider( | 7440 Platform::current()->createOffscreenGraphicsContext3DProvider( |
| 7440 attributes, url, 0, &glInfo)); | 7441 attributes, url, 0, &glInfo)); |
| 7441 } else { | 7442 } else { |
| 7442 contextProvider = | 7443 contextProvider = |
| 7443 createContextProviderOnWorkerThread(attributes, &glInfo, url); | 7444 createContextProviderOnWorkerThread(attributes, &glInfo, url); |
| 7444 } | 7445 } |
| 7445 RefPtr<DrawingBuffer> buffer; | 7446 RefPtr<DrawingBuffer> buffer; |
| 7446 if (contextProvider && contextProvider->bindToCurrentThread()) { | 7447 if (contextProvider && contextProvider->bindToCurrentThread()) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7481 removeFromEvictedList(this); | 7482 removeFromEvictedList(this); |
| 7482 | 7483 |
| 7483 setupFlags(); | 7484 setupFlags(); |
| 7484 initializeNewContext(); | 7485 initializeNewContext(); |
| 7485 markContextChanged(CanvasContextChanged); | 7486 markContextChanged(CanvasContextChanged); |
| 7486 WebGLContextEvent* event = WebGLContextEvent::create( | 7487 WebGLContextEvent* event = WebGLContextEvent::create( |
| 7487 EventTypeNames::webglcontextrestored, false, true, ""); | 7488 EventTypeNames::webglcontextrestored, false, true, ""); |
| 7488 if (canvas()) | 7489 if (canvas()) |
| 7489 canvas()->dispatchEvent(event); | 7490 canvas()->dispatchEvent(event); |
| 7490 else | 7491 else |
| 7491 getOffscreenCanvas()->dispatchEvent(event); | 7492 offscreenCanvas()->dispatchEvent(event); |
| 7492 } | 7493 } |
| 7493 | 7494 |
| 7494 String WebGLRenderingContextBase::ensureNotNull(const String& text) const { | 7495 String WebGLRenderingContextBase::ensureNotNull(const String& text) const { |
| 7495 if (text.isNull()) | 7496 if (text.isNull()) |
| 7496 return WTF::emptyString(); | 7497 return WTF::emptyString(); |
| 7497 return text; | 7498 return text; |
| 7498 } | 7499 } |
| 7499 | 7500 |
| 7500 WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache( | 7501 WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache( |
| 7501 int capacity) | 7502 int capacity) |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7607 else | 7608 else |
| 7608 contextGL()->Disable(capability); | 7609 contextGL()->Disable(capability); |
| 7609 } | 7610 } |
| 7610 | 7611 |
| 7611 IntSize WebGLRenderingContextBase::clampedCanvasSize() const { | 7612 IntSize WebGLRenderingContextBase::clampedCanvasSize() const { |
| 7612 int width, height; | 7613 int width, height; |
| 7613 if (canvas()) { | 7614 if (canvas()) { |
| 7614 width = canvas()->width(); | 7615 width = canvas()->width(); |
| 7615 height = canvas()->height(); | 7616 height = canvas()->height(); |
| 7616 } else { | 7617 } else { |
| 7617 width = getOffscreenCanvas()->width(); | 7618 width = offscreenCanvas()->width(); |
| 7618 height = getOffscreenCanvas()->height(); | 7619 height = offscreenCanvas()->height(); |
| 7619 } | 7620 } |
| 7620 return IntSize(clamp(width, 1, m_maxViewportDims[0]), | 7621 return IntSize(clamp(width, 1, m_maxViewportDims[0]), |
| 7621 clamp(height, 1, m_maxViewportDims[1])); | 7622 clamp(height, 1, m_maxViewportDims[1])); |
| 7622 } | 7623 } |
| 7623 | 7624 |
| 7624 GLint WebGLRenderingContextBase::maxDrawBuffers() { | 7625 GLint WebGLRenderingContextBase::maxDrawBuffers() { |
| 7625 if (isContextLost() || | 7626 if (isContextLost() || |
| 7626 !(extensionEnabled(WebGLDrawBuffersName) || isWebGL2OrHigher())) | 7627 !(extensionEnabled(WebGLDrawBuffersName) || isWebGL2OrHigher())) |
| 7627 return 0; | 7628 return 0; |
| 7628 if (!m_maxDrawBuffers) | 7629 if (!m_maxDrawBuffers) |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7770 void WebGLRenderingContextBase::restoreUnpackParameters() { | 7771 void WebGLRenderingContextBase::restoreUnpackParameters() { |
| 7771 if (m_unpackAlignment != 1) | 7772 if (m_unpackAlignment != 1) |
| 7772 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); | 7773 contextGL()->PixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 7773 } | 7774 } |
| 7774 | 7775 |
| 7775 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( | 7776 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( |
| 7776 HTMLCanvasElementOrOffscreenCanvas& result) const { | 7777 HTMLCanvasElementOrOffscreenCanvas& result) const { |
| 7777 if (canvas()) | 7778 if (canvas()) |
| 7778 result.setHTMLCanvasElement(canvas()); | 7779 result.setHTMLCanvasElement(canvas()); |
| 7779 else | 7780 else |
| 7780 result.setOffscreenCanvas(getOffscreenCanvas()); | 7781 result.setOffscreenCanvas(offscreenCanvas()); |
| 7781 } | 7782 } |
| 7782 | 7783 |
| 7783 } // namespace blink | 7784 } // namespace blink |
| OLD | NEW |