Title: [249335] trunk/Source
Revision
249335
Author
bfulg...@apple.com
Date
2019-08-30 11:20:22 -0700 (Fri, 30 Aug 2019)

Log Message

[FTW] Use DirectX SharedResource as basis for SharedBitmap
https://bugs.webkit.org/show_bug.cgi?id=201157

Reviewed by Alex Christensen.

Source/WebCore:

Currently an ID2D1Bitmap is used as the backing store for the SharedBitmap that is the
base type for sharing data between the WebContent Process and the UIProcess. However, this
involves moving GPU memory to local memory, copying that memory into the SharedMemory member
of the SharedBitmap, then building a new GPU bitmap on the UIProcess side from that SharedMemory.

Profiling indicates that this is the single largest place FTW WebKit spends its time.

Instead, we should use Direct2D's ability to render to an IDXGISurface, which can be shared
between multiple processes. This should avoid the GPU->CPU copy, the Direct2D-allocated
CPU->Shared Memory copy, and the shared memory to GPU copy.

* platform/graphics/win/BackingStoreBackendDirect2D.h:
(WebCore::BackingStoreBackendDirect2D::renderTarget const): Change type.
(WebCore::BackingStoreBackendDirect2D::dxSurface const): Added.
(WebCore::BackingStoreBackendDirect2D::BackingStoreBackendDirect2D): Require a DXD11 device.
* platform/graphics/win/BackingStoreBackendDirect2DImpl.cpp:
(WebCore::BackingStoreBackendDirect2DImpl::BackingStoreBackendDirect2DImpl): Use Direct2D's
IDXGISurface to make a render target we can use to support our fast cross-process sharing.
(WebCore::BackingStoreBackendDirect2DImpl::scroll):
* platform/graphics/win/BackingStoreBackendDirect2DImpl.h:
* platform/graphics/win/Direct2DOperations.cpp:
(WebCore::Direct2D::fillRect): Remove unneeded PlatformContextStateSaver.
(WebCore::Direct2D::fillRoundedRect): Ditto.
(WebCore::Direct2D::fillRectWithGradient): Ditto.
(WebCore::Direct2D::fillPath): Ditto.
(WebCore::Direct2D::strokePath): Ditto.
* platform/graphics/win/Direct2DUtilities.cpp:
(WebCore::Direct2D::pixelFormat): Switch to constants for bitmap format.
(WebCore::Direct2D::createDXGISurfaceOfSize): Added.
(WebCore::Direct2D::createSurfaceRenderTarget): Added.
(WebCore::Direct2D::writeDiagnosticPNGToPath):
(WebCore::Direct2D::dxgiImmediateContext): Added.
(WebCore::Direct2D::defaultDirectXDevice): Added.
(WebCore::Direct2D::createDeviceAndContext): Added.
(WebCore::Direct2D::toDXGIDevice): Added.
(WebCore::Direct2D::factoryForDXGIDevice): Added.
* platform/graphics/win/Direct2DUtilities.h:

Source/WebKit:

Currently an ID2D1Bitmap is used as the backing store for the SharedBitmap that is the
base type for sharing data between the WebContent Process and the UIProcess. However, this
involves moving GPU memory to local memory, copying that memory into the SharedMemory member
of the SharedBitmap, then building a new GPU bitmap on the UIProcess side from that SharedMemory.

Profiling indicates that this is the single largest place FTW WebKit spends its time.

Instead, we should use Direct2D's ability to render to an IDXGISurface, which can be shared
between multiple processes. This should avoid the GPU->CPU copy, the Direct2D-allocated
CPU->Shared Memory copy, and the shared memory to GPU copy.

Reviewed by Alex Christensen.

* Platform/SharedMemory.h:
* Platform/win/SharedMemoryWin.cpp:
(WebKit::SharedMemory::Handle::encodeHandle): Added.
(WebKit::SharedMemory::Handle::encode const): Use new helper function.
(WebKit::SharedMemory::Handle::decodeHandle): Added.
(WebKit::SharedMemory::Handle::decode): Use new helper function.
* PlatformFTW.cmake: Add D3X11 libraries.
* Shared/ShareableBitmap.cpp:
(WebKit::ShareableBitmap::Configuration::encode const): Encode shared resource handle for DX texture.
(WebKit::ShareableBitmap::Configuration::decode): Ditto (but decode).
(WebKit::ShareableBitmap::ShareableBitmap): Create SharedResource (if needed).
(WebKit::ShareableBitmap::~ShareableBitmap): Add cleanup code for SharedResoure.
(WebKit::ShareableBitmap::numBytesForSize): Only allocate a small memory store when using GPU textures.
* Shared/ShareableBitmap.h:
(WebKit::ShareableBitmap::dxSurface):
* Shared/win/ShareableBitmapDirect2D.cpp:
(WebKit::ShareableBitmap::createSharedResource): Added.
(WebKit::ShareableBitmap::disposeSharedResource): Added.
(WebKit::ShareableBitmap::leakSharedResource): Added.
(WebKit::ShareableBitmap::createGraphicsContext): Update for new data types.
(WebKit::ShareableBitmap::paint): Ditto.
(WebKit::ShareableBitmap::createDirect2DSurface): Update for new data types.
(WebKit::ShareableBitmap::createImage): Ditto.
(WebKit::createSurfaceFromData): Deleted.
(WebKit::ShareableBitmap::sync): Deleted.
* UIProcess/BackingStore.cpp:
* UIProcess/BackingStore.h:
* UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.cpp:
* UIProcess/WebPageProxy.cpp:
* UIProcess/WebPageProxy.h:
* UIProcess/win/BackingStoreDirect2D.cpp:
(WebKit::BackingStore::createBackend):
(WebKit::BackingStore::paint):
(WebKit::BackingStore::incorporateUpdate):
* UIProcess/win/PageClientImpl.cpp:
* UIProcess/win/WebPageProxyWin.cpp:
(WebKit::WebPageProxy::device const):
(WebKit::WebPageProxy::setDevice):
* UIProcess/win/WebView.cpp:
(WebKit::WebView::WebView): Initialize DirectX stuff.
(WebKit::WebView::paint): Use new DiretX drawing logic.
(WebKit::WebView::onSizeEvent): Update SwapChain's buffer sizes when resizing.
(WebKit::WebView::setupSwapChain): Added.
(WebKit::WebView::configureBackingStore): Added.
* UIProcess/win/WebView.h:
(WebKit::WebView::d3dDevice):
* WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp:
(WebKit::DrawingAreaCoordinatedGraphics::display):

Source/WebKitLegacy:

* PlatformFTW.cmake: Link to DirectX to avoid build failure.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (249334 => 249335)


--- trunk/Source/WebCore/ChangeLog	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/ChangeLog	2019-08-30 18:20:22 UTC (rev 249335)
@@ -1,3 +1,48 @@
+2019-08-30  Brent Fulgham  <bfulg...@apple.com>
+
+        [FTW] Use DirectX SharedResource as basis for SharedBitmap
+        https://bugs.webkit.org/show_bug.cgi?id=201157
+
+        Reviewed by Alex Christensen.
+
+        Currently an ID2D1Bitmap is used as the backing store for the SharedBitmap that is the
+        base type for sharing data between the WebContent Process and the UIProcess. However, this
+        involves moving GPU memory to local memory, copying that memory into the SharedMemory member
+        of the SharedBitmap, then building a new GPU bitmap on the UIProcess side from that SharedMemory.
+
+        Profiling indicates that this is the single largest place FTW WebKit spends its time.
+
+        Instead, we should use Direct2D's ability to render to an IDXGISurface, which can be shared
+        between multiple processes. This should avoid the GPU->CPU copy, the Direct2D-allocated
+        CPU->Shared Memory copy, and the shared memory to GPU copy.
+ 
+        * platform/graphics/win/BackingStoreBackendDirect2D.h:
+        (WebCore::BackingStoreBackendDirect2D::renderTarget const): Change type.
+        (WebCore::BackingStoreBackendDirect2D::dxSurface const): Added.
+        (WebCore::BackingStoreBackendDirect2D::BackingStoreBackendDirect2D): Require a DXD11 device.
+        * platform/graphics/win/BackingStoreBackendDirect2DImpl.cpp:
+        (WebCore::BackingStoreBackendDirect2DImpl::BackingStoreBackendDirect2DImpl): Use Direct2D's
+        IDXGISurface to make a render target we can use to support our fast cross-process sharing.
+        (WebCore::BackingStoreBackendDirect2DImpl::scroll):
+        * platform/graphics/win/BackingStoreBackendDirect2DImpl.h:
+        * platform/graphics/win/Direct2DOperations.cpp:
+        (WebCore::Direct2D::fillRect): Remove unneeded PlatformContextStateSaver.
+        (WebCore::Direct2D::fillRoundedRect): Ditto.
+        (WebCore::Direct2D::fillRectWithGradient): Ditto.
+        (WebCore::Direct2D::fillPath): Ditto.
+        (WebCore::Direct2D::strokePath): Ditto.
+        * platform/graphics/win/Direct2DUtilities.cpp:
+        (WebCore::Direct2D::pixelFormat): Switch to constants for bitmap format.
+        (WebCore::Direct2D::createDXGISurfaceOfSize): Added.
+        (WebCore::Direct2D::createSurfaceRenderTarget): Added.
+        (WebCore::Direct2D::writeDiagnosticPNGToPath):
+        (WebCore::Direct2D::dxgiImmediateContext): Added.
+        (WebCore::Direct2D::defaultDirectXDevice): Added.
+        (WebCore::Direct2D::createDeviceAndContext): Added.
+        (WebCore::Direct2D::toDXGIDevice): Added.
+        (WebCore::Direct2D::factoryForDXGIDevice): Added.
+        * platform/graphics/win/Direct2DUtilities.h:
+
 2019-08-30  Sihui Liu  <sihui_...@apple.com>
 
         IndexedDB: update size of database when database operation is completed

