Skip to content

Commit

Permalink
Move CreationContext out of ImageBuffer.
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=249106

Reviewed by Cameron McCormack.

This makes it possible to forward declare the type.

* Source/WebCore/html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::createImageBuffer const):
* Source/WebCore/platform/graphics/ImageBuffer.h:
(WebCore::CreationContext::CreationContext):
(WebCore::ImageBuffer::CreationContext::CreationContext): Deleted.
* Source/WebCore/platform/graphics/cairo/ImageBufferCairoImageSurfaceBackend.cpp:
(WebCore::ImageBufferCairoImageSurfaceBackend::create):
* Source/WebCore/platform/graphics/cairo/ImageBufferCairoImageSurfaceBackend.h:
* Source/WebCore/platform/graphics/cg/ImageBufferCGBitmapBackend.cpp:
(WebCore::ImageBufferCGBitmapBackend::create):
* Source/WebCore/platform/graphics/cg/ImageBufferCGBitmapBackend.h:
* Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.cpp:
(WebCore::ImageBufferIOSurfaceBackend::create):
* Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.h:
* Source/WebKit/Shared/RemoteLayerTree/CGDisplayListImageBufferBackend.h:
* Source/WebKit/Shared/RemoteLayerTree/CGDisplayListImageBufferBackend.mm:
(WebKit::CGDisplayListImageBufferBackend::create):
(WebKit::CGDisplayListImageBufferBackend::CGDisplayListImageBufferBackend):
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h:
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
(WebKit::RemoteLayerBackingStore::ensureFrontBuffer):
* Source/WebKit/WebProcess/GPU/graphics/ImageBufferShareableBitmapBackend.cpp:
(WebKit::ImageBufferShareableBitmapBackend::create):
* Source/WebKit/WebProcess/GPU/graphics/ImageBufferShareableBitmapBackend.h:
* Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferShareableMappedIOSurfaceBackend.cpp:
(WebKit::ImageBufferShareableMappedIOSurfaceBackend::create):
* Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferShareableMappedIOSurfaceBackend.h:

Canonical link: https://commits.webkit.org/257708@main
  • Loading branch information
mattwoodrow committed Dec 11, 2022
1 parent 20eb361 commit 790ce21
Show file tree
Hide file tree
Showing 20 changed files with 48 additions and 44 deletions.
2 changes: 1 addition & 1 deletion Source/WebCore/html/HTMLCanvasElement.cpp
Expand Up @@ -1019,7 +1019,7 @@ void HTMLCanvasElement::createImageBuffer() const
return std::pair { m_context->colorSpace(), m_context->pixelFormat() };
return std::pair { DestinationColorSpace::SRGB(), PixelFormat::BGRA8 };
}();
ImageBuffer::CreationContext context = { };
ImageBufferCreationContext context = { };
context.graphicsClient = hostWindow;
context.avoidIOSurfaceSizeCheckInWebProcessForTesting = m_avoidBackendSizeCheckForTesting;
setImageBuffer(ImageBuffer::create(size(), RenderingPurpose::Canvas, 1, colorSpace, pixelFormat, bufferOptions, context));
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/ImageBuffer.cpp
Expand Up @@ -52,7 +52,7 @@ namespace WebCore {
static const float MaxClampedLength = 4096;
static const float MaxClampedArea = MaxClampedLength * MaxClampedLength;

RefPtr<ImageBuffer> ImageBuffer::create(const FloatSize& size, RenderingPurpose purpose, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, OptionSet<ImageBufferOptions> options, const CreationContext& creationContext)
RefPtr<ImageBuffer> ImageBuffer::create(const FloatSize& size, RenderingPurpose purpose, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, OptionSet<ImageBufferOptions> options, const ImageBufferCreationContext& creationContext)
{
RefPtr<ImageBuffer> imageBuffer;

Expand Down
48 changes: 26 additions & 22 deletions Source/WebCore/platform/graphics/ImageBuffer.h
Expand Up @@ -42,51 +42,55 @@ class GraphicsClient;
#if HAVE(IOSURFACE)
class IOSurfacePool;
#endif
class ScriptExecutionContext;

enum class ImageBufferOptions : uint8_t {
Accelerated = 1 << 0,
UseDisplayList = 1 << 1
};

class ImageBuffer : public ThreadSafeRefCounted<ImageBuffer>, public CanMakeWeakPtr<ImageBuffer> {
public:
struct CreationContext {
// clang 13.1.6 throws errors if we use default initializers here.
GraphicsClient* graphicsClient;
class SerializedImageBuffer;

struct ImageBufferCreationContext {
// clang 13.1.6 throws errors if we use default initializers here.
GraphicsClient* graphicsClient;
#if HAVE(IOSURFACE)
IOSurfacePool* surfacePool;
IOSurfacePool* surfacePool;
#endif
bool avoidIOSurfaceSizeCheckInWebProcessForTesting = false;
bool avoidIOSurfaceSizeCheckInWebProcessForTesting = false;

#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
enum class UseCGDisplayListImageCache : bool { No, Yes };
UseCGDisplayListImageCache useCGDisplayListImageCache;
enum class UseCGDisplayListImageCache : bool { No, Yes };
UseCGDisplayListImageCache useCGDisplayListImageCache;
#endif

CreationContext(GraphicsClient* client = nullptr
ImageBufferCreationContext(GraphicsClient* client = nullptr
#if HAVE(IOSURFACE)
, IOSurfacePool* pool = nullptr
, IOSurfacePool* pool = nullptr
#endif
, bool avoidCheck = false
, bool avoidCheck = false
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
, UseCGDisplayListImageCache useCGDisplayListImageCache = UseCGDisplayListImageCache::No
, UseCGDisplayListImageCache useCGDisplayListImageCache = UseCGDisplayListImageCache::No
#endif
)
: graphicsClient(client)
)
: graphicsClient(client)
#if HAVE(IOSURFACE)
, surfacePool(pool)
, surfacePool(pool)
#endif
, avoidIOSurfaceSizeCheckInWebProcessForTesting(avoidCheck)
, avoidIOSurfaceSizeCheckInWebProcessForTesting(avoidCheck)
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
, useCGDisplayListImageCache(useCGDisplayListImageCache)
, useCGDisplayListImageCache(useCGDisplayListImageCache)
#endif
{ }
};
{ }
};

class ImageBuffer : public ThreadSafeRefCounted<ImageBuffer>, public CanMakeWeakPtr<ImageBuffer> {
public:

WEBCORE_EXPORT static RefPtr<ImageBuffer> create(const FloatSize&, RenderingPurpose, float resolutionScale, const DestinationColorSpace&, PixelFormat, OptionSet<ImageBufferOptions> = { }, const CreationContext& = { });
WEBCORE_EXPORT static RefPtr<ImageBuffer> create(const FloatSize&, RenderingPurpose, float resolutionScale, const DestinationColorSpace&, PixelFormat, OptionSet<ImageBufferOptions> = { }, const ImageBufferCreationContext& = { });

template<typename BackendType, typename ImageBufferType = ImageBuffer, typename... Arguments>
static RefPtr<ImageBufferType> create(const FloatSize& size, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, RenderingPurpose purpose, const CreationContext& creationContext, Arguments&&... arguments)
static RefPtr<ImageBufferType> create(const FloatSize& size, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, RenderingPurpose purpose, const ImageBufferCreationContext& creationContext, Arguments&&... arguments)
{
auto parameters = ImageBufferBackend::Parameters { size, resolutionScale, colorSpace, pixelFormat, purpose };
auto backend = BackendType::create(parameters, creationContext);
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/PlatformImageBuffer.h
Expand Up @@ -55,7 +55,7 @@ using AcceleratedImageBufferBackend = UnacceleratedImageBufferBackend;
#if HAVE(IOSURFACE)
class IOSurfaceImageBuffer final : public ImageBuffer {
public:
static auto create(const FloatSize& size, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, RenderingPurpose purpose, const CreationContext& creationContext = { })
static auto create(const FloatSize& size, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, RenderingPurpose purpose, const ImageBufferCreationContext& creationContext = { })
{
return ImageBuffer::create<ImageBufferIOSurfaceBackend, IOSurfaceImageBuffer>(size, resolutionScale, colorSpace, pixelFormat, purpose, creationContext);
}
Expand Down
Expand Up @@ -73,7 +73,7 @@ size_t ImageBufferCairoImageSurfaceBackend::calculateMemoryCost(const Parameters
return ImageBufferBackend::calculateMemoryCost(backendSize, calculateBytesPerRow(backendSize));
}

std::unique_ptr<ImageBufferCairoImageSurfaceBackend> ImageBufferCairoImageSurfaceBackend::create(const Parameters& parameters, const ImageBuffer::CreationContext&)
std::unique_ptr<ImageBufferCairoImageSurfaceBackend> ImageBufferCairoImageSurfaceBackend::create(const Parameters& parameters, const ImageBufferCreationContext&)
{
ASSERT(parameters.pixelFormat == PixelFormat::BGRA8);

Expand Down
Expand Up @@ -44,7 +44,7 @@ class ImageBufferCairoImageSurfaceBackend : public ImageBufferCairoSurfaceBacken
static unsigned calculateBytesPerRow(const IntSize& backendSize);
static size_t calculateMemoryCost(const Parameters&);

static std::unique_ptr<ImageBufferCairoImageSurfaceBackend> create(const Parameters&, const ImageBuffer::CreationContext&);
static std::unique_ptr<ImageBufferCairoImageSurfaceBackend> create(const Parameters&, const ImageBufferCreationContext&);
static std::unique_ptr<ImageBufferCairoImageSurfaceBackend> create(const Parameters&, const GraphicsContext&);

private:
Expand Down
Expand Up @@ -62,7 +62,7 @@ size_t ImageBufferCGBitmapBackend::calculateMemoryCost(const Parameters& paramet
return ImageBufferBackend::calculateMemoryCost(backendSize, calculateBytesPerRow(backendSize));
}

std::unique_ptr<ImageBufferCGBitmapBackend> ImageBufferCGBitmapBackend::create(const Parameters& parameters, const ImageBuffer::CreationContext&)
std::unique_ptr<ImageBufferCGBitmapBackend> ImageBufferCGBitmapBackend::create(const Parameters& parameters, const ImageBufferCreationContext&)
{
ASSERT(parameters.pixelFormat == PixelFormat::BGRA8);

Expand Down
Expand Up @@ -42,7 +42,7 @@ class ImageBufferCGBitmapBackend final : public ImageBufferCGBackend {
static IntSize calculateSafeBackendSize(const Parameters&);
static size_t calculateMemoryCost(const Parameters&);

static std::unique_ptr<ImageBufferCGBitmapBackend> create(const Parameters&, const ImageBuffer::CreationContext&);
static std::unique_ptr<ImageBufferCGBitmapBackend> create(const Parameters&, const ImageBufferCreationContext&);

// FIXME: Rename to createUsingColorSpaceOfGraphicsContext() (or something like that).
static std::unique_ptr<ImageBufferCGBitmapBackend> create(const Parameters&, const GraphicsContext&);
Expand Down
Expand Up @@ -84,7 +84,7 @@ RetainPtr<CGColorSpaceRef> ImageBufferIOSurfaceBackend::contextColorSpace(const
return ImageBufferCGBackend::contextColorSpace(context);
}

std::unique_ptr<ImageBufferIOSurfaceBackend> ImageBufferIOSurfaceBackend::create(const Parameters& parameters, const ImageBuffer::CreationContext& creationContext)
std::unique_ptr<ImageBufferIOSurfaceBackend> ImageBufferIOSurfaceBackend::create(const Parameters& parameters, const ImageBufferCreationContext& creationContext)
{
IntSize backendSize = calculateSafeBackendSize(parameters);
if (backendSize.isEmpty())
Expand Down
Expand Up @@ -44,7 +44,7 @@ class WEBCORE_EXPORT ImageBufferIOSurfaceBackend : public ImageBufferCGBackend {
static size_t calculateMemoryCost(const Parameters&);
static size_t calculateExternalMemoryCost(const Parameters&);

static std::unique_ptr<ImageBufferIOSurfaceBackend> create(const Parameters&, const ImageBuffer::CreationContext&);
static std::unique_ptr<ImageBufferIOSurfaceBackend> create(const Parameters&, const ImageBufferCreationContext&);
// FIXME: Rename to createUsingColorSpaceOfGraphicsContext() (or something like that).
static std::unique_ptr<ImageBufferIOSurfaceBackend> create(const Parameters&, const GraphicsContext&);

Expand Down
Expand Up @@ -35,7 +35,7 @@ namespace DisplayList {
class ImageBuffer final : public WebCore::ImageBuffer {
public:
template<typename BackendType>
static auto create(const FloatSize& size, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, RenderingPurpose purpose, const WebCore::ImageBuffer::CreationContext& creationContext)
static auto create(const FloatSize& size, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat, RenderingPurpose purpose, const WebCore::ImageBufferCreationContext& creationContext)
{
return WebCore::ImageBuffer::create<BackendType, ImageBuffer>(size, resolutionScale, colorSpace, pixelFormat, purpose, creationContext);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h
Expand Up @@ -42,7 +42,7 @@ class RemoteImageBuffer : public WebCore::ImageBuffer {
template<typename BackendType>
static RefPtr<RemoteImageBuffer> create(const WebCore::FloatSize& size, float resolutionScale, const WebCore::DestinationColorSpace& colorSpace, WebCore::PixelFormat pixelFormat, WebCore::RenderingPurpose purpose, RemoteRenderingBackend& remoteRenderingBackend, QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
{
auto context = ImageBuffer::CreationContext { nullptr
auto context = WebCore::ImageBufferCreationContext { nullptr
#if HAVE(IOSURFACE)
, &remoteRenderingBackend.ioSurfacePool()
#endif
Expand Down
Expand Up @@ -34,15 +34,15 @@

namespace WebKit {

using UseCGDisplayListImageCache = WebCore::ImageBuffer::CreationContext::UseCGDisplayListImageCache;
using UseCGDisplayListImageCache = WebCore::ImageBufferCreationContext::UseCGDisplayListImageCache;

class CGDisplayListImageBufferBackend final : public WebCore::ImageBufferCGBackend, public ImageBufferBackendHandleSharing {
WTF_MAKE_ISO_ALLOCATED(CGDisplayListImageBufferBackend);
WTF_MAKE_NONCOPYABLE(CGDisplayListImageBufferBackend);
public:
static size_t calculateMemoryCost(const Parameters&);

static std::unique_ptr<CGDisplayListImageBufferBackend> create(const Parameters&, const WebCore::ImageBuffer::CreationContext&);
static std::unique_ptr<CGDisplayListImageBufferBackend> create(const Parameters&, const WebCore::ImageBufferCreationContext&);

WebCore::GraphicsContext& context() const final;
WebCore::IntSize backendSize() const final;
Expand All @@ -56,7 +56,7 @@ class CGDisplayListImageBufferBackend final : public WebCore::ImageBufferCGBacke
void putPixelBuffer(const WebCore::PixelBuffer&, const WebCore::IntRect& srcRect, const WebCore::IntPoint& destPoint, WebCore::AlphaPremultiplication destFormat) final;

protected:
CGDisplayListImageBufferBackend(const Parameters&, const WebCore::ImageBuffer::CreationContext&);
CGDisplayListImageBufferBackend(const Parameters&, const WebCore::ImageBufferCreationContext&);

unsigned bytesPerRow() const final;

Expand Down
Expand Up @@ -109,15 +109,15 @@ void setCGShadow(WebCore::RenderingMode renderingMode, const WebCore::FloatSize&
return WebCore::ImageBufferBackend::calculateMemoryCost(backendSize, calculateBytesPerRow(backendSize));
}

std::unique_ptr<CGDisplayListImageBufferBackend> CGDisplayListImageBufferBackend::create(const Parameters& parameters, const WebCore::ImageBuffer::CreationContext& creationContext)
std::unique_ptr<CGDisplayListImageBufferBackend> CGDisplayListImageBufferBackend::create(const Parameters& parameters, const WebCore::ImageBufferCreationContext& creationContext)
{
if (parameters.logicalSize.isEmpty())
return nullptr;

return std::unique_ptr<CGDisplayListImageBufferBackend>(new CGDisplayListImageBufferBackend(parameters, creationContext));
}

CGDisplayListImageBufferBackend::CGDisplayListImageBufferBackend(const Parameters& parameters, const WebCore::ImageBuffer::CreationContext& creationContext)
CGDisplayListImageBufferBackend::CGDisplayListImageBufferBackend(const Parameters& parameters, const WebCore::ImageBufferCreationContext& creationContext)
: ImageBufferCGBackend { parameters }
{
if (creationContext.useCGDisplayListImageCache == UseCGDisplayListImageCache::Yes)
Expand Down
Expand Up @@ -48,7 +48,7 @@ class RemoteLayerBackingStoreCollection;
enum class SwapBuffersDisplayRequirement : uint8_t;

#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
using UseCGDisplayListImageCache = WebCore::ImageBuffer::CreationContext::UseCGDisplayListImageCache;
using UseCGDisplayListImageCache = WebCore::ImageBufferCreationContext::UseCGDisplayListImageCache;
#endif

class RemoteLayerBackingStore {
Expand Down
Expand Up @@ -376,7 +376,7 @@

#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
if (!m_displayListBuffer && m_parameters.includeDisplayList == IncludeDisplayList::Yes) {
ImageBuffer::CreationContext creationContext;
ImageBufferCreationContext creationContext;
creationContext.useCGDisplayListImageCache = m_parameters.useCGDisplayListImageCache;
// FIXME: This should use colorSpace(), not hardcode sRGB.
m_displayListBuffer = ImageBuffer::create<CGDisplayListImageBufferBackend>(m_parameters.size, m_parameters.scale, DestinationColorSpace::SRGB(), pixelFormat(), RenderingPurpose::DOM, WTFMove(creationContext));
Expand Down
Expand Up @@ -75,7 +75,7 @@ size_t ImageBufferShareableBitmapBackend::calculateMemoryCost(const Parameters&
return ImageBufferBackend::calculateMemoryCost(backendSize, calculateBytesPerRow(parameters, backendSize));
}

std::unique_ptr<ImageBufferShareableBitmapBackend> ImageBufferShareableBitmapBackend::create(const Parameters& parameters, const WebCore::ImageBuffer::CreationContext&)
std::unique_ptr<ImageBufferShareableBitmapBackend> ImageBufferShareableBitmapBackend::create(const Parameters& parameters, const WebCore::ImageBufferCreationContext&)
{
ASSERT(parameters.pixelFormat == PixelFormat::BGRA8);

Expand Down
Expand Up @@ -48,7 +48,7 @@ class ImageBufferShareableBitmapBackend final : public WebCore::PlatformImageBuf
static unsigned calculateBytesPerRow(const Parameters&, const WebCore::IntSize& backendSize);
static size_t calculateMemoryCost(const Parameters&);

static std::unique_ptr<ImageBufferShareableBitmapBackend> create(const Parameters&, const WebCore::ImageBuffer::CreationContext&);
static std::unique_ptr<ImageBufferShareableBitmapBackend> create(const Parameters&, const WebCore::ImageBufferCreationContext&);
static std::unique_ptr<ImageBufferShareableBitmapBackend> create(const Parameters&, ImageBufferBackendHandle);

ImageBufferShareableBitmapBackend(const Parameters&, Ref<ShareableBitmap>&&, std::unique_ptr<WebCore::GraphicsContext>&&);
Expand Down
Expand Up @@ -40,7 +40,7 @@ using namespace WebCore;

WTF_MAKE_ISO_ALLOCATED_IMPL(ImageBufferShareableMappedIOSurfaceBackend);

std::unique_ptr<ImageBufferShareableMappedIOSurfaceBackend> ImageBufferShareableMappedIOSurfaceBackend::create(const Parameters& parameters, const ImageBuffer::CreationContext& creationContext)
std::unique_ptr<ImageBufferShareableMappedIOSurfaceBackend> ImageBufferShareableMappedIOSurfaceBackend::create(const Parameters& parameters, const ImageBufferCreationContext& creationContext)
{
IntSize backendSize = calculateSafeBackendSize(parameters);
if (backendSize.isEmpty())
Expand Down
Expand Up @@ -41,7 +41,7 @@ class ImageBufferShareableMappedIOSurfaceBackend final : public WebCore::ImageBu
WTF_MAKE_ISO_ALLOCATED(ImageBufferShareableMappedIOSurfaceBackend);
WTF_MAKE_NONCOPYABLE(ImageBufferShareableMappedIOSurfaceBackend);
public:
static std::unique_ptr<ImageBufferShareableMappedIOSurfaceBackend> create(const Parameters&, const WebCore::ImageBuffer::CreationContext&);
static std::unique_ptr<ImageBufferShareableMappedIOSurfaceBackend> create(const Parameters&, const WebCore::ImageBufferCreationContext&);
static std::unique_ptr<ImageBufferShareableMappedIOSurfaceBackend> create(const Parameters&, ImageBufferBackendHandle);

using WebCore::ImageBufferIOSurfaceBackend::ImageBufferIOSurfaceBackend;
Expand Down

0 comments on commit 790ce21

Please sign in to comment.