Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplat/buffer.c | 127 ++++++++++++++++++++++++++++++++++--- dlls/mfplat/tests/mfplat.c | 72 +++++++++++++++++++++ 2 files changed, 190 insertions(+), 9 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index cf9ead7d809..fbd3b7786b6 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -64,7 +64,9 @@ struct memory_buffer struct { ID3D11Texture2D *texture; - unsigned int subresource; + unsigned int sub_resource_idx; + ID3D11Texture2D *rb_texture; + D3D11_MAPPED_SUBRESOURCE map_desc; struct attributes attributes; } dxgi_surface;
@@ -134,6 +136,8 @@ static ULONG WINAPI memory_buffer_Release(IMFMediaBuffer *iface) if (buffer->dxgi_surface.texture) { ID3D11Texture2D_Release(buffer->dxgi_surface.texture); + if (buffer->dxgi_surface.rb_texture) + ID3D11Texture2D_Release(buffer->dxgi_surface.rb_texture); clear_attributes_object(&buffer->dxgi_surface.attributes); } DeleteCriticalSection(&buffer->cs); @@ -834,6 +838,75 @@ static HRESULT WINAPI dxgi_1d_2d_buffer_QueryInterface(IMFMediaBuffer *iface, RE return S_OK; }
+static HRESULT dxgi_surface_buffer_create_readback_texture(struct memory_buffer *buffer) +{ + D3D11_TEXTURE2D_DESC texture_desc; + ID3D11Device *device; + HRESULT hr; + + if (buffer->dxgi_surface.rb_texture) + return S_OK; + + ID3D11Texture2D_GetDevice(buffer->dxgi_surface.texture, &device); + + ID3D11Texture2D_GetDesc(buffer->dxgi_surface.texture, &texture_desc); + texture_desc.Usage = D3D11_USAGE_STAGING; + texture_desc.BindFlags = 0; + texture_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; + texture_desc.MiscFlags = 0; + texture_desc.MipLevels = 1; + if (FAILED(hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &buffer->dxgi_surface.rb_texture))) + WARN("Failed to create readback texture, hr %#x.\n", hr); + + ID3D11Device_Release(device); + + return hr; +} + +static HRESULT dxgi_surface_buffer_map(struct memory_buffer *buffer) +{ + ID3D11DeviceContext *immediate_context; + ID3D11Device *device; + HRESULT hr; + + if (FAILED(hr = dxgi_surface_buffer_create_readback_texture(buffer))) + return hr; + + ID3D11Texture2D_GetDevice(buffer->dxgi_surface.texture, &device); + ID3D11Device_GetImmediateContext(device, &immediate_context); + ID3D11DeviceContext_CopySubresourceRegion(immediate_context, (ID3D11Resource *)buffer->dxgi_surface.rb_texture, + 0, 0, 0, 0, (ID3D11Resource *)buffer->dxgi_surface.texture, buffer->dxgi_surface.sub_resource_idx, NULL); + + memset(&buffer->dxgi_surface.map_desc, 0, sizeof(buffer->dxgi_surface.map_desc)); + if (FAILED(hr = ID3D11DeviceContext_Map(immediate_context, (ID3D11Resource *)buffer->dxgi_surface.rb_texture, + 0, D3D11_MAP_READ_WRITE, 0, &buffer->dxgi_surface.map_desc))) + { + WARN("Failed to map readback texture, hr %#x.\n", hr); + } + + ID3D11DeviceContext_Release(immediate_context); + ID3D11Device_Release(device); + + return hr; +} + +static void dxgi_surface_buffer_unmap(struct memory_buffer *buffer) +{ + ID3D11DeviceContext *immediate_context; + ID3D11Device *device; + + ID3D11Texture2D_GetDevice(buffer->dxgi_surface.texture, &device); + ID3D11Device_GetImmediateContext(device, &immediate_context); + ID3D11DeviceContext_Unmap(immediate_context, (ID3D11Resource *)buffer->dxgi_surface.rb_texture, 0); + memset(&buffer->dxgi_surface.map_desc, 0, sizeof(buffer->dxgi_surface.map_desc)); + + ID3D11DeviceContext_CopySubresourceRegion(immediate_context, (ID3D11Resource *)buffer->dxgi_surface.texture, + buffer->dxgi_surface.sub_resource_idx, 0, 0, 0, (ID3D11Resource *)buffer->dxgi_surface.rb_texture, 0, NULL); + + ID3D11DeviceContext_Release(immediate_context); + ID3D11Device_Release(device); +} + static HRESULT WINAPI dxgi_surface_buffer_Lock(IMFMediaBuffer *iface, BYTE **data, DWORD *max_length, DWORD *current_length) { @@ -862,16 +935,52 @@ static HRESULT WINAPI dxgi_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface
static HRESULT WINAPI dxgi_surface_buffer_Lock2D(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.linear_buffer) + hr = MF_E_UNEXPECTED; + else if (!buffer->_2d.locks++) + hr = dxgi_surface_buffer_map(buffer); + + if (SUCCEEDED(hr)) + { + *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_Unlock2D(IMF2DBuffer2 *iface) { - FIXME("%p.\n", iface); + struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + HRESULT hr = S_OK;
- return E_NOTIMPL; + TRACE("%p.\n", iface); + + EnterCriticalSection(&buffer->cs); + + if (buffer->_2d.locks) + { + if (!--buffer->_2d.locks) + dxgi_surface_buffer_unmap(buffer); + } + else + hr = HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED); + + LeaveCriticalSection(&buffer->cs); + + return hr; }
static HRESULT WINAPI dxgi_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) @@ -925,7 +1034,7 @@ static HRESULT WINAPI dxgi_buffer_GetSubresourceIndex(IMFDXGIBuffer *iface, UINT if (!index) return E_POINTER;
- *index = buffer->dxgi_surface.subresource; + *index = buffer->dxgi_surface.sub_resource_idx;
return S_OK; } @@ -1165,8 +1274,8 @@ static HRESULT create_d3d9_surface_buffer(IUnknown *surface, BOOL bottom_up, IMF return S_OK; }
-static HRESULT create_dxgi_surface_buffer(IUnknown *surface, UINT subresource, BOOL bottom_up, - IMFMediaBuffer **buffer) +static HRESULT create_dxgi_surface_buffer(IUnknown *surface, unsigned int sub_resource_idx, + BOOL bottom_up, IMFMediaBuffer **buffer) { struct memory_buffer *object; D3D11_TEXTURE2D_DESC desc; @@ -1208,7 +1317,7 @@ static HRESULT create_dxgi_surface_buffer(IUnknown *surface, UINT subresource, B object->refcount = 1; InitializeCriticalSection(&object->cs); object->dxgi_surface.texture = texture; - object->dxgi_surface.subresource = subresource; + object->dxgi_surface.sub_resource_idx = sub_resource_idx;
MFGetPlaneSize(format, desc.Width, desc.Height, &object->_2d.plane_size); object->_2d.width = stride; diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index b2b595b8fe7..dacad924ae9 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -6320,6 +6320,22 @@ static ID3D11Device *create_d3d11_device(void) return NULL; }
+static void update_d3d11_texture(ID3D11Texture2D *texture, unsigned int sub_resource_idx, + const BYTE *data, unsigned int src_pitch) +{ + ID3D11DeviceContext *immediate_context; + ID3D11Device *device; + + ID3D11Texture2D_GetDevice(texture, &device); + ID3D11Device_GetImmediateContext(device, &immediate_context); + + ID3D11DeviceContext_UpdateSubresource(immediate_context, (ID3D11Resource *)texture, + sub_resource_idx, NULL, data, src_pitch, 0); + + ID3D11DeviceContext_Release(immediate_context); + ID3D11Device_Release(device); +} + static void test_dxgi_surface_buffer(void) { DWORD max_length, cur_length, length, color; @@ -6329,10 +6345,12 @@ static void test_dxgi_surface_buffer(void) IMF2DBuffer *_2d_buffer; IMFMediaBuffer *buffer; ID3D11Device *device; + BYTE buff[64 * 64 * 4]; UINT index, size; IUnknown *obj; HRESULT hr; BYTE *data; + LONG pitch;
if (!pMFCreateDXGISurfaceBuffer) { @@ -6463,6 +6481,60 @@ todo_wine todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ /* Lock2D()/Unlock2D() */ + 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_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 = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length); +todo_wine + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); + + hr = IMF2DBuffer_Unlock2D(_2d_buffer); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMF2DBuffer_Unlock2D(_2d_buffer); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMF2DBuffer_Unlock2D(_2d_buffer); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); + + IMF2DBuffer_Release(_2d_buffer); + IMFMediaBuffer_Release(buffer); + + ID3D11Texture2D_Release(texture); + + /* Subresource index 1. */ + hr = ID3D11Device_CreateTexture2D(device, &desc, NULL, &texture); + ok(hr == S_OK, "Failed to create a texture, hr %#x.\n", hr); + + hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D11Texture2D, (IUnknown *)texture, 1, FALSE, &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); + + /* Pitch reflects top level. */ + memset(buff, 0, sizeof(buff)); + *(DWORD *)buff = 0xff00ff00; + update_d3d11_texture(texture, 1, buff, 64 * 4); + + hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); + ok(*(DWORD *)data == 0xff00ff00, "Unexpected color %#x.\n", *(DWORD *)data); + + hr = IMF2DBuffer_Unlock2D(_2d_buffer); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + IMF2DBuffer_Release(_2d_buffer); IMFMediaBuffer_Release(buffer);
ID3D11Texture2D_Release(texture);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- 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. */
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87697
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplat/buffer.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index e6bf52662e8..d4efafdea45 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -689,7 +689,11 @@ static HRESULT WINAPI d3d9_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *ifa EnterCriticalSection(&buffer->cs);
if (!buffer->_2d.locks) + { + *scanline0 = NULL; + *pitch = 0; hr = HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED); + } else { *scanline0 = buffer->d3d9_surface.rect.pBits;
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87698
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplat/buffer.c | 118 +++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 59 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index d4efafdea45..dd88a661e45 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -32,7 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
#define ALIGN_SIZE(size, alignment) (((size) + (alignment)) & ~((alignment)))
-struct memory_buffer +struct buffer { IMFMediaBuffer IMFMediaBuffer_iface; IMF2DBuffer2 IMF2DBuffer2_iface; @@ -73,29 +73,29 @@ struct memory_buffer CRITICAL_SECTION cs; };
-static inline struct memory_buffer *impl_from_IMFMediaBuffer(IMFMediaBuffer *iface) +static inline struct buffer *impl_from_IMFMediaBuffer(IMFMediaBuffer *iface) { - return CONTAINING_RECORD(iface, struct memory_buffer, IMFMediaBuffer_iface); + return CONTAINING_RECORD(iface, struct buffer, IMFMediaBuffer_iface); }
-static struct memory_buffer *impl_from_IMF2DBuffer2(IMF2DBuffer2 *iface) +static struct buffer *impl_from_IMF2DBuffer2(IMF2DBuffer2 *iface) { - return CONTAINING_RECORD(iface, struct memory_buffer, IMF2DBuffer2_iface); + return CONTAINING_RECORD(iface, struct buffer, IMF2DBuffer2_iface); }
-static struct memory_buffer *impl_from_IMFGetService(IMFGetService *iface) +static struct buffer *impl_from_IMFGetService(IMFGetService *iface) { - return CONTAINING_RECORD(iface, struct memory_buffer, IMFGetService_iface); + return CONTAINING_RECORD(iface, struct buffer, IMFGetService_iface); }
-static struct memory_buffer *impl_from_IMFDXGIBuffer(IMFDXGIBuffer *iface) +static struct buffer *impl_from_IMFDXGIBuffer(IMFDXGIBuffer *iface) { - return CONTAINING_RECORD(iface, struct memory_buffer, IMFDXGIBuffer_iface); + return CONTAINING_RECORD(iface, struct buffer, IMFDXGIBuffer_iface); }
static HRESULT WINAPI memory_buffer_QueryInterface(IMFMediaBuffer *iface, REFIID riid, void **out) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
@@ -114,7 +114,7 @@ static HRESULT WINAPI memory_buffer_QueryInterface(IMFMediaBuffer *iface, REFIID
static ULONG WINAPI memory_buffer_AddRef(IMFMediaBuffer *iface) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface); ULONG refcount = InterlockedIncrement(&buffer->refcount);
TRACE("%p, refcount %u.\n", buffer, refcount); @@ -124,7 +124,7 @@ static ULONG WINAPI memory_buffer_AddRef(IMFMediaBuffer *iface)
static ULONG WINAPI memory_buffer_Release(IMFMediaBuffer *iface) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface); ULONG refcount = InterlockedDecrement(&buffer->refcount);
TRACE("%p, refcount %u.\n", iface, refcount); @@ -151,7 +151,7 @@ static ULONG WINAPI memory_buffer_Release(IMFMediaBuffer *iface)
static HRESULT WINAPI memory_buffer_Lock(IMFMediaBuffer *iface, BYTE **data, DWORD *max_length, DWORD *current_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %p %p, %p.\n", iface, data, max_length, current_length);
@@ -176,7 +176,7 @@ static HRESULT WINAPI memory_buffer_Unlock(IMFMediaBuffer *iface)
static HRESULT WINAPI memory_buffer_GetCurrentLength(IMFMediaBuffer *iface, DWORD *current_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p.\n", iface);
@@ -190,7 +190,7 @@ static HRESULT WINAPI memory_buffer_GetCurrentLength(IMFMediaBuffer *iface, DWOR
static HRESULT WINAPI memory_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWORD current_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %u.\n", iface, current_length);
@@ -204,7 +204,7 @@ static HRESULT WINAPI memory_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWOR
static HRESULT WINAPI memory_buffer_GetMaxLength(IMFMediaBuffer *iface, DWORD *max_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %p.\n", iface, max_length);
@@ -230,7 +230,7 @@ static const IMFMediaBufferVtbl memory_1d_buffer_vtbl =
static HRESULT WINAPI memory_1d_2d_buffer_QueryInterface(IMFMediaBuffer *iface, REFIID riid, void **out) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
@@ -261,7 +261,7 @@ static HRESULT WINAPI memory_1d_2d_buffer_QueryInterface(IMFMediaBuffer *iface,
static HRESULT WINAPI memory_1d_2d_buffer_Lock(IMFMediaBuffer *iface, BYTE **data, DWORD *max_length, DWORD *current_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p, %p.\n", iface, data, max_length, current_length); @@ -299,7 +299,7 @@ static HRESULT WINAPI memory_1d_2d_buffer_Lock(IMFMediaBuffer *iface, BYTE **dat
static HRESULT WINAPI memory_1d_2d_buffer_Unlock(IMFMediaBuffer *iface) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p.\n", iface);
@@ -333,7 +333,7 @@ static const IMFMediaBufferVtbl memory_1d_2d_buffer_vtbl =
static HRESULT WINAPI d3d9_surface_buffer_Lock(IMFMediaBuffer *iface, BYTE **data, DWORD *max_length, DWORD *current_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p, %p.\n", iface, data, max_length, current_length); @@ -381,7 +381,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock(IMFMediaBuffer *iface, BYTE **dat
static HRESULT WINAPI d3d9_surface_buffer_Unlock(IMFMediaBuffer *iface) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface); HRESULT hr = S_OK;
TRACE("%p.\n", iface); @@ -412,7 +412,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Unlock(IMFMediaBuffer *iface)
static HRESULT WINAPI d3d9_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWORD current_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %u.\n", iface, current_length);
@@ -435,23 +435,23 @@ static const IMFMediaBufferVtbl d3d9_surface_1d_buffer_vtbl =
static HRESULT WINAPI memory_2d_buffer_QueryInterface(IMF2DBuffer2 *iface, REFIID riid, void **obj) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); return IMFMediaBuffer_QueryInterface(&buffer->IMFMediaBuffer_iface, riid, obj); }
static ULONG WINAPI memory_2d_buffer_AddRef(IMF2DBuffer2 *iface) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); return IMFMediaBuffer_AddRef(&buffer->IMFMediaBuffer_iface); }
static ULONG WINAPI memory_2d_buffer_Release(IMF2DBuffer2 *iface) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); return IMFMediaBuffer_Release(&buffer->IMFMediaBuffer_iface); }
-static HRESULT memory_2d_buffer_lock(struct memory_buffer *buffer, BYTE **scanline0, LONG *pitch, +static HRESULT memory_2d_buffer_lock(struct buffer *buffer, BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { HRESULT hr = S_OK; @@ -474,7 +474,7 @@ static HRESULT memory_2d_buffer_lock(struct memory_buffer *buffer, BYTE **scanli
static HRESULT WINAPI memory_2d_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr;
TRACE("%p, %p, %p.\n", iface, scanline0, pitch); @@ -493,7 +493,7 @@ static HRESULT WINAPI memory_2d_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanli
static HRESULT WINAPI memory_2d_buffer_Unlock2D(IMF2DBuffer2 *iface) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p.\n", iface); @@ -515,7 +515,7 @@ static HRESULT WINAPI memory_2d_buffer_Unlock2D(IMF2DBuffer2 *iface)
static HRESULT WINAPI memory_2d_buffer_GetScanline0AndPitch(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p.\n", iface, scanline0, pitch); @@ -552,7 +552,7 @@ static HRESULT WINAPI memory_2d_buffer_IsContiguousFormat(IMF2DBuffer2 *iface, B
static HRESULT WINAPI memory_2d_buffer_GetContiguousLength(IMF2DBuffer2 *iface, DWORD *length) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
TRACE("%p, %p.\n", iface, length);
@@ -581,7 +581,7 @@ static HRESULT WINAPI memory_2d_buffer_ContiguousCopyFrom(IMF2DBuffer2 *iface, c static HRESULT WINAPI memory_2d_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr;
TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length); @@ -623,7 +623,7 @@ static const IMF2DBuffer2Vtbl memory_2d_buffer_vtbl =
static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p.\n", iface, scanline0, pitch); @@ -653,7 +653,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca
static HRESULT WINAPI d3d9_surface_buffer_Unlock2D(IMF2DBuffer2 *iface) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p.\n", iface); @@ -678,7 +678,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Unlock2D(IMF2DBuffer2 *iface)
static HRESULT WINAPI d3d9_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p.\n", iface, scanline0, pitch); @@ -708,7 +708,7 @@ static HRESULT WINAPI d3d9_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *ifa static HRESULT WINAPI d3d9_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length); @@ -758,19 +758,19 @@ static const IMF2DBuffer2Vtbl d3d9_surface_buffer_vtbl =
static HRESULT WINAPI memory_2d_buffer_gs_QueryInterface(IMFGetService *iface, REFIID riid, void **obj) { - struct memory_buffer *buffer = impl_from_IMFGetService(iface); + struct buffer *buffer = impl_from_IMFGetService(iface); return IMFMediaBuffer_QueryInterface(&buffer->IMFMediaBuffer_iface, riid, obj); }
static ULONG WINAPI memory_2d_buffer_gs_AddRef(IMFGetService *iface) { - struct memory_buffer *buffer = impl_from_IMFGetService(iface); + struct buffer *buffer = impl_from_IMFGetService(iface); return IMFMediaBuffer_AddRef(&buffer->IMFMediaBuffer_iface); }
static ULONG WINAPI memory_2d_buffer_gs_Release(IMFGetService *iface) { - struct memory_buffer *buffer = impl_from_IMFGetService(iface); + struct buffer *buffer = impl_from_IMFGetService(iface); return IMFMediaBuffer_Release(&buffer->IMFMediaBuffer_iface); }
@@ -791,7 +791,7 @@ static const IMFGetServiceVtbl memory_2d_buffer_gs_vtbl =
static HRESULT WINAPI d3d9_surface_buffer_gs_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj) { - struct memory_buffer *buffer = impl_from_IMFGetService(iface); + struct buffer *buffer = impl_from_IMFGetService(iface);
TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
@@ -813,7 +813,7 @@ static const IMFGetServiceVtbl d3d9_surface_buffer_gs_vtbl =
static HRESULT WINAPI dxgi_1d_2d_buffer_QueryInterface(IMFMediaBuffer *iface, REFIID riid, void **out) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
@@ -842,7 +842,7 @@ static HRESULT WINAPI dxgi_1d_2d_buffer_QueryInterface(IMFMediaBuffer *iface, RE return S_OK; }
-static HRESULT dxgi_surface_buffer_create_readback_texture(struct memory_buffer *buffer) +static HRESULT dxgi_surface_buffer_create_readback_texture(struct buffer *buffer) { D3D11_TEXTURE2D_DESC texture_desc; ID3D11Device *device; @@ -867,7 +867,7 @@ static HRESULT dxgi_surface_buffer_create_readback_texture(struct memory_buffer return hr; }
-static HRESULT dxgi_surface_buffer_map(struct memory_buffer *buffer) +static HRESULT dxgi_surface_buffer_map(struct buffer *buffer) { ID3D11DeviceContext *immediate_context; ID3D11Device *device; @@ -894,7 +894,7 @@ static HRESULT dxgi_surface_buffer_map(struct memory_buffer *buffer) return hr; }
-static void dxgi_surface_buffer_unmap(struct memory_buffer *buffer) +static void dxgi_surface_buffer_unmap(struct buffer *buffer) { ID3D11DeviceContext *immediate_context; ID3D11Device *device; @@ -928,7 +928,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock(IMFMediaBuffer *iface)
static HRESULT WINAPI dxgi_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWORD current_length) { - struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
TRACE("%p, %u.\n", iface, current_length);
@@ -939,7 +939,7 @@ static HRESULT WINAPI dxgi_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface
static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p.\n", iface, scanline0, pitch); @@ -967,7 +967,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca
static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p.\n", iface); @@ -989,7 +989,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface)
static HRESULT WINAPI dxgi_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) { - struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p.\n", iface, scanline0, pitch); @@ -1026,25 +1026,25 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBu
static HRESULT WINAPI dxgi_buffer_QueryInterface(IMFDXGIBuffer *iface, REFIID riid, void **obj) { - struct memory_buffer *buffer = impl_from_IMFDXGIBuffer(iface); + struct buffer *buffer = impl_from_IMFDXGIBuffer(iface); return IMFMediaBuffer_QueryInterface(&buffer->IMFMediaBuffer_iface, riid, obj); }
static ULONG WINAPI dxgi_buffer_AddRef(IMFDXGIBuffer *iface) { - struct memory_buffer *buffer = impl_from_IMFDXGIBuffer(iface); + struct buffer *buffer = impl_from_IMFDXGIBuffer(iface); return IMFMediaBuffer_AddRef(&buffer->IMFMediaBuffer_iface); }
static ULONG WINAPI dxgi_buffer_Release(IMFDXGIBuffer *iface) { - struct memory_buffer *buffer = impl_from_IMFDXGIBuffer(iface); + struct buffer *buffer = impl_from_IMFDXGIBuffer(iface); return IMFMediaBuffer_Release(&buffer->IMFMediaBuffer_iface); }
static HRESULT WINAPI dxgi_buffer_GetResource(IMFDXGIBuffer *iface, REFIID riid, void **obj) { - struct memory_buffer *buffer = impl_from_IMFDXGIBuffer(iface); + struct buffer *buffer = impl_from_IMFDXGIBuffer(iface);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
@@ -1053,7 +1053,7 @@ static HRESULT WINAPI dxgi_buffer_GetResource(IMFDXGIBuffer *iface, REFIID riid,
static HRESULT WINAPI dxgi_buffer_GetSubresourceIndex(IMFDXGIBuffer *iface, UINT *index) { - struct memory_buffer *buffer = impl_from_IMFDXGIBuffer(iface); + struct buffer *buffer = impl_from_IMFDXGIBuffer(iface);
TRACE("%p, %p.\n", iface, index);
@@ -1067,7 +1067,7 @@ static HRESULT WINAPI dxgi_buffer_GetSubresourceIndex(IMFDXGIBuffer *iface, UINT
static HRESULT WINAPI dxgi_buffer_GetUnknown(IMFDXGIBuffer *iface, REFIID guid, REFIID riid, void **object) { - struct memory_buffer *buffer = impl_from_IMFDXGIBuffer(iface); + struct buffer *buffer = impl_from_IMFDXGIBuffer(iface);
TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(guid), debugstr_guid(riid), object);
@@ -1079,7 +1079,7 @@ static HRESULT WINAPI dxgi_buffer_GetUnknown(IMFDXGIBuffer *iface, REFIID guid,
static HRESULT WINAPI dxgi_buffer_SetUnknown(IMFDXGIBuffer *iface, REFIID guid, IUnknown *data) { - struct memory_buffer *buffer = impl_from_IMFDXGIBuffer(iface); + struct buffer *buffer = impl_from_IMFDXGIBuffer(iface); HRESULT hr = S_OK;
TRACE("%p, %s, %p.\n", iface, debugstr_guid(guid), data); @@ -1140,7 +1140,7 @@ static const IMFDXGIBufferVtbl dxgi_buffer_vtbl = dxgi_buffer_SetUnknown, };
-static HRESULT memory_buffer_init(struct memory_buffer *buffer, DWORD max_length, DWORD alignment, +static HRESULT memory_buffer_init(struct buffer *buffer, DWORD max_length, DWORD alignment, const IMFMediaBufferVtbl *vtbl) { buffer->data = heap_alloc_zero(ALIGN_SIZE(max_length, alignment)); @@ -1158,7 +1158,7 @@ static HRESULT memory_buffer_init(struct memory_buffer *buffer, DWORD max_length
static HRESULT create_1d_buffer(DWORD max_length, DWORD alignment, IMFMediaBuffer **buffer) { - struct memory_buffer *object; + struct buffer *object; HRESULT hr;
if (!buffer) @@ -1185,7 +1185,7 @@ static HRESULT create_1d_buffer(DWORD max_length, DWORD alignment, IMFMediaBuffe static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bottom_up, IMFMediaBuffer **buffer) { unsigned int stride, max_length, plane_size; - struct memory_buffer *object; + struct buffer *object; unsigned int row_alignment; GUID subtype; BOOL is_yuv; @@ -1263,7 +1263,7 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo
static HRESULT create_d3d9_surface_buffer(IUnknown *surface, BOOL bottom_up, IMFMediaBuffer **buffer) { - struct memory_buffer *object; + struct buffer *object; D3DSURFACE_DESC desc; unsigned int stride; GUID subtype; @@ -1303,7 +1303,7 @@ static HRESULT create_d3d9_surface_buffer(IUnknown *surface, BOOL bottom_up, IMF static HRESULT create_dxgi_surface_buffer(IUnknown *surface, unsigned int sub_resource_idx, BOOL bottom_up, IMFMediaBuffer **buffer) { - struct memory_buffer *object; + struct buffer *object; D3D11_TEXTURE2D_DESC desc; ID3D11Texture2D *texture; unsigned int stride;
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87699
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplat/buffer.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index dd88a661e45..77767c27d94 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -1019,9 +1019,34 @@ static HRESULT WINAPI dxgi_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *ifa static HRESULT WINAPI dxgi_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { - FIXME("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length); + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); + HRESULT hr = S_OK;
- return E_NOTIMPL; + TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length); + + if (!scanline0 || !pitch || !buffer_start || !buffer_length) + return E_POINTER; + + EnterCriticalSection(&buffer->cs); + + if (buffer->_2d.linear_buffer) + hr = MF_E_UNEXPECTED; + else if (!buffer->_2d.locks++) + hr = dxgi_surface_buffer_map(buffer); + + if (SUCCEEDED(hr)) + { + *scanline0 = buffer->dxgi_surface.map_desc.pData; + *pitch = buffer->dxgi_surface.map_desc.RowPitch; + if (buffer_start) + *buffer_start = *scanline0; + if (buffer_length) + *buffer_length = buffer->dxgi_surface.map_desc.RowPitch * buffer->_2d.height; + } + + LeaveCriticalSection(&buffer->cs); + + return hr; }
static HRESULT WINAPI dxgi_buffer_QueryInterface(IMFDXGIBuffer *iface, REFIID riid, void **obj)
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87700
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87696
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report