mirror of
git://source.winehq.org/git/wine.git
synced 2024-07-22 10:04:11 +00:00
mfplat/tests: Test locking flags for DXGI buffers.
This commit is contained in:
parent
c1eee92bd2
commit
f40e5fcb38
|
@ -230,7 +230,7 @@ static void put_d3d9_surface_color(IDirect3DSurface9 *surface,
|
||||||
|
|
||||||
struct d3d11_resource_readback
|
struct d3d11_resource_readback
|
||||||
{
|
{
|
||||||
ID3D11Resource *resource;
|
ID3D11Resource *orig_resource, *resource;
|
||||||
D3D11_MAPPED_SUBRESOURCE map_desc;
|
D3D11_MAPPED_SUBRESOURCE map_desc;
|
||||||
ID3D11DeviceContext *immediate_context;
|
ID3D11DeviceContext *immediate_context;
|
||||||
unsigned int width, height, depth, sub_resource_idx;
|
unsigned int width, height, depth, sub_resource_idx;
|
||||||
|
@ -242,6 +242,7 @@ static void init_d3d11_resource_readback(ID3D11Resource *resource, ID3D11Resourc
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
rb->orig_resource = resource;
|
||||||
rb->resource = readback_resource;
|
rb->resource = readback_resource;
|
||||||
rb->width = width;
|
rb->width = width;
|
||||||
rb->height = height;
|
rb->height = height;
|
||||||
|
@ -252,7 +253,7 @@ static void init_d3d11_resource_readback(ID3D11Resource *resource, ID3D11Resourc
|
||||||
|
|
||||||
ID3D11DeviceContext_CopyResource(rb->immediate_context, rb->resource, resource);
|
ID3D11DeviceContext_CopyResource(rb->immediate_context, rb->resource, resource);
|
||||||
if (FAILED(hr = ID3D11DeviceContext_Map(rb->immediate_context,
|
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);
|
trace("Failed to map resource, hr %#lx.\n", hr);
|
||||||
ID3D11Resource_Release(rb->resource);
|
ID3D11Resource_Release(rb->resource);
|
||||||
|
@ -278,7 +279,7 @@ static void get_d3d11_texture2d_readback(ID3D11Texture2D *texture, unsigned int
|
||||||
ID3D11Texture2D_GetDesc(texture, &texture_desc);
|
ID3D11Texture2D_GetDesc(texture, &texture_desc);
|
||||||
texture_desc.Usage = D3D11_USAGE_STAGING;
|
texture_desc.Usage = D3D11_USAGE_STAGING;
|
||||||
texture_desc.BindFlags = 0;
|
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;
|
texture_desc.MiscFlags = 0;
|
||||||
if (FAILED(hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, (ID3D11Texture2D **)&rb_texture)))
|
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);
|
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);
|
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);
|
ID3D11Resource_Release(rb->resource);
|
||||||
ID3D11DeviceContext_Release(rb->immediate_context);
|
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);
|
get_d3d11_texture2d_readback(texture, 0, &rb);
|
||||||
color = get_d3d11_readback_color(&rb, x, y, 0);
|
color = get_d3d11_readback_color(&rb, x, y, 0);
|
||||||
release_d3d11_resource_readback(&rb);
|
release_d3d11_resource_readback(&rb, FALSE);
|
||||||
|
|
||||||
return color;
|
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,
|
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,
|
const D3D_FEATURE_LEVEL *feature_levels, UINT levels, UINT sdk_version, ID3D11Device **device_out,
|
||||||
D3D_FEATURE_LEVEL *obtained_feature_level, ID3D11DeviceContext **immediate_context);
|
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;
|
DWORD max_length, cur_length, length, color;
|
||||||
IMFDXGIBuffer *dxgi_buffer;
|
IMFDXGIBuffer *dxgi_buffer;
|
||||||
D3D11_TEXTURE2D_DESC desc;
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
|
IMF2DBuffer2 *_2dbuffer2;
|
||||||
ID3D11Texture2D *texture;
|
ID3D11Texture2D *texture;
|
||||||
IMF2DBuffer *_2d_buffer;
|
IMF2DBuffer *_2d_buffer;
|
||||||
IMFMediaBuffer *buffer;
|
IMFMediaBuffer *buffer;
|
||||||
|
@ -7408,6 +7437,116 @@ static void test_d3d11_surface_buffer(void)
|
||||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||||
|
|
||||||
IMF2DBuffer_Release(_2d_buffer);
|
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);
|
IMFMediaBuffer_Release(buffer);
|
||||||
|
|
||||||
/* Bottom up. */
|
/* Bottom up. */
|
||||||
|
|
Loading…
Reference in a new issue