Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dxgi/surface.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-)
diff --git a/dlls/dxgi/surface.c b/dlls/dxgi/surface.c index 1f53b25a91..4b1b83b84a 100644 --- a/dlls/dxgi/surface.c +++ b/dlls/dxgi/surface.c @@ -182,16 +182,43 @@ static HRESULT STDMETHODCALLTYPE dxgi_surface_GetDesc(IDXGISurface1 *iface, DXGI
static HRESULT STDMETHODCALLTYPE dxgi_surface_Map(IDXGISurface1 *iface, DXGI_MAPPED_RECT *mapped_rect, UINT flags) { - FIXME("iface %p, mapped_rect %p, flags %#x stub!\n", iface, mapped_rect, flags); + struct dxgi_surface *surface = impl_from_IDXGISurface1(iface); + struct wined3d_map_desc wined3d_map_desc; + DWORD wined3d_map_flags = 0; + HRESULT hr; + + TRACE("iface %p, mapped_rect %p, flags %#x.\n", iface, mapped_rect, flags); + + if (flags & DXGI_MAP_READ) + wined3d_map_flags |= WINED3D_MAP_READ; + if (flags & DXGI_MAP_WRITE) + wined3d_map_flags |= WINED3D_MAP_WRITE; + if (flags & DXGI_MAP_DISCARD) + wined3d_map_flags |= WINED3D_MAP_DISCARD; + + wined3d_mutex_lock(); + if (SUCCEEDED(hr = wined3d_resource_map(wined3d_texture_get_resource(surface->wined3d_texture), 0, + &wined3d_map_desc, NULL, wined3d_map_flags))) + { + mapped_rect->Pitch = wined3d_map_desc.row_pitch; + mapped_rect->pBits = wined3d_map_desc.data; + } + wined3d_mutex_unlock();
- return E_NOTIMPL; + return hr; }
static HRESULT STDMETHODCALLTYPE dxgi_surface_Unmap(IDXGISurface1 *iface) { - FIXME("iface %p stub!\n", iface); + struct dxgi_surface *surface = impl_from_IDXGISurface1(iface); + + TRACE("iface %p.\n", iface);
- return E_NOTIMPL; + wined3d_mutex_lock(); + wined3d_resource_unmap(wined3d_texture_get_resource(surface->wined3d_texture), 0); + wined3d_mutex_unlock(); + + return S_OK; }
/* IDXGISurface1 methods */