[PATCH v2 1/3] d2d1: Implement ID2D1Bitmap1::Map().

Dmitry Timoshkov dmitry at baikal.ru
Thu May 26 02:36:14 CDT 2022


v2: Support only D2D1_MAP_OPTIONS_READ and always use staging resource.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/d2d1/bitmap.c       | 49 ++++++++++++++++++++++++++++++++++++++--
 dlls/d2d1/d2d1_private.h |  1 +
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index 971e3c7ff6b..b48c0bf2384 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -229,9 +229,54 @@ static HRESULT STDMETHODCALLTYPE d2d_bitmap_GetSurface(ID2D1Bitmap1 *iface, IDXG
 static HRESULT STDMETHODCALLTYPE d2d_bitmap_Map(ID2D1Bitmap1 *iface, D2D1_MAP_OPTIONS options,
         D2D1_MAPPED_RECT *mapped_rect)
 {
-    FIXME("iface %p, options %#x, mapped_rect %p stub!\n", iface, options, mapped_rect);
+    struct d2d_bitmap *bitmap = impl_from_ID2D1Bitmap1(iface);
+    ID3D11Device *device;
+    ID3D11DeviceContext *context;
+    D3D11_TEXTURE2D_DESC texture_desc;
+    ID3D11Texture2D *staging_texture;
+    D3D11_MAPPED_SUBRESOURCE mapped_subresource;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, options %#x, mapped_rect %p.\n", iface, options, mapped_rect);
+
+    if (options != D2D1_MAP_OPTIONS_READ)
+    {
+        FIXME("Unhandled map options %#x.\n", options);
+        return E_INVALIDARG;
+    }
+
+    if (!(bitmap->options & D2D1_BITMAP_OPTIONS_CPU_READ))
+        return E_INVALIDARG;
+
+    if (bitmap->staging_resource)
+        return D2DERR_WRONG_STATE;
+
+    ID3D11Resource_GetDevice(bitmap->resource, &device);
+    ID3D11Device_GetImmediateContext(device, &context);
+    ID3D11Texture2D_GetDesc((ID3D11Texture2D *)bitmap->resource, &texture_desc);
+
+    texture_desc.Usage = D3D11_USAGE_STAGING;
+    texture_desc.BindFlags = 0;
+    texture_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+    ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &staging_texture);
+    ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)staging_texture, bitmap->resource);
+    if (SUCCEEDED(hr = ID3D11DeviceContext_Map(context, (ID3D11Resource *)staging_texture, 0,
+            D3D11_MAP_READ, 0, &mapped_subresource)))
+    {
+        mapped_rect->pitch = mapped_subresource.RowPitch;
+        mapped_rect->bits = mapped_subresource.pData;
+        bitmap->staging_resource = (ID3D11Resource *)staging_texture;
+    }
+    else
+    {
+        WARN("Failed to map resource, hr %#lx.\n", hr);
+        ID3D11Texture2D_Release(staging_texture);
+    }
+
+    ID3D11DeviceContext_Release(context);
+    ID3D11Device_Release(device);
+
+    return hr;
 }
 
 static HRESULT STDMETHODCALLTYPE d2d_bitmap_Unmap(ID2D1Bitmap1 *iface)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 8edfa030ee1..b886ac52dd9 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -395,6 +395,7 @@ struct d2d_bitmap
     ID3D11RenderTargetView *rtv;
     IDXGISurface *surface;
     ID3D11Resource *resource;
+    ID3D11Resource *staging_resource;
     D2D1_SIZE_U pixel_size;
     D2D1_PIXEL_FORMAT format;
     float dpi_x;
-- 
2.36.1




More information about the wine-devel mailing list