Nikolay Sivov : mfplat: Implement GetScanline0AndPitch() for d3d11 buffers.

Alexandre Julliard julliard at winehq.org
Thu Mar 25 16:49:22 CDT 2021


Module: wine
Branch: master
Commit: 01059d5946575d245d814f4c8247d4bae19887be
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=01059d5946575d245d814f4c8247d4bae19887be

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Mar 25 12:40:32 2021 +0300

mfplat: Implement GetScanline0AndPitch() for d3d11 buffers.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfplat/buffer.c       | 26 ++++++++++++++++++++++++--
 dlls/mfplat/tests/mfplat.c | 32 ++++++++++++++++++++++++++++++--
 2 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index fbd3b7786b6..e6bf52662e8 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -985,9 +985,31 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface)
 
 static HRESULT WINAPI dxgi_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch)
 {
-    FIXME("%p, %p, %p.\n", iface, scanline0, pitch);
+    struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p, %p.\n", iface, scanline0, pitch);
+
+    if (!scanline0 || !pitch)
+        return E_POINTER;
+
+    EnterCriticalSection(&buffer->cs);
+
+    if (!buffer->_2d.locks)
+    {
+        *scanline0 = NULL;
+        *pitch = 0;
+        hr = HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED);
+    }
+    else
+    {
+        *scanline0 = buffer->dxgi_surface.map_desc.pData;
+        *pitch = buffer->dxgi_surface.map_desc.RowPitch;
+    }
+
+    LeaveCriticalSection(&buffer->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI dxgi_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags,
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index dacad924ae9..18361d4d721 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -6346,11 +6346,11 @@ static void test_dxgi_surface_buffer(void)
     IMFMediaBuffer *buffer;
     ID3D11Device *device;
     BYTE buff[64 * 64 * 4];
+    BYTE *data, *data2;
+    LONG pitch, pitch2;
     UINT index, size;
     IUnknown *obj;
     HRESULT hr;
-    BYTE *data;
-    LONG pitch;
 
     if (!pMFCreateDXGISurfaceBuffer)
     {
@@ -6485,6 +6485,9 @@ todo_wine
     hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
+    hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2);
+    ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr);
+
     hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch);
@@ -6493,6 +6496,10 @@ todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch);
 
+    hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(data2 == data && pitch2 == pitch, "Unexpected data/pitch.\n");
+
     hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length);
 todo_wine
     ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
@@ -6509,6 +6516,27 @@ todo_wine
     IMF2DBuffer_Release(_2d_buffer);
     IMFMediaBuffer_Release(buffer);
 
+    /* Bottom up. */
+    hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D11Texture2D, (IUnknown *)texture, 0, TRUE, &buffer);
+    ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr);
+
+    hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch);
+
+    hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(data2 == data && pitch2 == pitch, "Unexpected data/pitch.\n");
+
+    hr = IMF2DBuffer_Unlock2D(_2d_buffer);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    IMF2DBuffer_Release(_2d_buffer);
+    IMFMediaBuffer_Release(buffer);
+
     ID3D11Texture2D_Release(texture);
 
     /* Subresource index 1. */




More information about the wine-cvs mailing list