Modified: trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2D.h (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2D.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2D.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -34,7 +34,9 @@
 
 interface ID2D1Bitmap;
 interface ID2D1BitmapBrush;
-interface ID2D1DCRenderTarget;
+interface ID2D1RenderTarget;
+interface ID3D11Device1;
+interface IDXGISurface1;
 
 namespace WebCore {
 
@@ -44,8 +46,9 @@
 public:
     virtual ~BackingStoreBackendDirect2D() = default;
 
-    ID2D1DCRenderTarget* renderTarget() const { return m_renderTarget.get(); }
+    ID2D1RenderTarget* renderTarget() const { return m_renderTarget.get(); }
     ID2D1Bitmap* surface() const { return m_surface.get(); }
+    IDXGISurface1* dxSurface() const { return m_dxSurface.get(); }
     const IntSize& size() const { return m_size; }
 
     virtual void scroll(const IntRect& scrollRect, const IntSize& scrollOffset) = 0;
@@ -52,12 +55,15 @@
     virtual ID2D1BitmapBrush* bitmapBrush() = 0;
 
 protected:
-    BackingStoreBackendDirect2D(const IntSize& size)
-        : m_size(size)
+    BackingStoreBackendDirect2D(const IntSize& size, ID3D11Device1* device)
+        : m_device(device)
+        , m_size(size)
     {
     }
 
-    COMPtr<ID2D1DCRenderTarget> m_renderTarget;
+    COMPtr<ID3D11Device1> m_device;
+    COMPtr<ID2D1RenderTarget> m_renderTarget;
+    COMPtr<IDXGISurface1> m_dxSurface;
     COMPtr<ID2D1Bitmap> m_surface;
     IntSize m_size;
 };

Modified: trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.cpp (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -34,6 +34,7 @@
 #include "ImageDecoderDirect2D.h"
 #include "IntRect.h"
 #include "IntSize.h"
+#include <d3d11_1.h>
 #include <wincodec.h>
 
 namespace WebCore {
@@ -40,18 +41,22 @@
 
 static const Seconds scrollHysteresisDuration { 300_ms };
 
-BackingStoreBackendDirect2DImpl::BackingStoreBackendDirect2DImpl(const IntSize& size, float deviceScaleFactor)
-    : BackingStoreBackendDirect2D(size)
+BackingStoreBackendDirect2DImpl::BackingStoreBackendDirect2DImpl(const IntSize& size, float deviceScaleFactor, ID3D11Device1* device)
+    : BackingStoreBackendDirect2D(size, device)
     , m_scrolledHysteresis([this](PAL::HysteresisState state) {
         if (state == PAL::HysteresisState::Stopped)
             m_scrollSurface = nullptr;
         }, scrollHysteresisDuration)
 {
-    m_renderTarget = WebCore::Direct2D::createGDIRenderTarget();
-
     IntSize scaledSize = m_size;
     scaledSize.scale(deviceScaleFactor);
-    m_surface = Direct2D::createBitmap(m_renderTarget.get(), scaledSize);
+
+    m_dxSurface = WebCore::Direct2D::createDXGISurfaceOfSize(scaledSize, m_device.get(), false);
+    m_renderTarget = WebCore::Direct2D::createSurfaceRenderTarget(m_dxSurface.get());
+
+    auto bitmapProperties = Direct2D::bitmapProperties();
+    HRESULT hr = m_renderTarget->CreateSharedBitmap(__uuidof(IDXGISurface1), reinterpret_cast<void*>(m_dxSurface.get()), &bitmapProperties, &m_surface);
+    RELEASE_ASSERT(SUCCEEDED(hr));
 }
 
 BackingStoreBackendDirect2DImpl::~BackingStoreBackendDirect2DImpl()
@@ -70,7 +75,12 @@
         ASSERT(m_size.height() >= scrollRect.size().height());
 #endif
         m_scrollSurfaceSize = sourceRect.size();
-        m_scrollSurface = Direct2D::createBitmap(m_renderTarget.get(), m_scrollSurfaceSize);
+        m_dxScrollSurface = WebCore::Direct2D::createDXGISurfaceOfSize(m_scrollSurfaceSize, m_device.get(), false);
+
+        m_scrollSurface = nullptr;
+        auto bitmapProperties = Direct2D::bitmapProperties();
+        HRESULT hr = m_renderTarget->CreateSharedBitmap(__uuidof(IDXGISurface1), reinterpret_cast<void*>(m_dxScrollSurface.get()), &bitmapProperties, &m_scrollSurface);
+        RELEASE_ASSERT(SUCCEEDED(hr));
     }
 
     auto sourceRectLocation = IntSize(sourceRect.x(), sourceRect.y());

Modified: trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.h (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -31,7 +31,7 @@
 #include <pal/HysteresisActivity.h>
 
 interface ID2D1BitmapBrush;
-interface IWICBitmap;
+interface IDXGISurface1;
 
 namespace WebCore {
 
@@ -39,7 +39,7 @@
 
 class BackingStoreBackendDirect2DImpl final : public BackingStoreBackendDirect2D {
 public:
-    WEBCORE_EXPORT BackingStoreBackendDirect2DImpl(const IntSize&, float deviceScaleFactor);
+    WEBCORE_EXPORT BackingStoreBackendDirect2DImpl(const IntSize&, float deviceScaleFactor, ID3D11Device1*);
     virtual ~BackingStoreBackendDirect2DImpl();
 
 private:
@@ -48,6 +48,7 @@
 
     IntSize m_scrollSurfaceSize;
     COMPtr<ID2D1Bitmap> m_scrollSurface;
+    COMPtr<IDXGISurface1> m_dxScrollSurface;
     COMPtr<ID2D1BitmapBrush> m_bitmapBrush;
 
     PAL::HysteresisActivity m_scrolledHysteresis;

Modified: trunk/Source/WebCore/platform/graphics/win/Direct2DOperations.cpp (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/Direct2DOperations.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/Direct2DOperations.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -406,7 +406,6 @@
     auto context = platformContext.renderTarget();
 
     context->SetTags(1, __LINE__);
-    PlatformContextStateSaver stateSaver(platformContext);
     Function<void(ID2D1RenderTarget*)> drawFunction = [&platformContext, rect, &fillSource](ID2D1RenderTarget* renderTarget) {
         const D2D1_RECT_F d2dRect = rect;
         renderTarget->FillRectangle(&d2dRect, fillSource.brush.get());
@@ -423,7 +422,6 @@
     auto context = platformContext.renderTarget();
 
     context->SetTags(1, __LINE__);
-    PlatformContextStateSaver stateSaver(platformContext);
     Function<void(ID2D1RenderTarget*)> drawFunction = [&platformContext, color, rect](ID2D1RenderTarget* renderTarget) {
         const D2D1_RECT_F d2dRect = rect;
         renderTarget->FillRectangle(&d2dRect, platformContext.brushWithColor(color).get());
@@ -446,7 +444,6 @@
     bool equalHeights = (radii.topLeft().height() == radii.bottomLeft().height() && radii.bottomLeft().height() == radii.topRight().height() && radii.topRight().height() == radii.bottomRight().height());
     bool hasCustomFill = false; // FIXME: Why isn't a FillSource passed to this function?
     if (!hasCustomFill && equalWidths && equalHeights && radii.topLeft().width() * 2 == r.width() && radii.topLeft().height() * 2 == r.height()) {
-        PlatformContextStateSaver stateSaver(platformContext);
         Function<void(ID2D1RenderTarget*)> drawFunction = [&platformContext, color, rect, radii, r](ID2D1RenderTarget* renderTarget) {
             auto roundedRect = D2D1::RoundedRect(r, radii.topLeft().width(), radii.topLeft().height());
             renderTarget->FillRoundedRectangle(&roundedRect, platformContext.brushWithColor(color).get());
@@ -457,7 +454,6 @@
         else
             drawWithoutShadow(platformContext, r, drawFunction);
     } else {
-        PlatformContextStateSaver stateSaver(platformContext);
         Path path;
         path.addRoundedRect(rect);
         fillPath(platformContext, path, color, shadowState);
@@ -489,7 +485,6 @@
     auto context = platformContext.renderTarget();
 
     context->SetTags(1, __LINE__);
-    PlatformContextStateSaver stateSaver(platformContext);
     Function<void(ID2D1RenderTarget*)> drawFunction = [&platformContext, rect, &gradient](ID2D1RenderTarget* renderTarget) {
         const D2D1_RECT_F d2dRect = rect;
         renderTarget->FillRectangle(&d2dRect, gradient);
@@ -506,8 +501,6 @@
         path.activePath()->Close();
     }
 
-    PlatformContextStateSaver stateSaver(platformContext);
-
     auto context = platformContext.renderTarget();
 
     context->SetTags(1, __LINE__);
@@ -574,7 +567,6 @@
     
     context->SetTags(1, __LINE__);
 
-    PlatformContextStateSaver stateSaver(platformContext);
     auto boundingRect = path.fastBoundingRect();
     Function<void(ID2D1RenderTarget*)> drawFunction = [&platformContext, &path, &strokeSource](ID2D1RenderTarget* renderTarget) {
         renderTarget->DrawGeometry(path.platformPath(), strokeSource.brush.get(), strokeSource.thickness, platformContext.strokeStyle());
@@ -766,7 +758,7 @@
 {
     auto bitmapSize = image->GetSize();
 
-    float currHeight = orientation.usesWidthAsHeight() ? bitmapSize.width : bitmapSize.height;
+    float currHeight = options.orientation().usesWidthAsHeight() ? bitmapSize.width : bitmapSize.height;
     if (currHeight <= srcRect.y())
         return;
 

Modified: trunk/Source/WebCore/platform/graphics/win/Direct2DOperations.h (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/Direct2DOperations.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/Direct2DOperations.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -128,8 +128,8 @@
 
 void drawGlyphs(PlatformContextDirect2D&, const FillSource&, const StrokeSource&, const ShadowState&, const FloatPoint&, const Font&, double, const Vector<unsigned short>& glyphs, const Vector<float>& horizontalAdvances, const Vector<DWRITE_GLYPH_OFFSET>&, float, TextDrawingModeFlags, float, const FloatSize&, const Color&);
 
-void drawNativeImage(PlatformContextDirect2D&, IWICBitmap*, const FloatSize& imageSize, const FloatRect&, const FloatRect&, CompositeOperator, BlendMode, ImageOrientation, InterpolationQuality, float, const ShadowState&);
-void drawNativeImage(PlatformContextDirect2D&, ID2D1Bitmap*, const FloatSize& imageSize, const FloatRect&, const FloatRect&, CompositeOperator, BlendMode, ImageOrientation, InterpolationQuality, float, const ShadowState&);
+void drawNativeImage(PlatformContextDirect2D&, IWICBitmap*, const FloatSize& imageSize, const FloatRect&, const FloatRect&, const ImagePaintingOptions& options, float, const ShadowState&);
+void drawNativeImage(PlatformContextDirect2D&, ID2D1Bitmap*, const FloatSize& imageSize, const FloatRect&, const FloatRect&, const ImagePaintingOptions& options, float, const ShadowState&);
 void drawPath(PlatformContextDirect2D&, const Path&, const StrokeSource&, const ShadowState&);
 void drawPattern(PlatformContextDirect2D&, COMPtr<ID2D1Bitmap>&&, const IntSize&, const FloatRect&, const FloatRect&, const AffineTransform&, const FloatPoint&, CompositeOperator, BlendMode);
 

Modified: trunk/Source/WebCore/platform/graphics/win/Direct2DUtilities.cpp (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/Direct2DUtilities.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/Direct2DUtilities.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -38,6 +38,7 @@
 #include "IntRect.h"
 #include "IntSize.h"
 #include <d2d1_1.h>
+#include <d3d11_1.h>
 #include <shlwapi.h>
 #include <wincodec.h>
 
@@ -46,6 +47,9 @@
 
 namespace Direct2D {
 
+constexpr DXGI_FORMAT webkitTextureFormat = DXGI_FORMAT_B8G8R8A8_UNORM;
+constexpr D2D1_ALPHA_MODE webkitAlphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
+
 IntSize bitmapSize(IWICBitmapSource* bitmapSource)
 {
     UINT width, height;
@@ -140,7 +144,7 @@
 D2D1_PIXEL_FORMAT pixelFormat()
 {
     // Since we need to interact with HDC from time-to-time, we are forced to use DXGI_FORMAT_B8G8R8A8_UNORM and D2D1_ALPHA_MODE_PREMULTIPLIED
-    return D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED);
+    return D2D1::PixelFormat(webkitTextureFormat, webkitAlphaMode);
 }
 
 GUID wicBitmapFormat()
@@ -228,6 +232,53 @@
     return bitmapContext;
 }
 
+COMPtr<IDXGISurface1> createDXGISurfaceOfSize(const IntSize& size, ID3D11Device1* directXDevice, bool crossProcess)
+{
+    if (!directXDevice)
+        directXDevice = Direct2D::defaultDirectXDevice();
+
+    // Create the render target texture
+    D3D11_TEXTURE2D_DESC desc;
+    ZeroMemory(&desc, sizeof(desc));
+    desc.Width = size.width();
+    desc.Height = size.height();
+    desc.MipLevels = 1;
+    desc.ArraySize = 1;
+    desc.Format = webkitTextureFormat;
+    desc.SampleDesc.Count = 1;
+    desc.Usage = D3D11_USAGE_DEFAULT;
+    desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
+    desc.CPUAccessFlags = 0;
+    desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
+    if (crossProcess)
+        desc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED_NTHANDLE | D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;
+
+    COMPtr<ID3D11Texture2D> texture;
+    HRESULT hr = directXDevice->CreateTexture2D(&desc, nullptr, &texture);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    COMPtr<IDXGISurface1> surface;
+    hr = texture->QueryInterface(&surface);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    return surface;
+}
+
+COMPtr<ID2D1RenderTarget> createSurfaceRenderTarget(IDXGISurface1* surface)
+{
+    auto pixelFormat = D2D1::PixelFormat(webkitTextureFormat, webkitAlphaMode);
+
+    auto properties = D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,
+        pixelFormat, 0, 0, D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, D2D1_FEATURE_LEVEL_10);
+
+    COMPtr<ID2D1RenderTarget> renderTarget;
+    HRESULT hr = GraphicsContext::systemFactory()->CreateDxgiSurfaceRenderTarget(surface, properties, &renderTarget);
+    if (!SUCCEEDED(hr))
+        return nullptr;
+
+    return renderTarget;
+}
+
 void copyRectFromOneSurfaceToAnother(ID2D1Bitmap* from, ID2D1Bitmap* to, const IntSize& sourceOffset, const IntRect& rect, const IntSize& destOffset)
 {
     IntSize sourceBitmapSize = from->GetPixelSize();
@@ -299,6 +350,101 @@
     ASSERT(SUCCEEDED(hr));
 }
 
+static ID3D11DeviceContext1* immediateContext = nullptr;
+
+ID3D11DeviceContext1* dxgiImmediateContext()
+{
+    if (!immediateContext)
+        defaultDirectXDevice();
+
+    RELEASE_ASSERT(immediateContext);
+    return immediateContext;
+}
+
+ID3D11Device1* defaultDirectXDevice()
+{
+    static ID3D11Device1* defaultDevice1 = nullptr;
+
+    if (!defaultDevice1) {
+        int deviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
+#ifndef NDEBUG
+        deviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
+#endif
+
+        ID3D11Device* defaultDevice = nullptr;
+        D3D_FEATURE_LEVEL featureLevel = { };
+        ID3D11DeviceContext* immediateDeviceContext = nullptr;
+        HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, deviceFlags, nullptr, 0, D3D11_SDK_VERSION, &defaultDevice, &featureLevel, &immediateDeviceContext);
+        RELEASE_ASSERT(SUCCEEDED(hr));
+
+        hr = defaultDevice->QueryInterface(&defaultDevice1);
+        RELEASE_ASSERT(SUCCEEDED(hr));
+        defaultDevice1->AddRef();
+
+        hr = immediateDeviceContext->QueryInterface(__uuidof(ID3D11DeviceContext1), reinterpret_cast<void**>(&immediateContext));
+        RELEASE_ASSERT(SUCCEEDED(hr));
+        immediateContext->AddRef();
+    }
+
+    return defaultDevice1;
+}
+
+bool createDeviceAndContext(COMPtr<ID3D11Device1>& d3dDevice, COMPtr<ID3D11DeviceContext1>& immediateContext)
+{
+    int deviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
+#ifndef NDEBUG
+    deviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
+#endif
+
+    D3D_FEATURE_LEVEL featureLevel = { };
+    ID3D11Device* defaultDevice = nullptr;
+    ID3D11DeviceContext* immediateDeviceContext = nullptr;
+    HRESULT hr = ::D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, deviceFlags, nullptr, 0, D3D11_SDK_VERSION, &defaultDevice, &featureLevel, &immediateDeviceContext);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    hr = defaultDevice->QueryInterface(&d3dDevice);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+    defaultDevice->Release();
+
+    hr = immediateDeviceContext->QueryInterface(&immediateContext);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+    immediateContext->Release();
+    return true;
+}
+
+COMPtr<IDXGIDevice> toDXGIDevice(const COMPtr<ID3D11Device1>& d3dDevice)
+{
+    if (!d3dDevice)
+        return nullptr;
+
+    COMPtr<IDXGIDevice> dxgiDevice;
+    HRESULT hr = d3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgiDevice);
+    if (!SUCCEEDED(hr))
+        return nullptr;
+
+    return dxgiDevice;
+}
+
+COMPtr<IDXGIFactory2> factoryForDXGIDevice(const COMPtr<IDXGIDevice>& device)
+{
+    if (!device)
+        return nullptr;
+
+    COMPtr<IDXGIAdapter> adaptor;
+    HRESULT hr = device->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast<void**>(&adaptor));
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    COMPtr<IDXGIFactory> factory;
+    hr = adaptor->GetParent(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&factory));
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    COMPtr<IDXGIFactory2> factory2;
+    hr = factory->QueryInterface(&factory2); 
+    RELEASE_ASSERT(SUCCEEDED(hr));
+    
+    return factory2;
+}
+
 } // namespace Direct2D
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/win/Direct2DUtilities.h (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/Direct2DUtilities.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/Direct2DUtilities.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -32,11 +32,17 @@
 #include "COMPtr.h"
 #include "GraphicsTypes.h"
 #include "IntSize.h"
+#include "PlatformExportMacros.h"
 
 interface ID2D1Bitmap;
 interface ID2D1BitmapRenderTarget;
 interface ID2D1DCRenderTarget;
 interface ID2D1RenderTarget;
+interface ID3D11Device1;
+interface ID3D11DeviceContext1;
+interface IDXGIDevice;
+interface IDXGIFactory2;
+interface IDXGISurface1;
 interface IWICBitmapSource;
 interface IWICBitmap;
 
@@ -73,9 +79,17 @@
 COMPtr<ID2D1BitmapRenderTarget> createBitmapRenderTargetOfSize(const IntSize&, ID2D1RenderTarget* = nullptr, float deviceScaleFactor = 1.0);
 COMPtr<ID2D1BitmapRenderTarget> createBitmapRenderTarget(ID2D1RenderTarget* = nullptr);
 COMPtr<ID2D1DCRenderTarget> createGDIRenderTarget();
+COMPtr<IDXGISurface1> createDXGISurfaceOfSize(const IntSize&, ID3D11Device1*, bool crossProcess);
+COMPtr<ID2D1RenderTarget> createSurfaceRenderTarget(IDXGISurface1*);
 
 void copyRectFromOneSurfaceToAnother(ID2D1Bitmap* from, ID2D1Bitmap* to, const IntSize& sourceOffset, const IntRect&, const IntSize& destOffset = IntSize());
 
+WEBCORE_EXPORT ID3D11DeviceContext1* dxgiImmediateContext();
+WEBCORE_EXPORT ID3D11Device1* defaultDirectXDevice();
+WEBCORE_EXPORT bool createDeviceAndContext(COMPtr<ID3D11Device1>&, COMPtr<ID3D11DeviceContext1>&);
+WEBCORE_EXPORT COMPtr<IDXGIDevice> toDXGIDevice(const COMPtr<ID3D11Device1>&);
+WEBCORE_EXPORT COMPtr<IDXGIFactory2> factoryForDXGIDevice(const COMPtr<IDXGIDevice>&);
+
 void writeDiagnosticPNGToPath(ID2D1RenderTarget*, ID2D1Bitmap*, LPCWSTR fileName);
 
 } // namespace Direct2D

Modified: trunk/Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -207,19 +207,19 @@
     Direct2D::restore(*platformContext());
 }
 
-void GraphicsContext::drawNativeImage(const COMPtr<ID2D1Bitmap>& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator compositeOperator, BlendMode blendMode, ImageOrientation orientation)
+void GraphicsContext::drawNativeImage(const COMPtr<ID2D1Bitmap>& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
 {
     if (paintingDisabled())
         return;
 
     if (m_impl) {
-        m_impl->drawNativeImage(image, imageSize, destRect, srcRect, compositeOperator, blendMode, orientation);
+        m_impl->drawNativeImage(image, imageSize, destRect, srcRect, options);
         return;
     }
 
     ASSERT(hasPlatformContext());
     auto& state = this->state();
-    Direct2D::drawNativeImage(*platformContext(), image.get(), imageSize, destRect, srcRect, compositeOperator, blendMode, orientation, state.imageInterpolationQuality, state.alpha, Direct2D::ShadowState(state));
+    Direct2D::drawNativeImage(*platformContext(), image.get(), imageSize, destRect, srcRect, options, state.alpha, Direct2D::ShadowState(state));
 }
 
 void GraphicsContext::releaseWindowsContext(HDC hdc, const IntRect& dstRect, bool supportAlphaBlend)
@@ -423,19 +423,19 @@
     Direct2D::flush(*platformContext());
 }
 
-void GraphicsContext::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, CompositeOperator compositeOperator, BlendMode blendMode)
+void GraphicsContext::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
 {
     if (paintingDisabled() || !patternTransform.isInvertible())
         return;
 
     if (m_impl) {
-        m_impl->drawPattern(image, destRect, tileRect, patternTransform, phase, spacing, compositeOperator, blendMode);
+        m_impl->drawPattern(image, destRect, tileRect, patternTransform, phase, spacing, options);
         return;
     }
 
     ASSERT(hasPlatformContext());
     if (auto tileImage = image.nativeImageForCurrentFrame(this))
-        Direct2D::drawPattern(*platformContext(), WTFMove(tileImage), IntSize(image.size()), destRect, tileRect, patternTransform, phase, compositeOperator, blendMode);
+        Direct2D::drawPattern(*platformContext(), WTFMove(tileImage), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options.compositeOperator(), options.blendMode());
 }
 
 void GraphicsContext::clipToImageBuffer(ImageBuffer& buffer, const FloatRect& destRect)

Modified: trunk/Source/WebCore/platform/graphics/win/GraphicsContextImplDirect2D.cpp (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/GraphicsContextImplDirect2D.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/GraphicsContextImplDirect2D.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -283,17 +283,17 @@
     return GraphicsContextImpl::drawTiledImageImpl(graphicsContext(), image, destination, source, tileScaleFactor, hRule, vRule, imagePaintingOptions);
 }
 
-void GraphicsContextImplDirect2D::drawNativeImage(const NativeImagePtr& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator compositeOperator, BlendMode blendMode, ImageOrientation orientation)
+void GraphicsContextImplDirect2D::drawNativeImage(const NativeImagePtr& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
 {
     auto& state = graphicsContext().state();
-    Direct2D::drawNativeImage(m_platformContext, image.get(), imageSize, destRect, srcRect, compositeOperator, blendMode, orientation, state.imageInterpolationQuality, state.alpha, Direct2D::ShadowState(state));
+    Direct2D::drawNativeImage(m_platformContext, image.get(), imageSize, destRect, srcRect, options, state.alpha, Direct2D::ShadowState(state));
 }
 
-void GraphicsContextImplDirect2D::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize&, CompositeOperator compositeOperator, BlendMode blendMode)
+void GraphicsContextImplDirect2D::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize&, const ImagePaintingOptions& options)
 {
     auto* context = &graphicsContext();
     if (auto surface = image.nativeImageForCurrentFrame(context))
-        Direct2D::drawPattern(m_platformContext, WTFMove(surface), IntSize(image.size()), destRect, tileRect, patternTransform, phase, compositeOperator, blendMode);
+        Direct2D::drawPattern(m_platformContext, WTFMove(surface), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options.compositeOperator(), options.blendMode());
 }
 
 void GraphicsContextImplDirect2D::drawRect(const FloatRect& rect, float borderThickness)

Modified: trunk/Source/WebCore/platform/graphics/win/ImageBufferDirect2D.cpp (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/ImageBufferDirect2D.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/ImageBufferDirect2D.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -249,12 +249,12 @@
     return image;
 }
 
-void ImageBuffer::drawConsuming(std::unique_ptr<ImageBuffer> imageBuffer, GraphicsContext& destContext, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator op, BlendMode blendMode)
+void ImageBuffer::drawConsuming(std::unique_ptr<ImageBuffer> imageBuffer, GraphicsContext& destContext, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
 {
-    imageBuffer->draw(destContext, destRect, srcRect, op, blendMode);
+    imageBuffer->draw(destContext, destRect, srcRect, options);
 }
 
-void ImageBuffer::draw(GraphicsContext& destContext, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator op, BlendMode blendMode)
+void ImageBuffer::draw(GraphicsContext& destContext, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
 {
     FloatRect adjustedSrcRect = srcRect;
     adjustedSrcRect.scale(m_resolutionScale, m_resolutionScale);
@@ -265,10 +265,10 @@
     if (currentImageSize.isZero())
         return;
 
-    destContext.drawNativeImage(compatibleBitmap, currentImageSize, destRect, adjustedSrcRect, op, blendMode);
+    destContext.drawNativeImage(compatibleBitmap, currentImageSize, destRect, adjustedSrcRect, options);
 }
 
-void ImageBuffer::drawPattern(GraphicsContext& destContext, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, CompositeOperator op, BlendMode blendMode)
+void ImageBuffer::drawPattern(GraphicsContext& destContext, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
 {
     FloatRect adjustedSrcRect = srcRect;
     adjustedSrcRect.scale(m_resolutionScale, m_resolutionScale);
@@ -276,14 +276,14 @@
     if (!context().isAcceleratedContext()) {
         if (&destContext == &context() || destContext.isAcceleratedContext()) {
             if (RefPtr<Image> copy = copyImage(CopyBackingStore)) // Drawing into our own buffer, need to deep copy.
-                copy->drawPattern(destContext, destRect, adjustedSrcRect, patternTransform, phase, spacing, op, blendMode);
+                copy->drawPattern(destContext, destRect, adjustedSrcRect, patternTransform, phase, spacing, options);
         } else {
             if (RefPtr<Image> imageForRendering = copyImage(DontCopyBackingStore))
-                imageForRendering->drawPattern(destContext, destRect, adjustedSrcRect, patternTransform, phase, spacing, op, blendMode);
+                imageForRendering->drawPattern(destContext, destRect, adjustedSrcRect, patternTransform, phase, spacing, options);
         }
     } else {
         if (RefPtr<Image> copy = copyImage(CopyBackingStore))
-            copy->drawPattern(destContext, destRect, adjustedSrcRect, patternTransform, phase, spacing, op, blendMode);
+            copy->drawPattern(destContext, destRect, adjustedSrcRect, patternTransform, phase, spacing, options);
     }
 }
 

Modified: trunk/Source/WebCore/platform/graphics/win/ImageDirect2D.cpp (249334 => 249335)


--- trunk/Source/WebCore/platform/graphics/win/ImageDirect2D.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/platform/graphics/win/ImageDirect2D.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -81,7 +81,7 @@
         if (image && clampTo<int>(imageSize.height()) == static_cast<int>(srcSize.height()) && clampTo<int>(imageSize.width()) == static_cast<int>(srcSize.width())) {
             size_t currentFrame = m_currentFrame;
             m_currentFrame = i;
-            draw(ctxt, dstRect, FloatRect(0.0f, 0.0f, srcSize.width(), srcSize.height()), compositeOp, BlendMode::Normal, DecodingMode::Synchronous, ImageOrientation::None);
+            draw(ctxt, dstRect, FloatRect(0.0f, 0.0f, srcSize.width(), srcSize.height()), { compositeOp });
             m_currentFrame = currentFrame;
             return;
         }
@@ -89,7 +89,7 @@
 
     // No image of the correct size was found, fallback to drawing the current frame
     FloatSize imageSize = BitmapImage::size();
-    draw(ctxt, dstRect, FloatRect(0.0f, 0.0f, imageSize.width(), imageSize.height()), compositeOp, BlendMode::Normal, DecodingMode::Synchronous, ImageOrientation::None);
+    draw(ctxt, dstRect, FloatRect(0.0f, 0.0f, imageSize.width(), imageSize.height()), { compositeOp });
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/svg/graphics/SVGImage.cpp (249334 => 249335)


--- trunk/Source/WebCore/svg/graphics/SVGImage.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebCore/svg/graphics/SVGImage.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -247,7 +247,7 @@
     PlatformContextDirect2D platformContext(nativeImageTarget.get());
     GraphicsContext localContext(&platformContext, GraphicsContext::BitmapRenderingContextType::GPUMemory);
 
-    draw(localContext, rect(), rect(), CompositeSourceOver, BlendMode::Normal, DecodingMode::Synchronous, ImageOrientation::None);
+    draw(localContext, rect(), rect(), { CompositeSourceOver, BlendMode::Normal, DecodingMode::Synchronous, ImageOrientation::None });
 
     COMPtr<ID2D1Bitmap> nativeImage;
     HRESULT hr = nativeImageTarget->GetBitmap(&nativeImage);

Modified: trunk/Source/WebKit/ChangeLog (249334 => 249335)


--- trunk/Source/WebKit/ChangeLog	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/ChangeLog	2019-08-30 18:20:22 UTC (rev 249335)
@@ -1,3 +1,72 @@
+2019-08-30  Brent Fulgham  <bfulg...@apple.com>
+
+        [FTW] Use DirectX SharedResource as basis for SharedBitmap
+        https://bugs.webkit.org/show_bug.cgi?id=201157
+
+        Reviewed by Alex Christensen.
+
+        Currently an ID2D1Bitmap is used as the backing store for the SharedBitmap that is the
+        base type for sharing data between the WebContent Process and the UIProcess. However, this
+        involves moving GPU memory to local memory, copying that memory into the SharedMemory member
+        of the SharedBitmap, then building a new GPU bitmap on the UIProcess side from that SharedMemory.
+
+        Profiling indicates that this is the single largest place FTW WebKit spends its time.
+
+        Instead, we should use Direct2D's ability to render to an IDXGISurface, which can be shared
+        between multiple processes. This should avoid the GPU->CPU copy, the Direct2D-allocated
+        CPU->Shared Memory copy, and the shared memory to GPU copy.
+
+        Reviewed by Alex Christensen.
+
+        * Platform/SharedMemory.h:
+        * Platform/win/SharedMemoryWin.cpp:
+        (WebKit::SharedMemory::Handle::encodeHandle): Added.
+        (WebKit::SharedMemory::Handle::encode const): Use new helper function.
+        (WebKit::SharedMemory::Handle::decodeHandle): Added.
+        (WebKit::SharedMemory::Handle::decode): Use new helper function.
+        * PlatformFTW.cmake: Add D3X11 libraries.
+        * Shared/ShareableBitmap.cpp:
+        (WebKit::ShareableBitmap::Configuration::encode const): Encode shared resource handle for DX texture.
+        (WebKit::ShareableBitmap::Configuration::decode): Ditto (but decode).
+        (WebKit::ShareableBitmap::ShareableBitmap): Create SharedResource (if needed).
+        (WebKit::ShareableBitmap::~ShareableBitmap): Add cleanup code for SharedResoure.
+        (WebKit::ShareableBitmap::numBytesForSize): Only allocate a small memory store when using GPU textures.
+        * Shared/ShareableBitmap.h:
+        (WebKit::ShareableBitmap::dxSurface):
+        * Shared/win/ShareableBitmapDirect2D.cpp:
+        (WebKit::ShareableBitmap::createSharedResource): Added.
+        (WebKit::ShareableBitmap::disposeSharedResource): Added.
+        (WebKit::ShareableBitmap::leakSharedResource): Added.
+        (WebKit::ShareableBitmap::createGraphicsContext): Update for new data types.
+        (WebKit::ShareableBitmap::paint): Ditto.
+        (WebKit::ShareableBitmap::createDirect2DSurface): Update for new data types.
+        (WebKit::ShareableBitmap::createImage): Ditto.
+        (WebKit::createSurfaceFromData): Deleted.
+        (WebKit::ShareableBitmap::sync): Deleted.
+        * UIProcess/BackingStore.cpp:
+        * UIProcess/BackingStore.h:
+        * UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.cpp:
+        * UIProcess/WebPageProxy.cpp:
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/win/BackingStoreDirect2D.cpp:
+        (WebKit::BackingStore::createBackend):
+        (WebKit::BackingStore::paint):
+        (WebKit::BackingStore::incorporateUpdate):
+        * UIProcess/win/PageClientImpl.cpp:
+        * UIProcess/win/WebPageProxyWin.cpp:
+        (WebKit::WebPageProxy::device const):
+        (WebKit::WebPageProxy::setDevice):
+        * UIProcess/win/WebView.cpp:
+        (WebKit::WebView::WebView): Initialize DirectX stuff.
+        (WebKit::WebView::paint): Use new DiretX drawing logic.
+        (WebKit::WebView::onSizeEvent): Update SwapChain's buffer sizes when resizing.
+        (WebKit::WebView::setupSwapChain): Added.
+        (WebKit::WebView::configureBackingStore): Added.
+        * UIProcess/win/WebView.h:
+        (WebKit::WebView::d3dDevice):
+        * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp:
+        (WebKit::DrawingAreaCoordinatedGraphics::display):
+
 2019-08-30  Chris Dumez  <cdu...@apple.com>
 
         [PSON] Bump the WebPage's identifier every time we process-swap

Modified: trunk/Source/WebKit/Platform/SharedMemory.h (249334 => 249335)


--- trunk/Source/WebKit/Platform/SharedMemory.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/Platform/SharedMemory.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2018 Apple Inc. All rights reserved.
+ * Copyright (C) 2010-2019 Apple Inc. All rights reserved.
  * Copyright (C) 2017 Sony Interactive Entertainment Inc.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -78,6 +78,10 @@
         IPC::Attachment releaseAttachment() const;
         void adoptAttachment(IPC::Attachment&&);
 #endif
+#if OS(WINDOWS)
+        static void encodeHandle(IPC::Encoder&, HANDLE);
+        static Optional<HANDLE> decodeHandle(IPC::Decoder&);
+#endif
     private:
         friend class SharedMemory;
 #if USE(UNIX_DOMAIN_SOCKETS)

Modified: trunk/Source/WebKit/Platform/win/SharedMemoryWin.cpp (249334 => 249335)


--- trunk/Source/WebKit/Platform/win/SharedMemoryWin.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/Platform/win/SharedMemoryWin.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -66,12 +66,18 @@
 {
     encoder << static_cast<uint64_t>(m_size);
 
+    encodeHandle(encoder, m_handle);
+
     // Hand off ownership of our HANDLE to the receiving process. It will close it for us.
     // FIXME: If the receiving process crashes before it receives the memory, the memory will be
     // leaked. See <http://webkit.org/b/47502>.
-    encoder << reinterpret_cast<uint64_t>(m_handle);
     m_handle = 0;
+}
 
+void SharedMemory::Handle::encodeHandle(IPC::Encoder& encoder, HANDLE handle)
+{
+    encoder << reinterpret_cast<uint64_t>(handle);
+
     // Send along our PID so that the receiving process can duplicate the HANDLE for its own use.
     encoder << static_cast<uint32_t>(::GetCurrentProcessId());
 }
@@ -113,21 +119,30 @@
     if (!decoder.decode(size))
         return false;
 
+    auto processSpecificHandle = decodeHandle(decoder);
+    if (!processSpecificHandle)
+        return false;
+
+    handle.m_handle = processSpecificHandle.value();
+    handle.m_size = size;
+    return true;
+}
+
+Optional<HANDLE> SharedMemory::Handle::decodeHandle(IPC::Decoder& decoder)
+{
     uint64_t sourceHandle;
     if (!decoder.decode(sourceHandle))
-        return false;
+        return WTF::nullopt;
 
     uint32_t sourcePID;
     if (!decoder.decode(sourcePID))
-        return false;
+        return WTF::nullopt;
 
     HANDLE duplicatedHandle;
     if (!getDuplicatedHandle(reinterpret_cast<HANDLE>(sourceHandle), sourcePID, duplicatedHandle))
-        return false;
+        return WTF::nullopt;
 
-    handle.m_handle = duplicatedHandle;
-    handle.m_size = size;
-    return true;
+    return duplicatedHandle;
 }
 
 RefPtr<SharedMemory> SharedMemory::allocate(size_t size)

Modified: trunk/Source/WebKit/PlatformFTW.cmake (249334 => 249335)


--- trunk/Source/WebKit/PlatformFTW.cmake	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/PlatformFTW.cmake	2019-08-30 18:20:22 UTC (rev 249335)
@@ -175,7 +175,9 @@
     PRIVATE
         ${OPENSSL_LIBRARIES}
         D2d1.lib
+        D3d11.lib
         Dwrite
+        Dxgi.lib
         Dxguid
         WindowsCodecs
         mfuuid.lib

Modified: trunk/Source/WebKit/Shared/ShareableBitmap.cpp (249334 => 249335)


--- trunk/Source/WebKit/Shared/ShareableBitmap.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/Shared/ShareableBitmap.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -68,6 +68,14 @@
 #if PLATFORM(COCOA)
     encoder << colorSpace;
 #endif
+#if USE(DIRECT2D)
+    SharedMemory::Handle::encodeHandle(encoder, sharedResourceHandle);
+
+    // Hand off ownership of our HANDLE to the receiving process. It will close it for us.
+    // FIXME: If the receiving process crashes before it receives the memory, the memory will be
+    // leaked. See <http://webkit.org/b/47502>.
+    sharedResourceHandle = nullptr;
+#endif
 }
 
 bool ShareableBitmap::Configuration::decode(IPC::Decoder& decoder, Configuration& configuration)
@@ -78,6 +86,13 @@
     if (!decoder.decode(configuration.colorSpace))
         return false;
 #endif
+#if USE(DIRECT2D)
+    auto processSpecificHandle = SharedMemory::Handle::decodeHandle(decoder);
+    if (!processSpecificHandle)
+        return false;
+
+    configuration.sharedResourceHandle = processSpecificHandle.value();
+#endif
     return true;
 }
 
@@ -156,6 +171,9 @@
     , m_sharedMemory(sharedMemory)
     , m_data(nullptr)
 {
+#if USE(DIRECT2D)
+    createSharedResource();
+#endif
 }
 
 ShareableBitmap::~ShareableBitmap()
@@ -162,6 +180,9 @@
 {
     if (!isBackedBySharedMemory())
         fastFree(m_data);
+#if USE(DIRECT2D)
+    disposeSharedResource();
+#endif
 }
 
 void* ShareableBitmap::data() const
@@ -175,7 +196,12 @@
 
 Checked<unsigned, RecordOverflow> ShareableBitmap::numBytesForSize(WebCore::IntSize size, const ShareableBitmap::Configuration& configuration)
 {
+#if USE(DIRECT2D)
+    // We pass references to GPU textures, so no need to allocate frame buffers here. Just send a small bit of data.
+    return sizeof(void*);
+#else
     return calculateBytesPerRow(size, configuration) * size.height();
+#endif
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/Shared/ShareableBitmap.h (249334 => 249335)


--- trunk/Source/WebKit/Shared/ShareableBitmap.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/Shared/ShareableBitmap.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -42,6 +42,9 @@
 #if USE(DIRECT2D)
 interface ID2D1Bitmap;
 interface ID2D1RenderTarget;
+interface ID3D11Device1;
+interface IDXGIKeyedMutex;
+interface IDXGISurface1;
 
 #include <WebCore/COMPtr.h>
 #endif
@@ -60,6 +63,9 @@
 #if PLATFORM(COCOA)
         ColorSpaceData colorSpace;
 #endif
+#if USE(DIRECT2D)
+        mutable HANDLE sharedResourceHandle { nullptr };
+#endif
 
         void encode(IPC::Encoder&) const;
         static bool decode(IPC::Decoder&, Configuration&);
@@ -132,8 +138,11 @@
     // This is only safe to use when we know that the contents of the shareable bitmap won't change.
     RefPtr<cairo_surface_t> createCairoSurface();
 #elif USE(DIRECT2D)
-    COMPtr<ID2D1Bitmap> createDirect2DSurface(ID2D1RenderTarget*);
-    void sync(WebCore::GraphicsContext&);
+    COMPtr<ID2D1Bitmap> createDirect2DSurface(ID3D11Device1*, ID2D1RenderTarget*);
+    IDXGISurface1* dxSurface() { return m_surface.get(); }
+    void createSharedResource();
+    void disposeSharedResource();
+    void leakSharedResource();
 #endif
 
 private:
@@ -163,7 +172,8 @@
     Configuration m_configuration;
 
 #if USE(DIRECT2D)
-    COMPtr<ID2D1Bitmap> m_bitmap;
+    COMPtr<IDXGISurface1> m_surface;
+    COMPtr<IDXGIKeyedMutex> m_surfaceMutex;
 #endif
 
     // If the shareable bitmap is backed by shared memory, this points to the shared memory object.

Modified: trunk/Source/WebKit/Shared/win/ShareableBitmapDirect2D.cpp (249334 => 249335)


--- trunk/Source/WebKit/Shared/win/ShareableBitmapDirect2D.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/Shared/win/ShareableBitmapDirect2D.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -28,6 +28,8 @@
 #include "config.h"
 #include "ShareableBitmap.h"
 
+#include "Decoder.h"
+#include "Encoder.h"
 #include <WebCore/BitmapImage.h>
 #include <WebCore/DIBPixelData.h>
 #include <WebCore/Direct2DOperations.h>
@@ -36,6 +38,8 @@
 #include <WebCore/NotImplemented.h>
 #include <WebCore/PlatformContextDirect2D.h>
 #include <d2d1_1.h>
+#include <d3d11_1.h>
+#include <dxgi1_2.h>
 #include <wincodec.h>
 #include <wtf/ProcessID.h>
 
@@ -59,21 +63,48 @@
     return 4;
 }
 
-static inline COMPtr<IWICBitmap> createSurfaceFromData(void* data, const WebCore::IntSize& size)
+void ShareableBitmap::createSharedResource()
 {
-    const unsigned stride = strideForWidth(size.width());
-    return Direct2D::createDirect2DImageSurfaceWithData(data, size, stride);
+    // Don't create a shared resource if the configuration instructs us to use an existing one.
+    if (m_configuration.sharedResourceHandle)
+        return;
+
+    m_surface = Direct2D::createDXGISurfaceOfSize(m_size, nullptr, true);
+
+    COMPtr<IDXGIResource1> resourceData;
+    HRESULT hr = m_surface->QueryInterface(__uuidof(IDXGIResource), reinterpret_cast<void**>(&resourceData));
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    hr = resourceData->CreateSharedHandle(nullptr, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE, nullptr, &m_configuration.sharedResourceHandle);
+    RELEASE_ASSERT(SUCCEEDED(hr));
 }
 
+void ShareableBitmap::disposeSharedResource()
+{
+    if (m_surfaceMutex)
+        m_surfaceMutex->ReleaseSync(1);
+    if (m_configuration.sharedResourceHandle)
+        ::CloseHandle(m_configuration.sharedResourceHandle);
+}
+
+void ShareableBitmap::leakSharedResource()
+{
+    m_configuration.sharedResourceHandle = nullptr;
+}
+
 std::unique_ptr<GraphicsContext> ShareableBitmap::createGraphicsContext()
 {
-    auto bitmapContext = Direct2D::createBitmapRenderTargetOfSize(m_size);
-    if (!bitmapContext)
+    // Lock the surface to the current device while rendering.
+    HRESULT hr = m_surface->QueryInterface(&m_surfaceMutex);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+    hr = m_surfaceMutex->AcquireSync(0, INFINITE);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    auto surfaceContext = Direct2D::createSurfaceRenderTarget(m_surface.get());
+    if (!surfaceContext)
         return nullptr;
 
-    HRESULT hr = bitmapContext->GetBitmap(&m_bitmap);
-    RELEASE_ASSERT(SUCCEEDED(hr));
-    return makeUnique<GraphicsContext>(GraphicsContextImplDirect2D::createFactory(bitmapContext.get()));
+    return makeUnique<GraphicsContext>(GraphicsContextImplDirect2D::createFactory(surfaceContext.get()));
 }
 
 void ShareableBitmap::paint(GraphicsContext& context, const IntPoint& dstPoint, const IntRect& srcRect)
@@ -83,7 +114,7 @@
 
 void ShareableBitmap::paint(GraphicsContext& context, float scaleFactor, const IntPoint& dstPoint, const IntRect& srcRect)
 {
-    auto surface = createDirect2DSurface(context.platformContext()->renderTarget());
+    auto surface = createDirect2DSurface(nullptr, context.platformContext()->renderTarget());
 
 #ifndef _NDEBUG
     auto bitmapSize = surface->GetPixelSize();
@@ -99,16 +130,32 @@
     auto& state = context.state();
     auto& platformContext = *context.platformContext();
 
-    Direct2D::drawNativeImage(platformContext, surface.get(), m_size, destRect, srcRectScaled, state.compositeOperator, state.blendMode, ImageOrientation(), state.imageInterpolationQuality, state.alpha, Direct2D::ShadowState(state));
+    ImagePaintingOptions options { state.compositeOperator, state.blendMode, ImageOrientation(), state.imageInterpolationQuality };
+    Direct2D::drawNativeImage(platformContext, surface.get(), m_size, destRect, srcRectScaled, options, state.alpha, Direct2D::ShadowState(state));
 }
 
-COMPtr<ID2D1Bitmap> ShareableBitmap::createDirect2DSurface(ID2D1RenderTarget* renderTarget)
+COMPtr<ID2D1Bitmap> ShareableBitmap::createDirect2DSurface(ID3D11Device1* directXDevice, ID2D1RenderTarget* renderTarget)
 {
-    auto bitmapProperties = Direct2D::bitmapProperties();
+    if (!directXDevice)
+        directXDevice = Direct2D::defaultDirectXDevice();
 
+    COMPtr<ID3D11Texture2D> texture;
+    HRESULT hr = directXDevice->OpenSharedResource1(m_configuration.sharedResourceHandle, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&texture));
+    if (!SUCCEEDED(hr))
+        return nullptr;
+
+    hr = texture->QueryInterface(&m_surface);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    // Lock the surface to the current device while rendering.
+    hr = m_surface->QueryInterface(&m_surfaceMutex);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+    hr = m_surfaceMutex->AcquireSync(1, INFINITE);
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
     COMPtr<ID2D1Bitmap> bitmap;
-    uint32_t stride = 4 * m_size.width();
-    HRESULT hr = renderTarget->CreateBitmap(m_size, data(), stride, &bitmapProperties, &bitmap);
+    auto bitmapProperties = Direct2D::bitmapProperties();
+    hr = renderTarget->CreateSharedBitmap(__uuidof(IDXGISurface1), reinterpret_cast<void*>(m_surface.get()), &bitmapProperties, &bitmap);
     if (!SUCCEEDED(hr))
         return nullptr;
 
@@ -117,7 +164,7 @@
 
 RefPtr<Image> ShareableBitmap::createImage()
 {
-    auto surface = createDirect2DSurface(GraphicsContext::defaultRenderTarget());
+    auto surface = createDirect2DSurface(nullptr, GraphicsContext::defaultRenderTarget());
     if (!surface)
         return nullptr;
 
@@ -124,56 +171,4 @@
     return BitmapImage::create(WTFMove(surface));
 }
 
-void ShareableBitmap::sync(GraphicsContext& graphicsContext)
-{
-    ASSERT(m_bitmap);
-
-    graphicsContext.endDraw();
-
-    COMPtr<ID2D1DeviceContext> d2dDeviceContext;
-    HRESULT hr = graphicsContext.platformContext()->renderTarget()->QueryInterface(__uuidof(ID2D1DeviceContext), reinterpret_cast<void**>(&d2dDeviceContext));
-    ASSERT(SUCCEEDED(hr));
-
-    const unsigned stride = strideForWidth(m_size.width());
-
-    COMPtr<ID2D1Bitmap1> cpuBitmap;
-    D2D1_BITMAP_PROPERTIES1 bitmapProperties = D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_CPU_READ | D2D1_BITMAP_OPTIONS_CANNOT_DRAW, Direct2D::pixelFormat());
-    hr = d2dDeviceContext->CreateBitmap(m_size, nullptr, stride, bitmapProperties, &cpuBitmap);
-    if (!SUCCEEDED(hr))
-        return;
-
-    hr = cpuBitmap->CopyFromBitmap(nullptr, m_bitmap.get(), nullptr);
-    if (!SUCCEEDED(hr))
-        return;
-
-    D2D1_MAPPED_RECT mappedData;
-    hr = cpuBitmap->Map(D2D1_MAP_OPTIONS_READ, &mappedData);
-    if (!SUCCEEDED(hr))
-        return;
-
-    if (mappedData.pitch == stride)
-        memcpy(data(), reinterpret_cast<char*>(mappedData.bits), stride * m_size.height());
-    else {
-        // Stride is different, so must do a rowwise copy:
-        Checked<int> height = m_size.height();
-        Checked<int> width = m_size.width();
-
-        const uint8_t* srcRows = mappedData.bits;
-        uint8_t* row = reinterpret_cast<uint8_t*>(data());
-
-        for (int y = 0; y < height.unsafeGet(); ++y) {
-            for (int x = 0; x < width.unsafeGet(); x++) {
-                int basex = x * 4;
-                reinterpret_cast<uint32_t*>(row + basex)[0] = reinterpret_cast<const uint32_t*>(srcRows + basex)[0];
-            }
-
-            srcRows += mappedData.pitch;
-            row += stride;
-        }
-    }
-
-    hr = cpuBitmap->Unmap();
-    ASSERT(SUCCEEDED(hr));
-}
-
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/BackingStore.cpp (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/BackingStore.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/BackingStore.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -31,6 +31,7 @@
 
 #if USE(DIRECT2D)
 #include <d2d1.h>
+#include <d3d11_1.h>
 #endif
 
 namespace WebKit {

Modified: trunk/Source/WebKit/UIProcess/BackingStore.h (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/BackingStore.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/BackingStore.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -36,6 +36,9 @@
 
 #if USE(DIRECT2D)
 interface ID2D1RenderTarget;
+interface ID3D11Device1;
+interface ID3D11DeviceContext1;
+interface ID3D11Texture2D;
 #endif
 
 namespace WebKit {
@@ -58,11 +61,11 @@
 #if USE(CAIRO)
     typedef cairo_t* PlatformGraphicsContext;
 #elif USE(DIRECT2D)
-    struct GdiConnections {
-        HWND hwnd;
-        HDC hdc;
+    struct DXConnections {
+        ID3D11DeviceContext1* immediateContext { nullptr };
+        ID3D11Texture2D* backBuffer { nullptr };
     };
-    typedef GdiConnections PlatformGraphicsContext;
+    typedef DXConnections PlatformGraphicsContext;
 #endif
 
     void paint(PlatformGraphicsContext, const WebCore::IntRect&);

Modified: trunk/Source/WebKit/UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.cpp (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -48,6 +48,7 @@
 
 #if USE(DIRECT2D)
 #include <d2d1.h>
+#include <d3d11_1.h>
 #endif
 
 namespace WebKit {

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -250,6 +250,10 @@
 #include "SOAuthorizationCoordinator.h"
 #endif
 
+#if USE(DIRECT2D)
+#include <d3d11_1.h>
+#endif
+
 // This controls what strategy we use for mouse wheel coalescing.
 #define MERGE_WHEEL_EVENTS 1
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -152,6 +152,10 @@
 }
 #endif
 
+#if USE(DIRECT2D)
+interface ID3D11Device1;
+#endif
+
 namespace API {
 class Attachment;
 class ContextMenuClient;
@@ -817,7 +821,11 @@
 
 #if PLATFORM(WIN)
     PlatformViewWidget viewWidget();
+#if USE(DIRECT2D)
+    ID3D11Device1* device() const;
+    void setDevice(ID3D11Device1*);
 #endif
+#endif
 #if PLATFORM(WPE)
     struct wpe_view_backend* viewBackend();
 #endif
@@ -2555,6 +2563,9 @@
     };
     Optional<SpeechSynthesisData> m_speechSynthesisData;
 #endif
+#if USE(DIRECT2D)
+    COMPtr<ID3D11Device1> m_device;
+#endif
     bool m_isQuotaIncreaseDenied { false };
 };
 

Modified: trunk/Source/WebKit/UIProcess/win/BackingStoreDirect2D.cpp (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/win/BackingStoreDirect2D.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/win/BackingStoreDirect2D.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -35,6 +35,8 @@
 #include <WebCore/GraphicsContextImplDirect2D.h>
 #include <WebCore/PlatformContextDirect2D.h>
 #include <d2d1.h>
+#include <d3d11_1.h>
+#include <dxgi.h>
 
 namespace WebKit {
 using namespace WebCore;
@@ -41,27 +43,24 @@
 
 std::unique_ptr<BackingStoreBackendDirect2D> BackingStore::createBackend()
 {
-    return makeUnique<BackingStoreBackendDirect2DImpl>(m_size, m_deviceScaleFactor);
+    return makeUnique<BackingStoreBackendDirect2DImpl>(m_size, m_deviceScaleFactor, m_webPageProxy.device());
 }
 
-void BackingStore::paint(GdiConnections gdiConnections, const IntRect& rect)
+void BackingStore::paint(DXConnections dxConnections, const IntRect& rect)
 {
     ASSERT(m_backend);
     ASSERT(m_backend->size() == m_size);
 
-    auto* renderTarget = m_backend->renderTarget();
+    COMPtr<ID3D11Resource> backBuffer;
+    HRESULT hr = dxConnections.backBuffer->QueryInterface(__uuidof(ID3D11Resource), reinterpret_cast<void**>(&backBuffer));
+    RELEASE_ASSERT(SUCCEEDED(hr));
 
-    RECT viewRect;
-    ::GetClientRect(gdiConnections.hwnd, &viewRect);
-    renderTarget->BindDC(gdiConnections.hdc, &viewRect);
+    COMPtr<ID3D11Resource> backingStore;
+    hr = m_backend->dxSurface()->QueryInterface(__uuidof(ID3D11Resource), reinterpret_cast<void**>(&backingStore));
+    RELEASE_ASSERT(SUCCEEDED(hr));
 
-    D2D1_RECT_F destRect = rect;
-
-    if (auto* patternBrush = m_backend->bitmapBrush()) {
-        renderTarget->BeginDraw();
-        renderTarget->FillRectangle(&destRect, patternBrush);
-        renderTarget->EndDraw();
-    }
+    CD3D11_BOX srcBox(rect.x(), rect.y(), 0, rect.x() + rect.width(), rect.y() + rect.height(), 1);
+    dxConnections.immediateContext->CopySubresourceRegion1(backBuffer.get(), 0, rect.x(), rect.y(), 0, backingStore.get(), 0, &srcBox, D3D11_COPY_DISCARD);
 }
 
 void BackingStore::incorporateUpdate(ShareableBitmap* bitmap, const UpdateInfo& updateInfo)
@@ -73,7 +72,9 @@
 
     IntPoint updateRectBoundsLocation = updateInfo.updateRectBounds.location();
 
-    COMPtr<ID2D1Bitmap> deviceUpdateBitmap = bitmap->createDirect2DSurface(m_backend->renderTarget());
+    COMPtr<ID2D1Bitmap> deviceUpdateBitmap = bitmap->createDirect2DSurface(m_webPageProxy.device(), m_backend->renderTarget());
+    if (!deviceUpdateBitmap)
+        return;
 
 #ifndef _NDEBUG
     auto deviceBitmapSize = deviceUpdateBitmap->GetPixelSize();

Modified: trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/win/PageClientImpl.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -34,6 +34,7 @@
 #include "WebView.h"
 #include <WebCore/DOMPasteAccess.h>
 #include <WebCore/NotImplemented.h>
+#include <d3d11_1.h>
 
 namespace WebKit {
 using namespace WebCore;

Modified: trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/win/WebPageProxyWin.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010-2019 Apple Inc. All rights reserved.
  * Copyright (C) 2018 Sony Interactive Entertainment Inc.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,6 +31,10 @@
 #include <WebCore/SearchPopupMenuDB.h>
 #include <WebCore/UserAgent.h>
 
+#if USE(DIRECT2D)
+#include <d3d11_1.h>
+#endif
+
 namespace WebKit {
 
 void WebPageProxy::platformInitialize()
@@ -70,5 +74,17 @@
     return static_cast<PageClientImpl&>(pageClient()).viewWidget();
 }
 
+#if USE(DIRECT2D)
+ID3D11Device1* WebPageProxy::device() const
+{
+    return m_device.get();
+}
 
+void WebPageProxy::setDevice(ID3D11Device1* device)
+{
+    m_device = device;
+}
+#endif
+
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/win/WebView.cpp (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/win/WebView.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/win/WebView.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -69,6 +69,9 @@
 
 #if USE(DIRECT2D)
 #include <WebCore/Direct2DUtilities.h>
+#include <d3d11_1.h>
+#include <directxcolors.h> 
+#include <dxgi.h>
 #endif
 
 
@@ -245,8 +248,15 @@
     m_page = processPool->createWebPage(*m_pageClient, WTFMove(pageConfiguration));
     m_page->initializeWebPage();
 
+    IntSize windowSize(rect.right - rect.left, rect.bottom - rect.top);
+#if USE(DIRECT2D)
+    Direct2D::createDeviceAndContext(m_d3dDevice, m_immediateContext);
+    m_page->setDevice(m_d3dDevice.get());
+    setupSwapChain(windowSize);
+#endif
+
     if (m_page->drawingArea())
-        m_page->drawingArea()->setSize(IntSize(rect.right - rect.left, rect.bottom - rect.top));
+        m_page->drawingArea()->setSize(windowSize);
 
 #if ENABLE(REMOTE_INSPECTOR)
     m_page->setURLSchemeHandlerForScheme(RemoteInspectorProtocolHandler::create(*m_page), "inspector");
@@ -491,8 +501,14 @@
         cairo_destroy(context);
         cairo_surface_destroy(surface);
 #else
-        BackingStore::GdiConnections context { ::WindowFromDC(hdc), hdc };
-        drawingArea->paint(context, dirtyRect, unpaintedRegion);
+        COMPtr<ID3D11Texture2D> backBuffer; 
+        HRESULT hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer)); 
+        if (SUCCEEDED(hr)) {
+            BackingStore::DXConnections context { m_immediateContext.get(), backBuffer.get() };
+            drawingArea->paint(context, dirtyRect, unpaintedRegion);
+        }
+
+        m_swapChain->Present(0, 0); 
 #endif
 
         auto unpaintedRects = unpaintedRegion.rects();
@@ -534,12 +550,29 @@
     int width = LOWORD(lParam);
     int height = HIWORD(lParam);
 
+    IntSize windowSize(width, height);
+
     if (m_page && m_page->drawingArea()) {
         // FIXME specify correctly layerPosition.
-        m_page->drawingArea()->setSize(IntSize(width, height), m_nextResizeScrollOffset);
+        m_page->drawingArea()->setSize(windowSize, m_nextResizeScrollOffset);
         m_nextResizeScrollOffset = IntSize();
     }
 
+#if USE(DIRECT2D)
+    if (m_swapChain) {
+        m_immediateContext->OMSetRenderTargets(0, nullptr, nullptr);
+
+        m_renderTargetView = nullptr;
+
+        // Preserve the existing buffer count (pass zero for count) and format (by passing DXGI_FORMAT_UNKNOWN).
+        // Automatically choose the width and height to match the client rect for the backing window (pass zeros for width/height).
+        HRESULT hr = m_swapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE);
+        RELEASE_ASSERT(SUCCEEDED(hr));
+
+        configureBackingStore(windowSize);
+    }
+#endif
+
     handled = true;
     return 0;
 }
@@ -917,4 +950,63 @@
     ::SendMessage(m_toolTipWindow, TTM_ACTIVATE, !toolTip.isEmpty(), 0);
 }
 
+#if USE(DIRECT2D)
+void WebView::setupSwapChain(const WebCore::IntSize& size)
+{
+    if (!m_d3dDevice)
+        return;
+
+    DXGI_SWAP_CHAIN_DESC1 swapChainDescription;
+    ::ZeroMemory(&swapChainDescription, sizeof(swapChainDescription));
+    swapChainDescription.Width = size.width();
+    swapChainDescription.Height = size.height();
+    swapChainDescription.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+    swapChainDescription.SampleDesc.Count = 1;
+    swapChainDescription.SampleDesc.Quality = 0;
+    swapChainDescription.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+    swapChainDescription.BufferCount = 1;
+
+    auto factory = Direct2D::factoryForDXGIDevice(Direct2D::toDXGIDevice(m_d3dDevice));
+
+    IDXGISwapChain1* swapChain1 = nullptr;
+    HRESULT hr = factory->CreateSwapChainForHwnd(m_d3dDevice.get(), m_window, &swapChainDescription, nullptr, nullptr, &swapChain1);
+    if (SUCCEEDED(hr))
+        hr = swapChain1->QueryInterface(__uuidof(IDXGISwapChain), reinterpret_cast<void**>(&m_swapChain));
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    factory->MakeWindowAssociation(m_window, 0);
+    configureBackingStore(size);
+}
+
+void WebView::configureBackingStore(const WebCore::IntSize& size)
+{
+    ASSERT(m_swapChain);
+    ASSERT(m_d3dDevice);
+    ASSERT(m_immediateContext);
+
+    // Create a render target view 
+    COMPtr<ID3D11Texture2D> backBuffer; 
+    HRESULT hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer)); 
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    hr = m_d3dDevice->CreateRenderTargetView(backBuffer.get(), nullptr, &m_renderTargetView); 
+    RELEASE_ASSERT(SUCCEEDED(hr));
+
+    auto* renderTargetView = m_renderTargetView.get();
+    m_immediateContext->OMSetRenderTargets(1, &renderTargetView, nullptr);
+
+    // Setup the viewport 
+    D3D11_VIEWPORT viewport;
+    viewport.Width = (FLOAT)size.width();
+    viewport.Height = (FLOAT)size.height();
+    viewport.MinDepth = 0.0f;
+    viewport.MaxDepth = 1.0f;
+    viewport.TopLeftX = 0;
+    viewport.TopLeftY = 0;
+    m_immediateContext->RSSetViewports(1, &viewport);
+
+    m_immediateContext->ClearRenderTargetView(m_renderTargetView.get(), DirectX::Colors::MidnightBlue); 
+}
+#endif
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/win/WebView.h (249334 => 249335)


--- trunk/Source/WebKit/UIProcess/win/WebView.h	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/UIProcess/win/WebView.h	2019-08-30 18:20:22 UTC (rev 249335)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010-2019 Apple Inc. All rights reserved.
  * Copyright (C) 2017 Sony Interactive Entertainment Inc.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -35,6 +35,17 @@
 #include <wtf/Forward.h>
 #include <wtf/RefPtr.h>
 
+#if USE(DIRECT2D)
+interface ID3D11Device1;
+interface ID3D11DeviceContext1;
+interface ID3D11RenderTargetView;
+interface IDXGISwapChain;
+#endif
+
+namespace WebCore {
+class IntSize;
+}
+
 namespace WebKit {
 
 class DrawingAreaProxy;
@@ -72,6 +83,10 @@
 
     DrawingAreaProxy* drawingArea() { return page() ? page()->drawingArea() : nullptr; }
 
+#if USE(DIRECT2D)
+    ID3D11Device1* d3dDevice() { return m_d3dDevice.get(); }
+#endif
+
 private:
     WebView(RECT, const API::PageConfiguration&, HWND parentWindow);
 
@@ -128,6 +143,11 @@
     // WebCore::WindowMessageListener
     virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
 
+#if USE(DIRECT2D)
+    void setupSwapChain(const WebCore::IntSize&);
+    void configureBackingStore(const WebCore::IntSize&);
+#endif
+
     HWND m_window { nullptr };
     HWND m_topLevelParentWindow { nullptr };
     HWND m_toolTipWindow { nullptr };
@@ -147,6 +167,12 @@
 
     std::unique_ptr<WebKit::PageClientImpl> m_pageClient;
     RefPtr<WebPageProxy> m_page;
+#if USE(DIRECT2D)
+    COMPtr<ID3D11Device1> m_d3dDevice;
+    COMPtr<ID3D11DeviceContext1> m_immediateContext;
+    COMPtr<ID3D11RenderTargetView> m_renderTargetView; 
+    COMPtr<IDXGISwapChain> m_swapChain;
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp (249334 => 249335)


--- trunk/Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp	2019-08-30 18:20:22 UTC (rev 249335)
@@ -45,6 +45,7 @@
 #include <WebCore/GraphicsContextImplDirect2D.h>
 #include <WebCore/PlatformContextDirect2D.h>
 #include <d2d1.h>
+#include <d3d11_1.h>
 #endif
 
 
@@ -760,8 +761,7 @@
     }
 
 #if USE(DIRECT2D)
-    if (graphicsContext)
-        bitmap->sync(*graphicsContext);
+    bitmap->leakSharedResource(); // It will be destroyed in the UIProcess.
 #endif
 
     // Layout can trigger more calls to setNeedsDisplay and we don't want to process them

Modified: trunk/Source/WebKitLegacy/ChangeLog (249334 => 249335)


--- trunk/Source/WebKitLegacy/ChangeLog	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKitLegacy/ChangeLog	2019-08-30 18:20:22 UTC (rev 249335)
@@ -1,3 +1,12 @@
+2019-08-30  Brent Fulgham  <bfulg...@apple.com>
+
+        [FTW] Use DirectX SharedResource as basis for SharedBitmap
+        https://bugs.webkit.org/show_bug.cgi?id=201157
+
+        Reviewed by Alex Christensen.
+
+        * PlatformFTW.cmake: Link to DirectX to avoid build failure.
+
 2019-08-19  Sihui Liu  <sihui_...@apple.com>
 
         Remove IDB-specific quota

Modified: trunk/Source/WebKitLegacy/PlatformFTW.cmake (249334 => 249335)


--- trunk/Source/WebKitLegacy/PlatformFTW.cmake	2019-08-30 18:02:52 UTC (rev 249334)
+++ trunk/Source/WebKitLegacy/PlatformFTW.cmake	2019-08-30 18:20:22 UTC (rev 249335)
@@ -8,6 +8,8 @@
 )
 list(APPEND WebKitLegacy_LIBRARIES
     ${OPENSSL_LIBRARIES}
+    PRIVATE D3D11.lib
+    PRIVATE Dxgi.lib
     PRIVATE mfuuid.lib
     PRIVATE strmiids.lib
     PRIVATE ${LIBXML2_LIBRARIES}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to