Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 39eb51251d8f207ebf556e5c1662a99d55960c71
https://github.com/WebKit/WebKit/commit/39eb51251d8f207ebf556e5c1662a99d55960c71
Author: Kimmo Kinnunen <[email protected]>
Date: 2026-02-13 (Fri, 13 Feb 2026)
Changed paths:
M
LayoutTests/fast/canvas/offscreen-giant-transfer-to-imagebitmap-expected.txt
M LayoutTests/fast/webgpu/draw-null-buffer-to-canvas-expected.txt
M
LayoutTests/platform/ios/fast/canvas/offscreen-giant-transfer-to-imagebitmap-expected.txt
M
LayoutTests/platform/mac-wk2/fast/canvas/offscreen-giant-transfer-to-imagebitmap-expected.txt
M Source/WebCore/SaferCPPExpectations/UncountedCallArgsCheckerExpectations
M Source/WebCore/dom/Document.cpp
M Source/WebCore/html/CanvasBase.cpp
M Source/WebCore/html/CanvasBase.h
M Source/WebCore/html/CustomPaintCanvas.cpp
M Source/WebCore/html/CustomPaintCanvas.h
M Source/WebCore/html/HTMLCanvasElement.cpp
M Source/WebCore/html/HTMLCanvasElement.h
M Source/WebCore/html/OffscreenCanvas.cpp
M Source/WebCore/html/OffscreenCanvas.h
M Source/WebCore/html/canvas/CanvasRenderingContext.cpp
M Source/WebCore/html/canvas/CanvasRenderingContext.h
M Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp
M Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h
M Source/WebCore/html/canvas/GPUBasedCanvasRenderingContext.h
M Source/WebCore/html/canvas/GPUCanvasContextCocoa.h
M Source/WebCore/html/canvas/GPUCanvasContextCocoa.mm
M Source/WebCore/html/canvas/ImageBitmapRenderingContext.cpp
M Source/WebCore/html/canvas/ImageBitmapRenderingContext.h
M Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.cpp
M Source/WebCore/html/canvas/PaintRenderingContext2D.cpp
M Source/WebCore/html/canvas/PaintRenderingContext2D.h
M Source/WebCore/html/canvas/PlaceholderRenderingContext.cpp
M Source/WebCore/html/canvas/PlaceholderRenderingContext.h
M Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp
M Source/WebCore/html/canvas/WebGLRenderingContextBase.h
M Source/WebCore/inspector/InspectorInstrumentation.cpp
M Source/WebCore/inspector/InspectorInstrumentation.h
M Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp
M Source/WebCore/inspector/agents/InspectorCanvasAgent.h
M Source/WebCore/rendering/RenderLayerBacking.cpp
Log Message:
-----------
CanvasBase owns a ImageBuffer that belongs to the CanvasRenderingContext
https://bugs.webkit.org/show_bug.cgi?id=275100
rdar://129208981
Reviewed by Simon Fraser.
Before, CanvasBase would own a ImageBuffer that was historically the
2d context drawing backing store. This ImageBuffer was then repurposed for
bitmaprenderer, webgl, webgpu backing store to paint all these contexts
to page (i.e layer) contents. This coden organization is not good,
because this dictates that the content will exist in an ImageBuffer.
This needs an extra draw to bitmap to be used. This in turn results
in loss of performance and memory for all context types, and loss
of correctness for bitmaprenderer.
Fix by moving the ImageBuffer backing store to
CanvasRenderingContext2DBase. Fix by introducing the paint buffer
backing store specific to each rendering context. In subsequent commits,
each of the context type may hold and assign the paint buffer backing
store in efficient manner suitable for each context type. Also in
subsequent commits, the paint storage will be held in NativeImages,
avoiding the need to use ImageBuffer for context types that do not
originate their images from ImageBuffer.
*
LayoutTests/platform/ios/fast/canvas/offscreen-giant-transfer-to-imagebitmap-expected.txt:
*
LayoutTests/platform/mac-wk2/fast/canvas/offscreen-giant-transfer-to-imagebitmap-expected.txt:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::getCSSCanvasContext):
* Source/WebCore/html/CanvasBase.cpp:
(WebCore::CanvasBase::~CanvasBase):
(WebCore::CanvasBase::makeRenderingResultsAvailable):
(WebCore::CanvasBase::setSize):
(WebCore::CanvasBase::shouldAccelerate const):
(WebCore::CanvasBase::validateArea const):
(WebCore::CanvasBase::buffer const): Deleted.
(WebCore::CanvasBase::setImageBuffer const): Deleted.
(WebCore::CanvasBase::allocateImageBuffer const): Deleted.
* Source/WebCore/html/CanvasBase.h:
(WebCore::CanvasBase::setImageBufferAndMarkDirty): Deleted.
(WebCore::CanvasBase::setHasCreatedImageBuffer): Deleted.
(WebCore::CanvasBase::hasCreatedImageBuffer const): Deleted.
(WebCore::CanvasBase::createImageBuffer const): Deleted.
* Source/WebCore/html/CustomPaintCanvas.cpp:
(WebCore::CustomPaintCanvas::~CustomPaintCanvas):
* Source/WebCore/html/CustomPaintCanvas.h:
* Source/WebCore/html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::~HTMLCanvasElement):
(WebCore::HTMLCanvasElement::attributeChanged):
(WebCore::HTMLCanvasElement::setSizeForControllingContext):
(WebCore::HTMLCanvasElement::didUpdateSizeProperties):
(WebCore::HTMLCanvasElement::setCSSCanvasContextSize): Deleted.
(WebCore::HTMLCanvasElement::createImageBuffer const): Deleted.
(WebCore::HTMLCanvasElement::setImageBufferAndMarkDirty): Deleted.
* Source/WebCore/html/HTMLCanvasElement.h:
* Source/WebCore/html/OffscreenCanvas.cpp:
(WebCore::OffscreenCanvas::~OffscreenCanvas):
(WebCore::OffscreenCanvas::setWidth):
(WebCore::OffscreenCanvas::setHeight):
(WebCore::OffscreenCanvas::setSizeForControllingContext):
(WebCore::OffscreenCanvas::didUpdateSizeProperties):
(WebCore::OffscreenCanvas::transferToImageBitmap):
(WebCore::OffscreenCanvas::createImageBuffer const): Deleted.
(WebCore::OffscreenCanvas::setImageBufferAndMarkDirty): Deleted.
* Source/WebCore/html/OffscreenCanvas.h:
* Source/WebCore/html/canvas/CanvasRenderingContext.cpp:
(WebCore::CanvasRenderingContext::updateMemoryCost const):
(WebCore::CanvasRenderingContext::surfaceBufferToImageBuffer): Deleted.
(WebCore::CanvasRenderingContext::isSurfaceBufferTransparentBlack const):
Deleted.
(WebCore::CanvasRenderingContext::updateMemoryCostOnAllocation): Deleted.
* Source/WebCore/html/canvas/CanvasRenderingContext.h:
* Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:
(WebCore::CanvasRenderingContext2DBase::~CanvasRenderingContext2DBase):
(WebCore::CanvasRenderingContext2DBase::surfaceBufferToImageBuffer):
(WebCore::CanvasRenderingContext2DBase::isSurfaceBufferTransparentBlack const):
(WebCore::CanvasRenderingContext2DBase::layerContentsDisplayDelegate):
(WebCore::CanvasRenderingContext2DBase::flushDeferredOperations):
(WebCore::CanvasRenderingContext2DBase::reset):
(WebCore::CanvasRenderingContext2DBase::didUpdateCanvasSizeProperties):
(WebCore::CanvasRenderingContext2DBase::drawingContext const):
(WebCore::CanvasRenderingContext2DBase::existingDrawingContext const):
(WebCore::CanvasRenderingContext2DBase::baseTransform const):
(WebCore::CanvasRenderingContext2DBase::prepareForDisplay):
(WebCore::CanvasRenderingContext2DBase::putImageData):
(WebCore::CanvasRenderingContext2DBase::getEffectiveRenderingModeForTesting):
(WebCore::CanvasRenderingContext2DBase::buffer const):
(WebCore::CanvasRenderingContext2DBase::allocateImageBuffer const):
* Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h:
(WebCore::CanvasRenderingContext2DBase::hasCreatedImageBuffer const):
* Source/WebCore/html/canvas/GPUBasedCanvasRenderingContext.h:
* Source/WebCore/html/canvas/GPUCanvasContextCocoa.h:
* Source/WebCore/html/canvas/GPUCanvasContextCocoa.mm:
(WebCore::GPUCanvasContextCocoa::didUpdateCanvasSizeProperties):
(WebCore::GPUCanvasContextCocoa::surfaceBufferToImageBuffer):
(WebCore::GPUCanvasContextCocoa::unconfigure):
(WebCore::GPUCanvasContextCocoa::prepareForDisplay):
(WebCore::GPUCanvasContextCocoa::markContextChangedAndNotifyCanvasObservers):
(WebCore::GPUCanvasContextCocoa::updateMemoryCost const):
(WebCore::GPUCanvasContextCocoa::reshape): Deleted.
* Source/WebCore/html/canvas/ImageBitmapRenderingContext.cpp:
(WebCore::ImageBitmapRenderingContext::transferFromImageBitmap):
(WebCore::ImageBitmapRenderingContext::transferToImageBuffer):
(WebCore::ImageBitmapRenderingContext::surfaceBufferToImageBuffer):
(WebCore::ImageBitmapRenderingContext::setBlank): Deleted.
* Source/WebCore/html/canvas/ImageBitmapRenderingContext.h:
* Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.cpp:
(WebCore::OffscreenCanvasRenderingContext2D::transferToImageBuffer):
* Source/WebCore/html/canvas/PlaceholderRenderingContext.cpp:
(WebCore::PlaceholderRenderingContext::setContentsToLayer):
(WebCore::PlaceholderRenderingContext::setPlaceholderBuffer):
(WebCore::PlaceholderRenderingContext::pixelFormat const):
(WebCore::PlaceholderRenderingContext::surfaceBufferToImageBuffer):
(WebCore::PlaceholderRenderingContext::isSurfaceBufferTransparentBlack const):
(WebCore::PlaceholderRenderingContext::didUpdateCanvasSizeProperties):
* Source/WebCore/html/canvas/PlaceholderRenderingContext.h:
* Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp:
(WebCore::WebGLRenderingContextBase::initializeNewContext):
(WebCore::WebGLRenderingContextBase::initializeContextState):
(WebCore::WebGLRenderingContextBase::markContextChangedAndNotifyCanvasObserver):
(WebCore::createImageBufferForWebGLContextReads):
(WebCore::WebGLRenderingContextBase::surfaceBufferToImageBuffer):
(WebCore::WebGLRenderingContextBase::transferToImageBuffer):
(WebCore::WebGLRenderingContextBase::didUpdateCanvasSizeProperties):
(WebCore::WebGLRenderingContextBase::prepareForDisplay):
(WebCore::WebGLRenderingContextBase::updateMemoryCost const):
(WebCore::WebGLRenderingContextBase::reshape): Deleted.
* Source/WebCore/html/canvas/WebGLRenderingContextBase.h:
* Source/WebCore/inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::didChangeCanvasMemoryImpl):
* Source/WebCore/inspector/InspectorInstrumentation.h:
(WebCore::InspectorInstrumentation::didChangeCanvasMemory):
* Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp:
(WebCore::InspectorCanvasAgent::didChangeCanvasMemory):
(WebCore::InspectorCanvasAgent::findInspectorCanvas):
* Source/WebCore/inspector/agents/InspectorCanvasAgent.h:
* Source/WebCore/rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::createPrimaryGraphicsLayer):
Canonical link: https://commits.webkit.org/307450@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications