Skip to content

Commit

Permalink
Move Context2D testing properties from HTMLCanvasElement to context o…
Browse files Browse the repository at this point in the history
…ptions

https://bugs.webkit.org/show_bug.cgi?id=261404
rdar://115282259

Reviewed by Matt Woodrow.

Context2D testing options should be related to the rendering context,
not to the canvas element. Move the property
avoidIOSurfaceSizeCheckInWebProcess as general purpose context 2d
option "renderingMode". This enables testing the various backends
comprehensively in the future.

* LayoutTests/fast/canvas/image-buffer-iosurface-disabled.html:
* Source/WebCore/html/CanvasBase.cpp:
(WebCore::CanvasBase::allocateImageBuffer const):
* Source/WebCore/html/CanvasBase.h:
* Source/WebCore/html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::createImageBuffer const):
(WebCore::HTMLCanvasElement::setAvoidIOSurfaceSizeCheckInWebProcessForTesting): Deleted.
* Source/WebCore/html/HTMLCanvasElement.h:
* Source/WebCore/html/OffscreenCanvas.cpp:
(WebCore::OffscreenCanvas::transferToImageBitmap):
(WebCore::OffscreenCanvas::createImageBuffer const):
* Source/WebCore/html/canvas/CanvasRenderingContext.h:
(WebCore::CanvasRenderingContext::adjustImageBufferOptionsForTesting):
* Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:
(WebCore::CanvasRenderingContext2DBase::adjustImageBufferOptionsForTesting):
* Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h:
* Source/WebCore/html/canvas/CanvasRenderingContext2DSettings.h:
* Source/WebCore/html/canvas/CanvasRenderingContext2DSettings.idl:
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::avoidIOSurfaceSizeCheckInWebProcess): Deleted.
* Source/WebCore/testing/Internals.h:
* Source/WebCore/testing/Internals.idl:

Canonical link: https://commits.webkit.org/267934@main
  • Loading branch information
kkinnunen-apple committed Sep 13, 2023
1 parent 6020033 commit 5f5c97a
Show file tree
Hide file tree
Showing 14 changed files with 54 additions and 40 deletions.
6 changes: 2 additions & 4 deletions LayoutTests/fast/canvas/image-buffer-iosurface-disabled.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
testRunner.dumpAsText();
var canvas = document.createElement('canvas');
canvas.height = 16385;
canvas.width = 16385;
if (window.internals)
internals.avoidIOSurfaceSizeCheckInWebProcess(canvas);
var context = canvas.getContext("2d");
canvas.width = 7;
var context = canvas.getContext("2d", { renderingModeForTesting: "Accelerated" });
context.fillRect(0,0,canvas.width, canvas.height);
</script>
19 changes: 11 additions & 8 deletions Source/WebCore/html/CanvasBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ bool CanvasBase::shouldAccelerate(unsigned area) const
#endif
}

