From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/tests/mfplat.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 58321672cea..5b3bcf80fe1 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -6623,6 +6623,15 @@ static void test_MFCreateDXSurfaceBuffer(void) hr = IMF2DBuffer_Unlock2D(_2dbuffer); ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); + ok(hr == MF_E_UNEXPECTED, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaBuffer_Unlock(buffer); + ok(hr == S_OK || broken(broken_test), "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer_IsContiguousFormat(_2dbuffer, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(!value, "Unexpected return value %d.\n", value);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/tests/mfplat.c | 67 +++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 5b3bcf80fe1..0487a7db5ce 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -6647,6 +6647,8 @@ static void test_MFCreateDXSurfaceBuffer(void) hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer2, (void **)&_2dbuffer2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ /* Lock flags are ignored, so writing is allowed when locking for + * reading and viceversa. */ hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(data == data2, "Unexpected scanline pointer.\n"); @@ -6664,9 +6666,72 @@ static void test_MFCreateDXSurfaceBuffer(void) hr = IMFMediaBuffer_Unlock(buffer); ok(hr == S_OK || broken(broken_test), "Unexpected hr %#lx.\n", hr);
+ /* Also, flags incompatibilities are not taken into account even + * if a buffer is already locked. */ hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - IMF2DBuffer2_Unlock2D(_2dbuffer2); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* Except when originally locking for writing. */ + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr);
IMF2DBuffer2_Release(_2dbuffer2);
From: Giovanni Mascellani gmascellani@codeweavers.com
In the previous test the same address was always returned for data, hinting that the tests might have been succeding just because of some aliasing reason. The new tests show that this is not the case: even when transferring data through another throw-away surface, changes are seen and recorded independently of the locking flags. --- dlls/mfplat/tests/mfplat.c | 122 +++++++++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 6 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 0487a7db5ce..ff15ca4a712 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -123,6 +123,111 @@ static void check_service_interface_(unsigned int line, void *iface_ptr, REFGUID IUnknown_Release(unk); }
+struct d3d9_surface_readback +{ + IDirect3DSurface9 *surface, *readback_surface; + D3DLOCKED_RECT map_desc; + D3DSURFACE_DESC surf_desc; +}; + +static void get_d3d9_surface_readback(IDirect3DSurface9 *surface, struct d3d9_surface_readback *rb) +{ + IDirect3DDevice9 *device; + HRESULT hr; + + rb->surface = surface; + + hr = IDirect3DSurface9_GetDevice(surface, &device); + ok(hr == D3D_OK, "Failed to get device, hr %#lx.\n", hr); + + hr = IDirect3DSurface9_GetDesc(surface, &rb->surf_desc); + ok(hr == D3D_OK, "Failed to get surface desc, hr %#lx.\n", hr); + hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, rb->surf_desc.Width, rb->surf_desc.Height, + rb->surf_desc.Format, D3DPOOL_SYSTEMMEM, &rb->readback_surface, NULL); + ok(hr == D3D_OK, "Failed to create surface, hr %#lx.\n", hr); + + hr = IDirect3DDevice9Ex_GetRenderTargetData(device, surface, rb->readback_surface); + ok(hr == D3D_OK, "Failed to get render target data, hr %#lx.\n", hr); + + hr = IDirect3DSurface9_LockRect(rb->readback_surface, &rb->map_desc, NULL, 0); + ok(hr == D3D_OK, "Failed to lock surface, hr %#lx.\n", hr); + + IDirect3DDevice9_Release(device); +} + +static void release_d3d9_surface_readback(struct d3d9_surface_readback *rb, BOOL upload) +{ + ULONG refcount; + HRESULT hr; + + hr = IDirect3DSurface9_UnlockRect(rb->readback_surface); + ok(hr == D3D_OK, "Failed to unlock surface, hr %#lx.\n", hr); + + if (upload) + { + IDirect3DDevice9 *device; + + IDirect3DSurface9_GetDevice(rb->surface, &device); + ok(hr == D3D_OK, "Failed to get device, hr %#lx.\n", hr); + + hr = IDirect3DDevice9_UpdateSurface(device, rb->readback_surface, NULL, rb->surface, NULL); + ok(hr == D3D_OK, "Failed to update surface, hr %#lx.\n", hr); + + IDirect3DDevice9_Release(device); + } + + refcount = IDirect3DSurface9_Release(rb->readback_surface); + ok(refcount == 0, "Readback surface still has references.\n"); +} + +static void *get_d3d9_readback_data(struct d3d9_surface_readback *rb, + unsigned int x, unsigned int y, unsigned byte_width) +{ + return (BYTE *)rb->map_desc.pBits + y * rb->map_desc.Pitch + x * byte_width; +} + +static DWORD get_d3d9_readback_u32(struct d3d9_surface_readback *rb, unsigned int x, unsigned int y) +{ + return *(DWORD *)get_d3d9_readback_data(rb, x, y, sizeof(DWORD)); +} + +static DWORD get_d3d9_readback_color(struct d3d9_surface_readback *rb, unsigned int x, unsigned int y) +{ + return get_d3d9_readback_u32(rb, x, y); +} + +static DWORD get_d3d9_surface_color(IDirect3DSurface9 *surface, unsigned int x, unsigned int y) +{ + struct d3d9_surface_readback rb; + DWORD color; + + get_d3d9_surface_readback(surface, &rb); + color = get_d3d9_readback_color(&rb, x, y); + release_d3d9_surface_readback(&rb, FALSE); + + return color; +} + +static void put_d3d9_readback_u32(struct d3d9_surface_readback *rb, unsigned int x, unsigned int y, DWORD color) +{ + *(DWORD *)get_d3d9_readback_data(rb, x, y, sizeof(DWORD)) = color; +} + +static void put_d3d9_readback_color(struct d3d9_surface_readback *rb, unsigned int x, unsigned int y, DWORD color) +{ + put_d3d9_readback_u32(rb, x, y, color); +} + +static void put_d3d9_surface_color(IDirect3DSurface9 *surface, + unsigned int x, unsigned int y, DWORD color) +{ + struct d3d9_surface_readback rb; + + get_d3d9_surface_readback(surface, &rb); + put_d3d9_readback_color(&rb, x, y, color); + release_d3d9_surface_readback(&rb, TRUE); +} + struct d3d11_resource_readback { ID3D11Resource *resource; @@ -6468,6 +6573,7 @@ static void test_MFCreateDXSurfaceBuffer(void) BYTE *data, *data2; IMFGetService *gs; IDirect3D9 *d3d; + DWORD color; HWND window; HRESULT hr; LONG pitch; @@ -6649,22 +6755,26 @@ static void test_MFCreateDXSurfaceBuffer(void)
/* Lock flags are ignored, so writing is allowed when locking for * reading and viceversa. */ + put_d3d9_surface_color(backbuffer, 0, 0, 0xcdcdcdcd); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(data == data2, "Unexpected scanline pointer.\n"); + ok(data[0] == 0xcd, "Unexpected leading byte.\n"); memset(data, 0xab, 4); IMF2DBuffer2_Unlock2D(_2dbuffer2);
+ color = get_d3d9_surface_color(backbuffer, 0, 0); + ok(color == 0xabababab, "Unexpected leading dword.\n"); + put_d3d9_surface_color(backbuffer, 0, 0, 0xefefefef); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(data[0] == 0xab, "Unexpected leading byte.\n"); + ok(data[0] == 0xef, "Unexpected leading byte.\n"); + memset(data, 0x89, 4); IMF2DBuffer2_Unlock2D(_2dbuffer2);
- hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(data[0] == 0xab || broken(broken_test), "Unexpected leading byte.\n"); - hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK || broken(broken_test), "Unexpected hr %#lx.\n", hr); + color = get_d3d9_surface_color(backbuffer, 0, 0); + ok(color == 0x89898989, "Unexpected leading dword.\n");
/* Also, flags incompatibilities are not taken into account even * if a buffer is already locked. */
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/buffer.c | 8 ++++++-- dlls/mfplat/tests/mfplat.c | 4 ---- 2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index a221c6d55b8..df85af37126 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -56,6 +56,7 @@ struct buffer unsigned int height; int pitch; unsigned int locks; + MF2DBuffer_LockFlags lock_flags; p_copy_image_func copy_image; } _2d; struct @@ -663,12 +664,14 @@ static HRESULT d3d9_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFl if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; else if (!buffer->_2d.locks) - { hr = IDirect3DSurface9_LockRect(buffer->d3d9_surface.surface, &buffer->d3d9_surface.rect, NULL, 0); - } + else if (buffer->_2d.lock_flags == MF2DBuffer_LockFlags_Write && flags != MF2DBuffer_LockFlags_Write) + hr = HRESULT_FROM_WIN32(ERROR_WAS_LOCKED);
if (SUCCEEDED(hr)) { + if (!buffer->_2d.locks) + buffer->_2d.lock_flags = flags; buffer->_2d.locks++; *scanline0 = buffer->d3d9_surface.rect.pBits; *pitch = buffer->d3d9_surface.rect.Pitch; @@ -715,6 +718,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Unlock2D(IMF2DBuffer2 *iface) { IDirect3DSurface9_UnlockRect(buffer->d3d9_surface.surface); memset(&buffer->d3d9_surface.rect, 0, sizeof(buffer->d3d9_surface.rect)); + buffer->_2d.lock_flags = 0; } } else diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index ff15ca4a712..29680cbb4d1 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -6826,13 +6826,10 @@ static void test_MFCreateDXSurfaceBuffer(void) hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -6840,7 +6837,6 @@ static void test_MFCreateDXSurfaceBuffer(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr);
IMF2DBuffer2_Release(_2dbuffer2);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/tests/mfplat.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 29680cbb4d1..9b5e71e276a 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7398,6 +7398,15 @@ static void test_d3d11_surface_buffer(void) hr = IMF2DBuffer_Unlock2D(_2d_buffer); ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); + ok(hr == MF_E_UNEXPECTED, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaBuffer_Unlock(buffer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMF2DBuffer_Release(_2d_buffer); IMFMediaBuffer_Release(buffer);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/tests/mfplat.c | 149 +++++++++++++++++++++++++++++++++++-- 1 file changed, 144 insertions(+), 5 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 9b5e71e276a..9ea2014ed4b 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -230,7 +230,7 @@ static void put_d3d9_surface_color(IDirect3DSurface9 *surface,
struct d3d11_resource_readback { - ID3D11Resource *resource; + ID3D11Resource *orig_resource, *resource; D3D11_MAPPED_SUBRESOURCE map_desc; ID3D11DeviceContext *immediate_context; unsigned int width, height, depth, sub_resource_idx; @@ -242,6 +242,7 @@ static void init_d3d11_resource_readback(ID3D11Resource *resource, ID3D11Resourc { HRESULT hr;
+ rb->orig_resource = resource; rb->resource = readback_resource; rb->width = width; rb->height = height; @@ -252,7 +253,7 @@ static void init_d3d11_resource_readback(ID3D11Resource *resource, ID3D11Resourc
ID3D11DeviceContext_CopyResource(rb->immediate_context, rb->resource, resource); if (FAILED(hr = ID3D11DeviceContext_Map(rb->immediate_context, - rb->resource, sub_resource_idx, D3D11_MAP_READ, 0, &rb->map_desc))) + rb->resource, sub_resource_idx, D3D11_MAP_READ_WRITE, 0, &rb->map_desc))) { trace("Failed to map resource, hr %#lx.\n", hr); ID3D11Resource_Release(rb->resource); @@ -278,7 +279,7 @@ static void get_d3d11_texture2d_readback(ID3D11Texture2D *texture, unsigned int ID3D11Texture2D_GetDesc(texture, &texture_desc); texture_desc.Usage = D3D11_USAGE_STAGING; texture_desc.BindFlags = 0; - texture_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + texture_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; texture_desc.MiscFlags = 0; if (FAILED(hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, (ID3D11Texture2D **)&rb_texture))) { @@ -296,9 +297,15 @@ static void get_d3d11_texture2d_readback(ID3D11Texture2D *texture, unsigned int ID3D11Device_Release(device); }
-static void release_d3d11_resource_readback(struct d3d11_resource_readback *rb) +static void release_d3d11_resource_readback(struct d3d11_resource_readback *rb, BOOL upload) { ID3D11DeviceContext_Unmap(rb->immediate_context, rb->resource, rb->sub_resource_idx); + + if (upload) + { + ID3D11DeviceContext_CopyResource(rb->immediate_context, rb->orig_resource, rb->resource); + } + ID3D11Resource_Release(rb->resource); ID3D11DeviceContext_Release(rb->immediate_context); } @@ -326,11 +333,32 @@ static DWORD get_d3d11_texture_color(ID3D11Texture2D *texture, unsigned int x, u
get_d3d11_texture2d_readback(texture, 0, &rb); color = get_d3d11_readback_color(&rb, x, y, 0); - release_d3d11_resource_readback(&rb); + release_d3d11_resource_readback(&rb, FALSE);
return color; }
+static void put_d3d11_readback_u32(struct d3d11_resource_readback *rb, + unsigned int x, unsigned int y, unsigned int z, DWORD color) +{ + *(DWORD *)get_d3d11_readback_data(rb, x, y, z, sizeof(DWORD)) = color; +} + +static void put_d3d11_readback_color(struct d3d11_resource_readback *rb, + unsigned int x, unsigned int y, unsigned int z, DWORD color) +{ + put_d3d11_readback_u32(rb, x, y, z, color); +} + +static void put_d3d11_texture_color(ID3D11Texture2D *texture, unsigned int x, unsigned int y, DWORD color) +{ + struct d3d11_resource_readback rb; + + get_d3d11_texture2d_readback(texture, 0, &rb); + put_d3d11_readback_color(&rb, x, y, 0, color); + release_d3d11_resource_readback(&rb, TRUE); +} + static HRESULT (WINAPI *pD3D11CreateDevice)(IDXGIAdapter *adapter, D3D_DRIVER_TYPE driver_type, HMODULE swrast, UINT flags, const D3D_FEATURE_LEVEL *feature_levels, UINT levels, UINT sdk_version, ID3D11Device **device_out, D3D_FEATURE_LEVEL *obtained_feature_level, ID3D11DeviceContext **immediate_context); @@ -7229,6 +7257,7 @@ static void test_d3d11_surface_buffer(void) DWORD max_length, cur_length, length, color; IMFDXGIBuffer *dxgi_buffer; D3D11_TEXTURE2D_DESC desc; + IMF2DBuffer2 *_2dbuffer2; ID3D11Texture2D *texture; IMF2DBuffer *_2d_buffer; IMFMediaBuffer *buffer; @@ -7408,6 +7437,116 @@ static void test_d3d11_surface_buffer(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
IMF2DBuffer_Release(_2d_buffer); + + hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer2, (void **)&_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* Lock flags are honored, so reads and writes are discarded if + * the flags are not correct. */ + put_d3d11_texture_color(texture, 0, 0, 0xcdcdcdcd); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(data == data2, "Unexpected scanline pointer.\n"); + ok(*(DWORD *)data == 0xcdcdcdcd, "Unexpected leading dword %#lx.\n", *(DWORD *)data); + memset(data, 0xab, 4); + IMF2DBuffer2_Unlock2D(_2dbuffer2); + + color = get_d3d11_texture_color(texture, 0, 0); + todo_wine + ok(color == 0xcdcdcdcd, "Unexpected leading dword %#lx.\n", color); + put_d3d11_texture_color(texture, 0, 0, 0xefefefef); + + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(*(DWORD *)data != 0xefefefef, "Unexpected leading dword.\n"); + memset(data, 0x89, 4); + IMF2DBuffer2_Unlock2D(_2dbuffer2); + + color = get_d3d11_texture_color(texture, 0, 0); + ok(color == 0x89898989, "Unexpected leading dword %#lx.\n", color); + + /* When relocking for writing, stores are committed even if they + * were issued before relocking. */ + put_d3d11_texture_color(texture, 0, 0, 0xcdcdcdcd); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + memset(data, 0xab, 4); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMF2DBuffer2_Unlock2D(_2dbuffer2); + IMF2DBuffer2_Unlock2D(_2dbuffer2); + + color = get_d3d11_texture_color(texture, 0, 0); + ok(color == 0xabababab, "Unexpected leading dword %#lx.\n", color); + + /* Flags incompatibilities. */ + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* Except when originally locking for writing. */ + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); + todo_wine + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + + IMF2DBuffer2_Release(_2dbuffer2); IMFMediaBuffer_Release(buffer);
/* Bottom up. */
From: Giovanni Mascellani gmascellani@codeweavers.com
Analogous to 44c9ea50432771258e9eed012967a16c6f132fe9. --- dlls/mfplat/buffer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index df85af37126..1c38e03c3e1 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -1039,11 +1039,12 @@ static HRESULT dxgi_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFl
if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; - else if (!buffer->_2d.locks++) + else if (!buffer->_2d.locks) hr = dxgi_surface_buffer_map(buffer);
if (SUCCEEDED(hr)) { + buffer->_2d.locks++; *scanline0 = buffer->dxgi_surface.map_desc.pData; *pitch = buffer->dxgi_surface.map_desc.RowPitch; if (buffer_start)
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/buffer.c | 7 +++++++ dlls/mfplat/tests/mfplat.c | 4 ---- 2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index 1c38e03c3e1..c8e797e6743 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -1041,9 +1041,13 @@ static HRESULT dxgi_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFl hr = MF_E_UNEXPECTED; else if (!buffer->_2d.locks) hr = dxgi_surface_buffer_map(buffer); + else if (buffer->_2d.lock_flags == MF2DBuffer_LockFlags_Write && flags != MF2DBuffer_LockFlags_Write) + hr = HRESULT_FROM_WIN32(ERROR_WAS_LOCKED);
if (SUCCEEDED(hr)) { + if (!buffer->_2d.locks) + buffer->_2d.lock_flags = flags; buffer->_2d.locks++; *scanline0 = buffer->dxgi_surface.map_desc.pData; *pitch = buffer->dxgi_surface.map_desc.RowPitch; @@ -1087,7 +1091,10 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface) if (buffer->_2d.locks) { if (!--buffer->_2d.locks) + { dxgi_surface_buffer_unmap(buffer); + buffer->_2d.lock_flags = 0; + } } else hr = HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED); diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 9ea2014ed4b..635eebf30a5 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7529,13 +7529,10 @@ static void test_d3d11_surface_buffer(void) hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_LOCKED), "Unexpected hr %#lx.\n", hr); hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -7543,7 +7540,6 @@ static void test_d3d11_surface_buffer(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMF2DBuffer2_Unlock2D(_2dbuffer2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr);
IMF2DBuffer2_Release(_2dbuffer2);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/buffer.c | 14 +++++++++----- dlls/mfplat/tests/mfplat.c | 1 - 2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index c8e797e6743..c0874faa23d 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -905,7 +905,7 @@ static HRESULT dxgi_surface_buffer_create_readback_texture(struct buffer *buffer return hr; }
-static HRESULT dxgi_surface_buffer_map(struct buffer *buffer) +static HRESULT dxgi_surface_buffer_map(struct buffer *buffer, MF2DBuffer_LockFlags flags) { ID3D11DeviceContext *immediate_context; ID3D11Device *device; @@ -916,8 +916,12 @@ static HRESULT dxgi_surface_buffer_map(struct buffer *buffer)
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); + + if (flags == MF2DBuffer_LockFlags_Read || flags == MF2DBuffer_LockFlags_ReadWrite) + { + 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, @@ -971,7 +975,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock(IMFMediaBuffer *iface, BYTE **dat
if (SUCCEEDED(hr)) { - hr = dxgi_surface_buffer_map(buffer); + hr = dxgi_surface_buffer_map(buffer, MF2DBuffer_LockFlags_ReadWrite); if (SUCCEEDED(hr)) { copy_image(buffer, buffer->_2d.linear_buffer, buffer->_2d.width, buffer->dxgi_surface.map_desc.pData, @@ -1040,7 +1044,7 @@ static HRESULT dxgi_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFl if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; else if (!buffer->_2d.locks) - hr = dxgi_surface_buffer_map(buffer); + hr = dxgi_surface_buffer_map(buffer, flags); else if (buffer->_2d.lock_flags == MF2DBuffer_LockFlags_Write && flags != MF2DBuffer_LockFlags_Write) hr = HRESULT_FROM_WIN32(ERROR_WAS_LOCKED);
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 635eebf30a5..ccb29a8709d 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7458,7 +7458,6 @@ static void test_d3d11_surface_buffer(void)
hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(*(DWORD *)data != 0xefefefef, "Unexpected leading dword.\n"); memset(data, 0x89, 4); IMF2DBuffer2_Unlock2D(_2dbuffer2);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/buffer.c | 15 ++++++++++----- dlls/mfplat/tests/mfplat.c | 1 - 2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index c0874faa23d..d8de06fb23a 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -936,7 +936,7 @@ static HRESULT dxgi_surface_buffer_map(struct buffer *buffer, MF2DBuffer_LockFla return hr; }
-static void dxgi_surface_buffer_unmap(struct buffer *buffer) +static void dxgi_surface_buffer_unmap(struct buffer *buffer, MF2DBuffer_LockFlags flags) { ID3D11DeviceContext *immediate_context; ID3D11Device *device; @@ -946,8 +946,11 @@ static void dxgi_surface_buffer_unmap(struct buffer *buffer) 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); + if (flags == MF2DBuffer_LockFlags_Write || flags == MF2DBuffer_LockFlags_ReadWrite) + { + 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); @@ -1014,7 +1017,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock(IMFMediaBuffer *iface) { copy_image(buffer, buffer->dxgi_surface.map_desc.pData, buffer->dxgi_surface.map_desc.RowPitch, buffer->_2d.linear_buffer, buffer->_2d.width, buffer->_2d.width, buffer->_2d.height); - dxgi_surface_buffer_unmap(buffer); + dxgi_surface_buffer_unmap(buffer, MF2DBuffer_LockFlags_ReadWrite);
free(buffer->_2d.linear_buffer); buffer->_2d.linear_buffer = NULL; @@ -1052,6 +1055,8 @@ static HRESULT dxgi_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFl { if (!buffer->_2d.locks) buffer->_2d.lock_flags = flags; + else + buffer->_2d.lock_flags |= flags; buffer->_2d.locks++; *scanline0 = buffer->dxgi_surface.map_desc.pData; *pitch = buffer->dxgi_surface.map_desc.RowPitch; @@ -1096,7 +1101,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface) { if (!--buffer->_2d.locks) { - dxgi_surface_buffer_unmap(buffer); + dxgi_surface_buffer_unmap(buffer, buffer->_2d.lock_flags); buffer->_2d.lock_flags = 0; } } diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index ccb29a8709d..f5fdfd0be3d 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7452,7 +7452,6 @@ static void test_d3d11_surface_buffer(void) IMF2DBuffer2_Unlock2D(_2dbuffer2);
color = get_d3d11_texture_color(texture, 0, 0); - todo_wine ok(color == 0xcdcdcdcd, "Unexpected leading dword %#lx.\n", color); put_d3d11_texture_color(texture, 0, 0, 0xefefefef);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mfplat/tests/mfplat.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index f5fdfd0be3d..77b7b26ba9c 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7442,7 +7442,8 @@ static void test_d3d11_surface_buffer(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
/* Lock flags are honored, so reads and writes are discarded if - * the flags are not correct. */ + * the flags are not correct. Also, previous content is discarded + * when locking for writing and not for reading. */ put_d3d11_texture_color(texture, 0, 0, 0xcdcdcdcd); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -7455,6 +7456,14 @@ static void test_d3d11_surface_buffer(void) ok(color == 0xcdcdcdcd, "Unexpected leading dword %#lx.\n", color); put_d3d11_texture_color(texture, 0, 0, 0xefefefef);
+ hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(*(DWORD *)data != 0xefefefef, "Unexpected leading dword.\n"); + IMF2DBuffer2_Unlock2D(_2dbuffer2); + + color = get_d3d11_texture_color(texture, 0, 0); + ok(color != 0xefefefef, "Unexpected leading dword.\n"); + hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(*(DWORD *)data != 0xefefefef, "Unexpected leading dword.\n");
Nikolay Sivov (@nsivov) commented about dlls/mfplat/buffer.c:
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);
- if (flags == MF2DBuffer_LockFlags_Read || flags == MF2DBuffer_LockFlags_ReadWrite)
This could be a bitwise check for MF2DBuffer_LockFlags_Read. Not sure what's better.
This merge request was approved by Nikolay Sivov.
On Tue Apr 25 15:20:57 2023 +0000, Nikolay Sivov wrote:
This could be a bitwise check for MF2DBuffer_LockFlags_Read. Not sure what's better.
Agreed, I was unsure too.