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