RefPtr<ImageBuffer> CanvasBase::allocateImageBuffer(bool avoidBackendSizeCheckForTesting) const
RefPtr<ImageBuffer> CanvasBase::allocateImageBuffer() const
{
auto checkedArea = size().area<RecordOverflow>();

Expand All @@ -348,13 +348,16 @@ RefPtr<ImageBuffer> CanvasBase::allocateImageBuffer(bool avoidBackendSizeCheckFo
OptionSet<ImageBufferOptions> bufferOptions;
if (shouldAccelerate(area))
bufferOptions.add(ImageBufferOptions::Accelerated);
if (avoidBackendSizeCheckForTesting)
bufferOptions.add(ImageBufferOptions::AvoidBackendSizeCheckForTesting);
auto [colorSpace, pixelFormat] = [&] {
if (renderingContext())
return std::pair { renderingContext()->colorSpace(), renderingContext()->pixelFormat() };
return std::pair { DestinationColorSpace::SRGB(), PixelFormat::BGRA8 };
}();

auto colorSpace = DestinationColorSpace::SRGB();
auto pixelFormat = PixelFormat::BGRA8;

if (auto* context = renderingContext()) {
bufferOptions = context->adjustImageBufferOptionsForTesting(bufferOptions);
colorSpace = context->colorSpace();
pixelFormat = context->pixelFormat();
}

return ImageBuffer::create(size(), RenderingPurpose::Canvas, 1, colorSpace, pixelFormat, bufferOptions, graphicsClient());
}

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/html/CanvasBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ class CanvasBase {
virtual bool hasCreatedImageBuffer() const { return false; }
static size_t activePixelMemory();

RefPtr<ImageBuffer> allocateImageBuffer(bool avoidBackendSizeCheckForTesting) const;
RefPtr<ImageBuffer> allocateImageBuffer() const;
String lastFillText() const { return m_lastFillText; }

private:
Expand Down
7 changes: 1 addition & 6 deletions Source/WebCore/html/HTMLCanvasElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -876,18 +876,13 @@ SecurityOrigin* HTMLCanvasElement::securityOrigin() const
return &document().securityOrigin();
}

void HTMLCanvasElement::setAvoidIOSurfaceSizeCheckInWebProcessForTesting()
{
m_avoidBackendSizeCheckForTesting = true;
}

void HTMLCanvasElement::createImageBuffer() const
{
ASSERT(!hasCreatedImageBuffer());

m_hasCreatedImageBuffer = true;
m_didClearImageBuffer = true;
setImageBuffer(allocateImageBuffer(m_avoidBackendSizeCheckForTesting));
setImageBuffer(allocateImageBuffer());

#if USE(IOSURFACE_CANVAS_BACKING_STORE)
if (m_context && m_context->is2d()) {
Expand Down
3 changes: 0 additions & 3 deletions Source/WebCore/html/HTMLCanvasElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,6 @@ class HTMLCanvasElement final : public HTMLElement, public CanvasBase, public Ac

bool isControlledByOffscreen() const;

WEBCORE_EXPORT void setAvoidIOSurfaceSizeCheckInWebProcessForTesting();

void queueTaskKeepingObjectAlive(TaskSource, Function<void()>&&) final;
void dispatchEvent(Event&) final;

Expand Down Expand Up @@ -191,7 +189,6 @@ class HTMLCanvasElement final : public HTMLElement, public CanvasBase, public Ac
std::unique_ptr<CanvasRenderingContext> m_context;
mutable RefPtr<Image> m_copiedImage; // FIXME: This is temporary for platforms that have to copy the image buffer to render (and for CSSCanvasValue).
std::unique_ptr<CSSParserContext> m_cssParserContext;
bool m_avoidBackendSizeCheckForTesting { false };
bool m_ignoreReset { false };
// m_hasCreatedImageBuffer means we tried to malloc the buffer. We didn't necessarily get it.
mutable bool m_hasCreatedImageBuffer { false };
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/html/OffscreenCanvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ ExceptionOr<RefPtr<ImageBitmap>> OffscreenCanvas::transferToImageBitmap()
return { RefPtr<ImageBitmap> { nullptr } };

if (!m_hasCreatedImageBuffer) {
auto buffer = allocateImageBuffer(false);
auto buffer = allocateImageBuffer();
if (!buffer)
return { RefPtr<ImageBitmap> { nullptr } };
return { ImageBitmap::create(ImageBitmapBacking(WTFMove(buffer))) };
Expand Down Expand Up @@ -354,7 +354,7 @@ ExceptionOr<RefPtr<ImageBitmap>> OffscreenCanvas::transferToImageBitmap()
// store from this canvas (or its context), but for now we'll just
// create a new bitmap and paint into it.

auto imageBitmap = ImageBitmap::create(allocateImageBuffer(false));
auto imageBitmap = ImageBitmap::create(allocateImageBuffer());
if (!imageBitmap->buffer())
return { RefPtr<ImageBitmap> { nullptr } };

Expand Down Expand Up @@ -542,7 +542,7 @@ void OffscreenCanvas::scheduleCommitToPlaceholderCanvas()
void OffscreenCanvas::createImageBuffer() const
{
m_hasCreatedImageBuffer = true;
setImageBuffer(allocateImageBuffer(false));
setImageBuffer(allocateImageBuffer());
}

void OffscreenCanvas::setImageBufferAndMarkDirty(RefPtr<ImageBuffer>&& buffer)
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/html/canvas/CanvasRenderingContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ class CanvasRenderingContext : public ScriptWrappable, public CanMakeWeakPtr<Can

virtual PixelFormat pixelFormat() const;
virtual DestinationColorSpace colorSpace() const;
virtual OptionSet<ImageBufferOptions> adjustImageBufferOptionsForTesting(OptionSet<ImageBufferOptions> bufferOptions) { return bufferOptions; }

protected:
explicit CanvasRenderingContext(CanvasBase&);
Expand Down
19 changes: 19 additions & 0 deletions Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2876,4 +2876,23 @@ DestinationColorSpace CanvasRenderingContext2DBase::colorSpace() const
return toDestinationColorSpace(m_settings.colorSpace);
}

OptionSet<ImageBufferOptions> CanvasRenderingContext2DBase::adjustImageBufferOptionsForTesting(OptionSet<ImageBufferOptions> bufferOptions)
{
if (!m_settings.renderingModeForTesting)
return bufferOptions;
switch (*m_settings.renderingModeForTesting) {
case CanvasRenderingContext2DSettings::RenderingMode::Default:
break;
case CanvasRenderingContext2DSettings::RenderingMode::Unaccelerated:
bufferOptions.remove(ImageBufferOptions::Accelerated);
bufferOptions.add(ImageBufferOptions::AvoidBackendSizeCheckForTesting);
break;
case CanvasRenderingContext2DSettings::RenderingMode::Accelerated:
bufferOptions.add(ImageBufferOptions::Accelerated);
bufferOptions.add(ImageBufferOptions::AvoidBackendSizeCheckForTesting);
break;
}
return bufferOptions;
}

} // namespace WebCore
2 changes: 2 additions & 0 deletions Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,8 @@ class CanvasRenderingContext2DBase : public CanvasRenderingContext, public Canva

bool usesCSSCompatibilityParseMode() const { return m_usesCSSCompatibilityParseMode; }

OptionSet<ImageBufferOptions> adjustImageBufferOptionsForTesting(OptionSet<ImageBufferOptions>) final;

private:
struct CachedImageData {
CachedImageData(CanvasRenderingContext2DBase&);
Expand Down
7 changes: 7 additions & 0 deletions Source/WebCore/html/canvas/CanvasRenderingContext2DSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,19 @@
#pragma once

#include "PredefinedColorSpace.h"
#include <optional>

namespace WebCore {

struct CanvasRenderingContext2DSettings {
enum class RenderingMode {
Default,
Unaccelerated,
Accelerated,
};
bool desynchronized { false };
PredefinedColorSpace colorSpace { PredefinedColorSpace::SRGB };
std::optional<RenderingMode> renderingModeForTesting;
};

} // namespace WebCore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/

enum CanvasRenderingContext2DRenderingMode {
"Default",
"Unaccelerated",
"Accelerated",
};

// https://html.spec.whatwg.org/multipage/canvas.html#canvasrenderingcontext2dsettings
[
JSGenerateToJSObject,
Expand All @@ -31,4 +37,5 @@
// boolean alpha = true;
boolean desynchronized = false;
[EnabledBySetting=CanvasColorSpaceEnabled] PredefinedColorSpace colorSpace = "srgb";
[EnabledBySetting=DOMTestingAPIsEnabled] CanvasRenderingContext2DRenderingMode renderingModeForTesting;
};
13 changes: 0 additions & 13 deletions Source/WebCore/testing/Internals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7111,19 +7111,6 @@ String Internals::modelInlinePreviewUUIDForModelElement(const HTMLModelElement&

#endif

void Internals::avoidIOSurfaceSizeCheckInWebProcess(HTMLCanvasElement& element)
{
auto* document = contextDocument();
if (!document)
return;
auto* page = document->page();
if (!page)
return;
page->settings().setMaximumAccelerated2dCanvasSize(UINT_MAX);
CanvasBase::setMaxCanvasAreaForTesting(UINT_MAX);
element.setAvoidIOSurfaceSizeCheckInWebProcessForTesting();
}

bool Internals::hasSleepDisabler() const
{
auto* document = contextDocument();
Expand Down
1 change: 0 additions & 1 deletion Source/WebCore/testing/Internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -1385,7 +1385,6 @@ class Internals final : public RefCounted<Internals>, private ContextDestruction
String modelInlinePreviewUUIDForModelElement(const HTMLModelElement&) const;
#endif

void avoidIOSurfaceSizeCheckInWebProcess(HTMLCanvasElement&);
bool hasSleepDisabler() const;

void acceptTypedArrays(Int32Array&);
Expand Down
1 change: 0 additions & 1 deletion Source/WebCore/testing/Internals.idl
Original file line number Diff line number Diff line change
Expand Up @@ -1212,7 +1212,6 @@ typedef (FetchRequest or FetchResponse) FetchObject;

[Conditional=ARKIT_INLINE_PREVIEW_MAC] Promise<sequence<DOMString>> modelInlinePreviewUUIDs();
[Conditional=ARKIT_INLINE_PREVIEW_MAC] DOMString modelInlinePreviewUUIDForModelElement(HTMLModelElement modelElement);
undefined avoidIOSurfaceSizeCheckInWebProcess(HTMLCanvasElement element);

boolean hasSleepDisabler();

Expand Down

0 comments on commit 5f5c97a

Please sign in to comment.