mfplat: Implement GetScanline0AndPitch() for d3d11 buffers.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-03-25 12:40:32 +03:00 committed by Alexandre Julliard
parent 9932a1943b
commit 01059d5946
2 changed files with 54 additions and 4 deletions

View File

@ -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,

View File

@ -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. */