| Index: third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
|
| index 32204cf95bc0171c5e8dd8cb31b6f30b823703c3..63509a2b5a8131e012a4f46a3f453ee76e8a0029 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
|
| @@ -53,11 +53,7 @@ OffscreenCanvasFrameDispatcherImpl::OffscreenCanvasFrameDispatcherImpl(
|
| mojo::GetProxy(&m_sink));
|
| }
|
|
|
| -// Case 1: both canvas and compositor are not gpu accelerated, or canvas is
|
| -// accelerated but --disable-gpu-compositing is specified, or
|
| -// WebGL's commit called with swiftshader. The last case is indicated by
|
| -// WebGraphicsContext3DProvider::isSoftwareRendering.
|
| -void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceInMemory(
|
| +void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceToSharedBitmap(
|
| cc::TransferableResource& resource,
|
| RefPtr<StaticBitmapImage> image) {
|
| std::unique_ptr<cc::SharedBitmap> bitmap =
|
| @@ -83,10 +79,10 @@ void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceInMemory(
|
| m_sharedBitmaps.add(m_nextResourceId, std::move(bitmap));
|
| }
|
|
|
| -// Case 2: canvas is not gpu-accelerated, but compositor is
|
| -void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceMemoryToTexture(
|
| - cc::TransferableResource& resource,
|
| - RefPtr<StaticBitmapImage> image) {
|
| +void OffscreenCanvasFrameDispatcherImpl::
|
| + setTransferableResourceToSharedGPUContext(
|
| + cc::TransferableResource& resource,
|
| + RefPtr<StaticBitmapImage> image) {
|
| // TODO(crbug.com/652707): When committing the first frame, there is no
|
| // instance of SharedGpuContext yet, calling SharedGpuContext::gl() will
|
| // trigger a creation of an instace, which requires to create a
|
| @@ -118,10 +114,6 @@ void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceMemoryToTexture(
|
| gl->TexImage2D(GL_TEXTURE_2D, 0, format, m_width, m_height, 0, format,
|
| GL_UNSIGNED_BYTE, 0);
|
| gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
| - // The pixel data will be uploaded to GPU memory, we have to keep the GPU
|
| - // memory alive until browser ReturnResources, so here we put textureId for
|
| - // that piece of GPU memory into a hashmap.
|
| - m_cachedTextureIds.add(m_nextResourceId, textureId);
|
| gl->TexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_width, m_height, format,
|
| GL_UNSIGNED_BYTE, dstPixels->data());
|
|
|
| @@ -138,12 +130,16 @@ void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceMemoryToTexture(
|
| gpu::MailboxHolder(mailbox, syncToken, GL_TEXTURE_2D);
|
| resource.read_lock_fences_enabled = false;
|
| resource.is_software = false;
|
| +
|
| + // Hold ref to |textureId| for the piece of GPU memory where the pixel data
|
| + // is uploaded to, to keep it alive until the browser ReturnResources.
|
| + m_cachedTextureIds.add(m_nextResourceId, textureId);
|
| }
|
|
|
| -// Case 3: both canvas and compositor are gpu accelerated.
|
| -void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceInTexture(
|
| - cc::TransferableResource& resource,
|
| - RefPtr<StaticBitmapImage> image) {
|
| +void OffscreenCanvasFrameDispatcherImpl::
|
| + setTransferableResourceToStaticBitmapImage(
|
| + cc::TransferableResource& resource,
|
| + RefPtr<StaticBitmapImage> image) {
|
| image->ensureMailbox();
|
| resource.mailbox_holder = gpu::MailboxHolder(
|
| image->getMailbox(), image->getSyncToken(), GL_TEXTURE_2D);
|
| @@ -155,11 +151,10 @@ void OffscreenCanvasFrameDispatcherImpl::setTransferableResourceInTexture(
|
| m_cachedImages.add(m_nextResourceId, std::move(image));
|
| }
|
|
|
| -// When WebGL's commit is called on SwiftShader, we have software rendered
|
| -// WebGL.
|
| void OffscreenCanvasFrameDispatcherImpl::dispatchFrame(
|
| RefPtr<StaticBitmapImage> image,
|
| - bool isWebGLSoftwareRendering) {
|
| + bool isWebGLSoftwareRendering /* This flag is true when WebGL's commit is
|
| + called on SwiftShader. */) {
|
| if (!image)
|
| return;
|
| if (!verifyImageSize(image->imageForCurrentFrame()))
|
| @@ -188,18 +183,22 @@ void OffscreenCanvasFrameDispatcherImpl::dispatchFrame(
|
| // TODO(crbug.com/646022): making this overlay-able.
|
| resource.is_overlay_candidate = false;
|
|
|
| - if (!image->isTextureBacked() &&
|
| - !Platform::current()->isGPUCompositingEnabled())
|
| - setTransferableResourceInMemory(resource, image);
|
| - else if (!image->isTextureBacked() &&
|
| - Platform::current()->isGPUCompositingEnabled())
|
| - setTransferableResourceMemoryToTexture(resource, image);
|
| - else if (image->isTextureBacked() &&
|
| - (!Platform::current()->isGPUCompositingEnabled() ||
|
| - isWebGLSoftwareRendering))
|
| - setTransferableResourceInMemory(resource, image);
|
| - else
|
| - setTransferableResourceInTexture(resource, image);
|
| + if (image->isTextureBacked() &&
|
| + Platform::current()->isGPUCompositingEnabled() &&
|
| + !isWebGLSoftwareRendering) {
|
| + // Case 1: both canvas and compositor are gpu accelerated.
|
| + setTransferableResourceToStaticBitmapImage(resource, image);
|
| + } else if (!Platform::current()->isGPUCompositingEnabled() ||
|
| + isWebGLSoftwareRendering) {
|
| + // Case 2: both canvas and compositor are not gpu accelerated, or canvas is
|
| + // accelerated but --disable-gpu-compositing is specified, or
|
| + // WebGL's commit called with swiftshader. The last case is indicated by
|
| + // WebGraphicsContext3DProvider::isSoftwareRendering.
|
| + setTransferableResourceToSharedBitmap(resource, image);
|
| + } else {
|
| + // Case 3: canvas is not gpu-accelerated, but compositor is.
|
| + setTransferableResourceToSharedGPUContext(resource, image);
|
| + }
|
|
|
| m_nextResourceId++;
|
| frame.delegated_frame_data->resource_list.push_back(std::move(resource));
|
|
|