⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286835 in webkit


Ignore:
Timestamp:
Dec 10, 2021, 12:11:25 AM (5 years ago)
Author:
Said Abou-Hallawa
Message:

[GPU Process] [Filters] Enable Filter rendering in GPU Process
https://bugs.webkit.org/show_bug.cgi?id=233989

Reviewed by Cameron McCormack.

This will move applying the CSSFilterImageValue, the CSSFilter and the
SVGFilter to GPUProcess.

  • css/CSSFilterImageValue.cpp:

(WebCore::CSSFilterImageValue::image):

  • rendering/RenderLayerFilters.cpp:

(WebCore::RenderLayerFilters::allocateBackingStoreIfNeeded):

  • rendering/RenderMenuList.cpp:

(RenderMenuList::hostWindow const):
Change the implementation to call RenderObject::hostWindow() since it is
now defined to be virtual in the two base classes.

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::hostWindow const):

  • rendering/RenderObject.h:

Add the helper function RenderObject::hostWindow() since it is being
requested in many places because of creating ImageBuffer for GPUProcess.

  • rendering/RenderSearchField.cpp:

(WebCore::RenderSearchField::hostWindow const):
Change the implementation to call RenderObject::hostWindow() since it is
now defined to be virtual in the two base classes.

  • rendering/svg/RenderSVGResourceClipper.cpp:

(WebCore::RenderSVGResourceClipper::applyClippingToContext):

  • rendering/svg/RenderSVGResourceFilter.cpp:

(WebCore::RenderSVGResourceFilter::applyResource):
(WebCore::RenderSVGResourceFilter::postApplyResource):

  • rendering/svg/RenderSVGResourceMasker.cpp:

(WebCore::RenderSVGResourceMasker::applyResource):
filterData.sourceGraphicBuffer will have to stay around because caching
the filter result has not been implemented yet.

  • rendering/svg/SVGRenderingContext.cpp:

(WebCore::SVGRenderingContext::createImageBuffer):

  • rendering/svg/SVGRenderingContext.h:
Location:
trunk/Source/WebCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286831 r286835  
     12021-12-10  Said Abou-Hallawa  <said@apple.com>
     2
     3        [GPU Process] [Filters] Enable Filter rendering in GPU Process
     4        https://bugs.webkit.org/show_bug.cgi?id=233989
     5
     6        Reviewed by Cameron McCormack.
     7
     8        This will move applying the CSSFilterImageValue, the CSSFilter and the
     9        SVGFilter to GPUProcess.
     10
     11        * css/CSSFilterImageValue.cpp:
     12        (WebCore::CSSFilterImageValue::image):
     13        * rendering/RenderLayerFilters.cpp:
     14        (WebCore::RenderLayerFilters::allocateBackingStoreIfNeeded):
     15        * rendering/RenderMenuList.cpp:
     16        (RenderMenuList::hostWindow const):
     17        Change the implementation to call RenderObject::hostWindow() since it is
     18        now defined to be virtual in the two base classes.
     19
     20        * rendering/RenderObject.cpp:
     21        (WebCore::RenderObject::hostWindow const):
     22        * rendering/RenderObject.h:
     23        Add the helper function RenderObject::hostWindow() since it is being
     24        requested in many places because of creating ImageBuffer for GPUProcess.
     25
     26        * rendering/RenderSearchField.cpp:
     27        (WebCore::RenderSearchField::hostWindow const):
     28        Change the implementation to call RenderObject::hostWindow() since it is
     29        now defined to be virtual in the two base classes.
     30
     31        * rendering/svg/RenderSVGResourceClipper.cpp:
     32        (WebCore::RenderSVGResourceClipper::applyClippingToContext):
     33        * rendering/svg/RenderSVGResourceFilter.cpp:
     34        (WebCore::RenderSVGResourceFilter::applyResource):
     35        (WebCore::RenderSVGResourceFilter::postApplyResource):
     36        * rendering/svg/RenderSVGResourceMasker.cpp:
     37        (WebCore::RenderSVGResourceMasker::applyResource):
     38        filterData.sourceGraphicBuffer will have to stay around because caching
     39        the filter result has not been implemented yet.
     40
     41        * rendering/svg/SVGRenderingContext.cpp:
     42        (WebCore::SVGRenderingContext::createImageBuffer):
     43        * rendering/svg/SVGRenderingContext.h:
     44
    1452021-12-09  Wenson Hsieh  <wenson_hsieh@apple.com>
    246
  • trunk/Source/WebCore/css/CSSFilterImageValue.cpp

    r286546 r286835  
    118118    // FIXME (149424): This buffer should not be unconditionally unaccelerated.
    119119    auto renderingMode = RenderingMode::Unaccelerated;
    120     auto sourceImage = ImageBuffer::create(size, renderingMode, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8);
     120    auto sourceImage = ImageBuffer::create(size, renderingMode, ShouldUseDisplayList::No, RenderingPurpose::DOM, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8, renderer.hostWindow());
    121121    if (!sourceImage)
    122122        return &Image::nullImage();
  • trunk/Source/WebCore/rendering/RenderLayerFilters.cpp

    r286546 r286835  
    140140#else
    141141        UNUSED_PARAM(targetContext);
    142         m_sourceImage = ImageBuffer::create(logicalSize, filter.renderingMode(), 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8);
     142        m_sourceImage = ImageBuffer::create(logicalSize, filter.renderingMode(), ShouldUseDisplayList::No, RenderingPurpose::DOM, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8, m_layer.renderer().hostWindow());
    143143#endif
    144144        if (auto context = inputContext())
  • trunk/Source/WebCore/rendering/RenderMenuList.cpp

    r284093 r286835  
    550550HostWindow* RenderMenuList::hostWindow() const
    551551{
    552     return view().frameView().hostWindow();
     552    return RenderFlexibleBox::hostWindow();
    553553}
    554554
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r286672 r286835  
    14551455}
    14561456
     1457HostWindow* RenderObject::hostWindow() const
     1458{
     1459    return view().frameView().root() ? view().frameView().root()->hostWindow() : nullptr;
     1460}
     1461
    14571462bool RenderObject::isRooted() const
    14581463{
  • trunk/Source/WebCore/rendering/RenderObject.h

    r286743 r286835  
    5555class HitTestRequest;
    5656class HitTestResult;
     57class HostWindow;
    5758class LegacyInlineBox;
    5859class Path;
     
    453454
    454455    RenderView& view() const { return *document().renderView(); };
     456    HostWindow* hostWindow() const;
    455457
    456458    // Returns true if this renderer is rooted.
  • trunk/Source/WebCore/rendering/RenderSearchField.cpp

    r283851 r286835  
    356356HostWindow* RenderSearchField::hostWindow() const
    357357{
    358     return view().frameView().hostWindow();
     358    return RenderTextControlSingleLine::hostWindow();
    359359}
    360360
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp

    r284336 r286835  
    155155    if (!clipperData.isValidForGeometry(objectBoundingBox, clippedContentBounds, absoluteTransform)) {
    156156        // FIXME (149469): This image buffer should not be unconditionally unaccelerated. Making it match the context breaks nested clipping, though.
    157         auto maskImage = SVGRenderingContext::createImageBuffer(clippedContentBounds, absoluteTransform, DestinationColorSpace::SRGB(), RenderingMode::Unaccelerated, &context);
     157        auto maskImage = SVGRenderingContext::createImageBuffer(clippedContentBounds, absoluteTransform, DestinationColorSpace::SRGB(), RenderingMode::Unaccelerated, nullptr, &context);
    158158        if (!maskImage)
    159159            return false;
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

    r286546 r286835  
    155155    auto colorSpace = DestinationColorSpace::SRGB();
    156156#endif
    157     auto sourceGraphic = SVGRenderingContext::createImageBuffer(filterData->drawingRegion, effectiveTransform, colorSpace, filterData->filter->renderingMode(), context);
     157    auto sourceGraphic = SVGRenderingContext::createImageBuffer(filterData->drawingRegion, effectiveTransform, colorSpace, filterData->filter->renderingMode(), renderer.hostWindow(), context);
    158158    if (!sourceGraphic) {
    159159        ASSERT(m_rendererFilterDataMap.contains(&renderer));
     
    218218        context->drawFilteredImageBuffer(filterData.sourceGraphicBuffer.get(), filterData.drawingRegion, *filterData.filter);
    219219    }
    220 
    221     filterData.sourceGraphicBuffer = nullptr;
    222220
    223221    LOG_WITH_STREAM(Filters, stream << "RenderSVGResourceFilter " << this << " postApplyResource done\n");
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp

    r283851 r286835  
    8585
    8686        // FIXME (149470): This image buffer should not be unconditionally unaccelerated. Making it match the context breaks alpha masking, though.
    87         maskerData->maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, maskColorSpace, RenderingMode::Unaccelerated, context);
     87        maskerData->maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, maskColorSpace, RenderingMode::Unaccelerated, nullptr, context);
    8888        if (!maskerData->maskImage)
    8989            return false;
  • trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp

    r286795 r286835  
    227227}
    228228
    229 RefPtr<ImageBuffer> SVGRenderingContext::createImageBuffer(const FloatRect& targetRect, const AffineTransform& absoluteTransform, const DestinationColorSpace& colorSpace, RenderingMode renderingMode, const GraphicsContext* context)
     229RefPtr<ImageBuffer> SVGRenderingContext::createImageBuffer(const FloatRect& targetRect, const AffineTransform& absoluteTransform, const DestinationColorSpace& colorSpace, RenderingMode renderingMode, const HostWindow* hostWindow, const GraphicsContext* context)
    230230{
    231231    IntRect paintRect = calculateImageBufferRect(targetRect, absoluteTransform);
     
    238238    if (ImageBuffer::sizeNeedsClamping(clampedSize, scale))
    239239        clampedSize = clampedSize * scale;
     240
     241#if USE(DIRECT2D)
     242    auto imageBuffer = ImageBuffer::create(clampedSize, renderingMode, context, 1, colorSpace, PixelFormat::BGRA8);
     243#else
     244    UNUSED_PARAM(context);
     245    auto imageBuffer = ImageBuffer::create(clampedSize, renderingMode, ShouldUseDisplayList::No, RenderingPurpose::DOM, 1, colorSpace, PixelFormat::BGRA8, hostWindow);
     246#endif
     247    if (!imageBuffer)
     248        return nullptr;
     249
     250    AffineTransform transform;
     251    transform.scale(scale).translate(-paintRect.location()).multiply(absoluteTransform);
     252
     253    GraphicsContext& imageContext = imageBuffer->context();
     254    imageContext.concatCTM(transform);
     255
     256    return imageBuffer;
     257}
     258
     259RefPtr<ImageBuffer> SVGRenderingContext::createImageBuffer(const FloatRect& targetRect, const FloatRect& clampedRect, const DestinationColorSpace& colorSpace, RenderingMode renderingMode, const GraphicsContext* context)
     260{
     261    IntSize clampedSize = roundedIntSize(clampedRect.size());
     262    FloatSize unclampedSize = roundedIntSize(targetRect.size());
     263
     264    // Don't create empty ImageBuffers.
     265    if (clampedSize.isEmpty())
     266        return nullptr;
    240267
    241268#if USE(DIRECT2D)
     
    248275        return nullptr;
    249276
    250     AffineTransform transform;
    251     transform.scale(scale).translate(-paintRect.location()).multiply(absoluteTransform);
    252 
    253     GraphicsContext& imageContext = imageBuffer->context();
    254     imageContext.concatCTM(transform);
    255 
    256     return imageBuffer;
    257 }
    258 
    259 RefPtr<ImageBuffer> SVGRenderingContext::createImageBuffer(const FloatRect& targetRect, const FloatRect& clampedRect, const DestinationColorSpace& colorSpace, RenderingMode renderingMode, const GraphicsContext* context)
    260 {
    261     IntSize clampedSize = roundedIntSize(clampedRect.size());
    262     FloatSize unclampedSize = roundedIntSize(targetRect.size());
    263 
    264     // Don't create empty ImageBuffers.
    265     if (clampedSize.isEmpty())
    266         return nullptr;
    267 
    268 #if USE(DIRECT2D)
    269     auto imageBuffer = ImageBuffer::create(clampedSize, renderingMode, context, 1, colorSpace, PixelFormat::BGRA8);
    270 #else
    271     UNUSED_PARAM(context);
    272     auto imageBuffer = ImageBuffer::create(clampedSize, renderingMode, 1, colorSpace, PixelFormat::BGRA8);
    273 #endif
    274     if (!imageBuffer)
    275         return nullptr;
    276 
    277277    GraphicsContext& imageContext = imageBuffer->context();
    278278
  • trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h

    r281064 r286835  
    6161    bool isRenderingPrepared() const { return m_renderingFlags & RenderingPrepared; }
    6262
    63     static RefPtr<ImageBuffer> createImageBuffer(const FloatRect& targetRect, const AffineTransform& absoluteTransform, const DestinationColorSpace&, RenderingMode, const GraphicsContext* = nullptr);
     63    static RefPtr<ImageBuffer> createImageBuffer(const FloatRect& targetRect, const AffineTransform& absoluteTransform, const DestinationColorSpace&, RenderingMode, const HostWindow* = nullptr, const GraphicsContext* = nullptr);
    6464    static RefPtr<ImageBuffer> createImageBuffer(const FloatRect& targetRect, const FloatRect& clampedRect, const DestinationColorSpace&, RenderingMode, const GraphicsContext* = nullptr);
    6565
Note: See TracChangeset for help on using the changeset viewer.