d3d11/tests: Run test_*() functions for each feature level separately.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
568e08e27e
commit
93ae9dd1d2
|
@ -33,17 +33,6 @@
|
||||||
|
|
||||||
#define SWAPCHAIN_FLAG_SHADER_INPUT 0x1
|
#define SWAPCHAIN_FLAG_SHADER_INPUT 0x1
|
||||||
|
|
||||||
static const D3D_FEATURE_LEVEL d3d11_feature_levels[] =
|
|
||||||
{
|
|
||||||
D3D_FEATURE_LEVEL_11_1,
|
|
||||||
D3D_FEATURE_LEVEL_11_0,
|
|
||||||
D3D_FEATURE_LEVEL_10_1,
|
|
||||||
D3D_FEATURE_LEVEL_10_0,
|
|
||||||
D3D_FEATURE_LEVEL_9_3,
|
|
||||||
D3D_FEATURE_LEVEL_9_2,
|
|
||||||
D3D_FEATURE_LEVEL_9_1
|
|
||||||
};
|
|
||||||
|
|
||||||
struct format_support
|
struct format_support
|
||||||
{
|
{
|
||||||
DXGI_FORMAT format;
|
DXGI_FORMAT format;
|
||||||
|
@ -1464,95 +1453,85 @@ static void test_create_device(void)
|
||||||
DestroyWindow(window);
|
DestroyWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_device_interfaces(void)
|
static void test_device_interfaces(const D3D_FEATURE_LEVEL feature_level)
|
||||||
{
|
{
|
||||||
|
struct device_desc device_desc;
|
||||||
IDXGIAdapter *dxgi_adapter;
|
IDXGIAdapter *dxgi_adapter;
|
||||||
IDXGIDevice *dxgi_device;
|
IDXGIDevice *dxgi_device;
|
||||||
ID3D11Device *device;
|
ID3D11Device *device;
|
||||||
IUnknown *iface;
|
IUnknown *iface;
|
||||||
ULONG refcount;
|
ULONG refcount;
|
||||||
unsigned int i;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
for (i = 0; i < sizeof(d3d11_feature_levels) / sizeof(*d3d11_feature_levels); ++i)
|
device_desc.feature_level = &feature_level;
|
||||||
|
device_desc.flags = 0;
|
||||||
|
if (!(device = create_device(&device_desc)))
|
||||||
{
|
{
|
||||||
struct device_desc device_desc;
|
skip("Failed to create device for feature level %#x.\n", feature_level);
|
||||||
|
return;
|
||||||
device_desc.feature_level = &d3d11_feature_levels[i];
|
|
||||||
device_desc.flags = 0;
|
|
||||||
if (!(device = create_device(&device_desc)))
|
|
||||||
{
|
|
||||||
skip("Failed to create device for feature level %#x.\n", d3d11_feature_levels[i]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_IUnknown, (void **)&iface);
|
|
||||||
ok(SUCCEEDED(hr), "Device should implement IUnknown interface, hr %#x.\n", hr);
|
|
||||||
IUnknown_Release(iface);
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIObject, (void **)&iface);
|
|
||||||
ok(SUCCEEDED(hr), "Device should implement IDXGIObject interface, hr %#x.\n", hr);
|
|
||||||
IUnknown_Release(iface);
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device);
|
|
||||||
ok(SUCCEEDED(hr), "Device should implement IDXGIDevice.\n");
|
|
||||||
hr = IDXGIDevice_GetParent(dxgi_device, &IID_IDXGIAdapter, (void **)&dxgi_adapter);
|
|
||||||
ok(SUCCEEDED(hr), "Device parent should implement IDXGIAdapter.\n");
|
|
||||||
hr = IDXGIAdapter_GetParent(dxgi_adapter, &IID_IDXGIFactory, (void **)&iface);
|
|
||||||
ok(SUCCEEDED(hr), "Adapter parent should implement IDXGIFactory.\n");
|
|
||||||
IUnknown_Release(iface);
|
|
||||||
IDXGIAdapter_Release(dxgi_adapter);
|
|
||||||
hr = IDXGIDevice_GetParent(dxgi_device, &IID_IDXGIAdapter1, (void **)&dxgi_adapter);
|
|
||||||
ok(SUCCEEDED(hr), "Device parent should implement IDXGIAdapter1.\n");
|
|
||||||
hr = IDXGIAdapter_GetParent(dxgi_adapter, &IID_IDXGIFactory1, (void **)&iface);
|
|
||||||
ok(SUCCEEDED(hr), "Adapter parent should implement IDXGIFactory1.\n");
|
|
||||||
IUnknown_Release(iface);
|
|
||||||
IDXGIAdapter_Release(dxgi_adapter);
|
|
||||||
IDXGIDevice_Release(dxgi_device);
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice1, (void **)&iface);
|
|
||||||
ok(SUCCEEDED(hr), "Device should implement IDXGIDevice1.\n");
|
|
||||||
IUnknown_Release(iface);
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_ID3D10Multithread, (void **)&iface);
|
|
||||||
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
|
||||||
"Device should implement ID3D10Multithread interface, hr %#x.\n", hr);
|
|
||||||
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_ID3D10Device, (void **)&iface);
|
|
||||||
todo_wine ok(hr == E_NOINTERFACE, "Device should not implement ID3D10Device interface, hr %#x.\n", hr);
|
|
||||||
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_ID3D11InfoQueue, (void **)&iface);
|
|
||||||
ok(hr == E_NOINTERFACE, "Found ID3D11InfoQueue interface in non-debug mode, hr %#x.\n", hr);
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_ID3D10Device1, (void **)&iface);
|
|
||||||
todo_wine ok(hr == E_NOINTERFACE, "Device should not implement ID3D10Device1 interface, hr %#x.\n", hr);
|
|
||||||
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
|
||||||
|
|
||||||
refcount = ID3D11Device_Release(device);
|
|
||||||
ok(!refcount, "Device has %u references left.\n", refcount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < sizeof(d3d11_feature_levels) / sizeof(*d3d11_feature_levels); ++i)
|
hr = ID3D11Device_QueryInterface(device, &IID_IUnknown, (void **)&iface);
|
||||||
|
ok(SUCCEEDED(hr), "Device should implement IUnknown interface, hr %#x.\n", hr);
|
||||||
|
IUnknown_Release(iface);
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIObject, (void **)&iface);
|
||||||
|
ok(SUCCEEDED(hr), "Device should implement IDXGIObject interface, hr %#x.\n", hr);
|
||||||
|
IUnknown_Release(iface);
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device);
|
||||||
|
ok(SUCCEEDED(hr), "Device should implement IDXGIDevice.\n");
|
||||||
|
hr = IDXGIDevice_GetParent(dxgi_device, &IID_IDXGIAdapter, (void **)&dxgi_adapter);
|
||||||
|
ok(SUCCEEDED(hr), "Device parent should implement IDXGIAdapter.\n");
|
||||||
|
hr = IDXGIAdapter_GetParent(dxgi_adapter, &IID_IDXGIFactory, (void **)&iface);
|
||||||
|
ok(SUCCEEDED(hr), "Adapter parent should implement IDXGIFactory.\n");
|
||||||
|
IUnknown_Release(iface);
|
||||||
|
IDXGIAdapter_Release(dxgi_adapter);
|
||||||
|
hr = IDXGIDevice_GetParent(dxgi_device, &IID_IDXGIAdapter1, (void **)&dxgi_adapter);
|
||||||
|
ok(SUCCEEDED(hr), "Device parent should implement IDXGIAdapter1.\n");
|
||||||
|
hr = IDXGIAdapter_GetParent(dxgi_adapter, &IID_IDXGIFactory1, (void **)&iface);
|
||||||
|
ok(SUCCEEDED(hr), "Adapter parent should implement IDXGIFactory1.\n");
|
||||||
|
IUnknown_Release(iface);
|
||||||
|
IDXGIAdapter_Release(dxgi_adapter);
|
||||||
|
IDXGIDevice_Release(dxgi_device);
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice1, (void **)&iface);
|
||||||
|
ok(SUCCEEDED(hr), "Device should implement IDXGIDevice1.\n");
|
||||||
|
IUnknown_Release(iface);
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_ID3D10Multithread, (void **)&iface);
|
||||||
|
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
||||||
|
"Device should implement ID3D10Multithread interface, hr %#x.\n", hr);
|
||||||
|
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_ID3D10Device, (void **)&iface);
|
||||||
|
todo_wine ok(hr == E_NOINTERFACE, "Device should not implement ID3D10Device interface, hr %#x.\n", hr);
|
||||||
|
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_ID3D11InfoQueue, (void **)&iface);
|
||||||
|
ok(hr == E_NOINTERFACE, "Found ID3D11InfoQueue interface in non-debug mode, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_ID3D10Device1, (void **)&iface);
|
||||||
|
todo_wine ok(hr == E_NOINTERFACE, "Device should not implement ID3D10Device1 interface, hr %#x.\n", hr);
|
||||||
|
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
||||||
|
|
||||||
|
refcount = ID3D11Device_Release(device);
|
||||||
|
ok(!refcount, "Device has %u references left.\n", refcount);
|
||||||
|
|
||||||
|
device_desc.feature_level = &feature_level;
|
||||||
|
device_desc.flags = D3D11_CREATE_DEVICE_DEBUG;
|
||||||
|
if (!(device = create_device(&device_desc)))
|
||||||
{
|
{
|
||||||
struct device_desc device_desc;
|
skip("Failed to create debug device for feature level %#x.\n", feature_level);
|
||||||
|
return;
|
||||||
device_desc.feature_level = &d3d11_feature_levels[i];
|
|
||||||
device_desc.flags = D3D11_CREATE_DEVICE_DEBUG;
|
|
||||||
if (!(device = create_device(&device_desc)))
|
|
||||||
{
|
|
||||||
skip("Failed to create debug device for feature level %#x.\n", d3d11_feature_levels[i]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_ID3D11InfoQueue, (void **)&iface);
|
|
||||||
todo_wine ok(hr == S_OK, "Device should implement ID3D11InfoQueue interface, hr %#x.\n", hr);
|
|
||||||
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
|
||||||
|
|
||||||
refcount = ID3D11Device_Release(device);
|
|
||||||
ok(!refcount, "Device has %u references left.\n", refcount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hr = ID3D11Device_QueryInterface(device, &IID_ID3D11InfoQueue, (void **)&iface);
|
||||||
|
todo_wine ok(hr == S_OK, "Device should implement ID3D11InfoQueue interface, hr %#x.\n", hr);
|
||||||
|
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
||||||
|
|
||||||
|
refcount = ID3D11Device_Release(device);
|
||||||
|
ok(!refcount, "Device has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_get_immediate_context(void)
|
static void test_get_immediate_context(void)
|
||||||
|
@ -3491,7 +3470,7 @@ static void test_create_shader_resource_view(void)
|
||||||
ok(!refcount, "Device has %u references left.\n", refcount);
|
ok(!refcount, "Device has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_create_shader(void)
|
static void test_create_shader(const D3D_FEATURE_LEVEL feature_level)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
float4 light;
|
float4 light;
|
||||||
|
@ -3737,198 +3716,190 @@ static void test_create_shader(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
ULONG refcount, expected_refcount;
|
ULONG refcount, expected_refcount;
|
||||||
|
struct device_desc device_desc;
|
||||||
ID3D11Device *device, *tmp;
|
ID3D11Device *device, *tmp;
|
||||||
ID3D11GeometryShader *gs;
|
ID3D11GeometryShader *gs;
|
||||||
ID3D11VertexShader *vs;
|
ID3D11VertexShader *vs;
|
||||||
ID3D11PixelShader *ps;
|
ID3D11PixelShader *ps;
|
||||||
IUnknown *iface;
|
IUnknown *iface;
|
||||||
unsigned int i;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
for (i = 0; i < sizeof(d3d11_feature_levels) / sizeof(*d3d11_feature_levels); ++i)
|
device_desc.feature_level = &feature_level;
|
||||||
|
device_desc.flags = 0;
|
||||||
|
if (!(device = create_device(&device_desc)))
|
||||||
{
|
{
|
||||||
D3D_FEATURE_LEVEL feature_level = d3d11_feature_levels[i];
|
skip("Failed to create device for feature level %#x.\n", feature_level);
|
||||||
struct device_desc device_desc;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
device_desc.feature_level = &feature_level;
|
/* level_9 shaders */
|
||||||
device_desc.flags = 0;
|
hr = ID3D11Device_CreatePixelShader(device, ps_4_0_level_9_0, sizeof(ps_4_0_level_9_0), NULL, &ps);
|
||||||
if (!(device = create_device(&device_desc)))
|
ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_0 shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
{
|
ID3D11PixelShader_Release(ps);
|
||||||
skip("Failed to create device for feature level %#x.\n", feature_level);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* level_9 shaders */
|
hr = ID3D11Device_CreatePixelShader(device, ps_4_0_level_9_1, sizeof(ps_4_0_level_9_1), NULL, &ps);
|
||||||
hr = ID3D11Device_CreatePixelShader(device, ps_4_0_level_9_0, sizeof(ps_4_0_level_9_0), NULL, &ps);
|
ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_1 shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_0 shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ID3D11PixelShader_Release(ps);
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
ID3D11PixelShader_Release(ps);
|
|
||||||
|
|
||||||
hr = ID3D11Device_CreatePixelShader(device, ps_4_0_level_9_1, sizeof(ps_4_0_level_9_1), NULL, &ps);
|
hr = ID3D11Device_CreatePixelShader(device, ps_4_0_level_9_3, sizeof(ps_4_0_level_9_3), NULL, &ps);
|
||||||
ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_1 shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_3 shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
if (SUCCEEDED(hr))
|
ID3D11PixelShader_Release(ps);
|
||||||
ID3D11PixelShader_Release(ps);
|
|
||||||
|
|
||||||
hr = ID3D11Device_CreatePixelShader(device, ps_4_0_level_9_3, sizeof(ps_4_0_level_9_3), NULL, &ps);
|
/* vertex shader */
|
||||||
ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_3 shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
hr = ID3D11Device_CreateVertexShader(device, vs_2_0, sizeof(vs_2_0), NULL, &vs);
|
||||||
if (SUCCEEDED(hr))
|
ok(hr == E_INVALIDARG, "Created a SM2 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
ID3D11PixelShader_Release(ps);
|
|
||||||
|
|
||||||
/* vertex shader */
|
hr = ID3D11Device_CreateVertexShader(device, vs_3_0, sizeof(vs_3_0), NULL, &vs);
|
||||||
hr = ID3D11Device_CreateVertexShader(device, vs_2_0, sizeof(vs_2_0), NULL, &vs);
|
ok(hr == E_INVALIDARG, "Created a SM3 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
ok(hr == E_INVALIDARG, "Created a SM2 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
|
||||||
|
|
||||||
hr = ID3D11Device_CreateVertexShader(device, vs_3_0, sizeof(vs_3_0), NULL, &vs);
|
hr = ID3D11Device_CreateVertexShader(device, ps_4_0, sizeof(ps_4_0), NULL, &vs);
|
||||||
ok(hr == E_INVALIDARG, "Created a SM3 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(hr == E_INVALIDARG, "Created a SM4 vertex shader from a pixel shader source, hr %#x, feature level %#x.\n",
|
||||||
|
hr, feature_level);
|
||||||
|
|
||||||
hr = ID3D11Device_CreateVertexShader(device, ps_4_0, sizeof(ps_4_0), NULL, &vs);
|
expected_refcount = get_refcount((IUnknown *)device) + (feature_level >= D3D_FEATURE_LEVEL_10_0);
|
||||||
ok(hr == E_INVALIDARG, "Created a SM4 vertex shader from a pixel shader source, hr %#x, feature level %#x.\n",
|
hr = ID3D11Device_CreateVertexShader(device, vs_4_0, sizeof(vs_4_0), NULL, &vs);
|
||||||
|
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
|
ok(SUCCEEDED(hr), "Failed to create SM4 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
|
else
|
||||||
|
ok(hr == E_INVALIDARG, "Created a SM4 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
|
|
||||||
|
refcount = get_refcount((IUnknown *)device);
|
||||||
|
ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n",
|
||||||
|
refcount, expected_refcount);
|
||||||
|
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
|
{
|
||||||
|
tmp = NULL;
|
||||||
|
expected_refcount = refcount + 1;
|
||||||
|
ID3D11VertexShader_GetDevice(vs, &tmp);
|
||||||
|
ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device);
|
||||||
|
refcount = get_refcount((IUnknown *)device);
|
||||||
|
ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n",
|
||||||
|
refcount, expected_refcount);
|
||||||
|
ID3D11Device_Release(tmp);
|
||||||
|
|
||||||
|
hr = ID3D11VertexShader_QueryInterface(vs, &IID_ID3D10VertexShader, (void **)&iface);
|
||||||
|
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
||||||
|
"Vertex shader should implement ID3D10VertexShader.\n");
|
||||||
|
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
||||||
|
|
||||||
|
refcount = ID3D11VertexShader_Release(vs);
|
||||||
|
ok(!refcount, "Vertex shader has %u references left.\n", refcount);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = ID3D11Device_CreateVertexShader(device, vs_4_1, sizeof(vs_4_1), NULL, &vs);
|
||||||
|
if (feature_level >= D3D_FEATURE_LEVEL_10_1)
|
||||||
|
{
|
||||||
|
ok(SUCCEEDED(hr), "Failed to create SM4.1 vertex shader, hr %#x, feature level %#x.\n",
|
||||||
hr, feature_level);
|
hr, feature_level);
|
||||||
|
refcount = ID3D11VertexShader_Release(vs);
|
||||||
expected_refcount = get_refcount((IUnknown *)device) + (feature_level >= D3D_FEATURE_LEVEL_10_0);
|
ok(!refcount, "Vertex shader has %u references left.\n", refcount);
|
||||||
hr = ID3D11Device_CreateVertexShader(device, vs_4_0, sizeof(vs_4_0), NULL, &vs);
|
}
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
else
|
||||||
ok(SUCCEEDED(hr), "Failed to create SM4 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
{
|
||||||
else
|
todo_wine_if(feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
ok(hr == E_INVALIDARG, "Created a SM4 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(hr == E_INVALIDARG, "Created a SM4.1 vertex shader, hr %#x, feature level %#x.\n",
|
||||||
|
|
||||||
refcount = get_refcount((IUnknown *)device);
|
|
||||||
ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n",
|
|
||||||
refcount, expected_refcount);
|
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
|
||||||
{
|
|
||||||
tmp = NULL;
|
|
||||||
expected_refcount = refcount + 1;
|
|
||||||
ID3D11VertexShader_GetDevice(vs, &tmp);
|
|
||||||
ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device);
|
|
||||||
refcount = get_refcount((IUnknown *)device);
|
|
||||||
ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n",
|
|
||||||
refcount, expected_refcount);
|
|
||||||
ID3D11Device_Release(tmp);
|
|
||||||
|
|
||||||
hr = ID3D11VertexShader_QueryInterface(vs, &IID_ID3D10VertexShader, (void **)&iface);
|
|
||||||
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
|
||||||
"Vertex shader should implement ID3D10VertexShader.\n");
|
|
||||||
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
|
||||||
|
|
||||||
refcount = ID3D11VertexShader_Release(vs);
|
|
||||||
ok(!refcount, "Vertex shader has %u references left.\n", refcount);
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = ID3D11Device_CreateVertexShader(device, vs_4_1, sizeof(vs_4_1), NULL, &vs);
|
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_1)
|
|
||||||
{
|
|
||||||
ok(SUCCEEDED(hr), "Failed to create SM4.1 vertex shader, hr %#x, feature level %#x.\n",
|
|
||||||
hr, feature_level);
|
hr, feature_level);
|
||||||
refcount = ID3D11VertexShader_Release(vs);
|
if (SUCCEEDED(hr))
|
||||||
ok(!refcount, "Vertex shader has %u references left.\n", refcount);
|
ID3D11VertexShader_Release(vs);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
todo_wine_if(feature_level >= D3D_FEATURE_LEVEL_10_0)
|
|
||||||
ok(hr == E_INVALIDARG, "Created a SM4.1 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
ID3D11VertexShader_Release(vs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* pixel shader */
|
/* pixel shader */
|
||||||
expected_refcount = get_refcount((IUnknown *)device) + (feature_level >= D3D_FEATURE_LEVEL_10_0);
|
expected_refcount = get_refcount((IUnknown *)device) + (feature_level >= D3D_FEATURE_LEVEL_10_0);
|
||||||
hr = ID3D11Device_CreatePixelShader(device, ps_4_0, sizeof(ps_4_0), NULL, &ps);
|
hr = ID3D11Device_CreatePixelShader(device, ps_4_0, sizeof(ps_4_0), NULL, &ps);
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
ok(SUCCEEDED(hr), "Failed to create SM4 pixel shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(SUCCEEDED(hr), "Failed to create SM4 pixel shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
else
|
else
|
||||||
ok(hr == E_INVALIDARG, "Created a SM4 pixel shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(hr == E_INVALIDARG, "Created a SM4 pixel shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
|
|
||||||
|
refcount = get_refcount((IUnknown *)device);
|
||||||
|
ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n",
|
||||||
|
refcount, expected_refcount);
|
||||||
|
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
|
{
|
||||||
|
tmp = NULL;
|
||||||
|
expected_refcount = refcount + 1;
|
||||||
|
ID3D11PixelShader_GetDevice(ps, &tmp);
|
||||||
|
ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device);
|
||||||
refcount = get_refcount((IUnknown *)device);
|
refcount = get_refcount((IUnknown *)device);
|
||||||
ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n",
|
ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n",
|
||||||
refcount, expected_refcount);
|
refcount, expected_refcount);
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
ID3D11Device_Release(tmp);
|
||||||
{
|
|
||||||
tmp = NULL;
|
|
||||||
expected_refcount = refcount + 1;
|
|
||||||
ID3D11PixelShader_GetDevice(ps, &tmp);
|
|
||||||
ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device);
|
|
||||||
refcount = get_refcount((IUnknown *)device);
|
|
||||||
ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n",
|
|
||||||
refcount, expected_refcount);
|
|
||||||
ID3D11Device_Release(tmp);
|
|
||||||
|
|
||||||
hr = ID3D11PixelShader_QueryInterface(ps, &IID_ID3D10PixelShader, (void **)&iface);
|
hr = ID3D11PixelShader_QueryInterface(ps, &IID_ID3D10PixelShader, (void **)&iface);
|
||||||
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
||||||
"Pixel shader should implement ID3D10PixelShader.\n");
|
"Pixel shader should implement ID3D10PixelShader.\n");
|
||||||
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
||||||
|
|
||||||
refcount = ID3D11PixelShader_Release(ps);
|
refcount = ID3D11PixelShader_Release(ps);
|
||||||
ok(!refcount, "Pixel shader has %u references left.\n", refcount);
|
ok(!refcount, "Pixel shader has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = ID3D11Device_CreatePixelShader(device, ps_4_1, sizeof(ps_4_1), NULL, &ps);
|
hr = ID3D11Device_CreatePixelShader(device, ps_4_1, sizeof(ps_4_1), NULL, &ps);
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_1)
|
if (feature_level >= D3D_FEATURE_LEVEL_10_1)
|
||||||
{
|
{
|
||||||
ok(SUCCEEDED(hr), "Failed to create SM4.1 pixel shader, hr %#x, feature level %#x.\n",
|
ok(SUCCEEDED(hr), "Failed to create SM4.1 pixel shader, hr %#x, feature level %#x.\n",
|
||||||
hr, feature_level);
|
hr, feature_level);
|
||||||
refcount = ID3D11PixelShader_Release(ps);
|
refcount = ID3D11PixelShader_Release(ps);
|
||||||
ok(!refcount, "Pixel shader has %u references left.\n", refcount);
|
ok(!refcount, "Pixel shader has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
todo_wine_if(feature_level >= D3D_FEATURE_LEVEL_10_0)
|
todo_wine_if(feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
ok(hr == E_INVALIDARG, "Created a SM4.1 pixel shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(hr == E_INVALIDARG, "Created a SM4.1 pixel shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
ID3D11PixelShader_Release(ps);
|
ID3D11PixelShader_Release(ps);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* geometry shader */
|
/* geometry shader */
|
||||||
expected_refcount = get_refcount((IUnknown *)device) + (feature_level >= D3D_FEATURE_LEVEL_10_0);
|
expected_refcount = get_refcount((IUnknown *)device) + (feature_level >= D3D_FEATURE_LEVEL_10_0);
|
||||||
hr = ID3D11Device_CreateGeometryShader(device, gs_4_0, sizeof(gs_4_0), NULL, &gs);
|
hr = ID3D11Device_CreateGeometryShader(device, gs_4_0, sizeof(gs_4_0), NULL, &gs);
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
ok(SUCCEEDED(hr), "Failed to create SM4 geometry shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(SUCCEEDED(hr), "Failed to create SM4 geometry shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
else
|
else
|
||||||
ok(hr == E_INVALIDARG, "Created a SM4 geometry shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
ok(hr == E_INVALIDARG, "Created a SM4 geometry shader, hr %#x, feature level %#x.\n", hr, feature_level);
|
||||||
|
|
||||||
|
refcount = get_refcount((IUnknown *)device);
|
||||||
|
ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n",
|
||||||
|
refcount, expected_refcount);
|
||||||
|
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
|
{
|
||||||
|
tmp = NULL;
|
||||||
|
expected_refcount = refcount + 1;
|
||||||
|
ID3D11GeometryShader_GetDevice(gs, &tmp);
|
||||||
|
ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device);
|
||||||
refcount = get_refcount((IUnknown *)device);
|
refcount = get_refcount((IUnknown *)device);
|
||||||
ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n",
|
ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n",
|
||||||
refcount, expected_refcount);
|
refcount, expected_refcount);
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
|
ID3D11Device_Release(tmp);
|
||||||
{
|
|
||||||
tmp = NULL;
|
|
||||||
expected_refcount = refcount + 1;
|
|
||||||
ID3D11GeometryShader_GetDevice(gs, &tmp);
|
|
||||||
ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device);
|
|
||||||
refcount = get_refcount((IUnknown *)device);
|
|
||||||
ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n",
|
|
||||||
refcount, expected_refcount);
|
|
||||||
ID3D11Device_Release(tmp);
|
|
||||||
|
|
||||||
hr = ID3D11GeometryShader_QueryInterface(gs, &IID_ID3D10GeometryShader, (void **)&iface);
|
hr = ID3D11GeometryShader_QueryInterface(gs, &IID_ID3D10GeometryShader, (void **)&iface);
|
||||||
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
|
||||||
"Geometry shader should implement ID3D10GeometryShader.\n");
|
"Geometry shader should implement ID3D10GeometryShader.\n");
|
||||||
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
if (SUCCEEDED(hr)) IUnknown_Release(iface);
|
||||||
|
|
||||||
refcount = ID3D11GeometryShader_Release(gs);
|
refcount = ID3D11GeometryShader_Release(gs);
|
||||||
ok(!refcount, "Geometry shader has %u references left.\n", refcount);
|
ok(!refcount, "Geometry shader has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = ID3D11Device_CreateGeometryShader(device, gs_4_1, sizeof(gs_4_1), NULL, &gs);
|
hr = ID3D11Device_CreateGeometryShader(device, gs_4_1, sizeof(gs_4_1), NULL, &gs);
|
||||||
if (feature_level >= D3D_FEATURE_LEVEL_10_1)
|
if (feature_level >= D3D_FEATURE_LEVEL_10_1)
|
||||||
{
|
{
|
||||||
ok(SUCCEEDED(hr), "Failed to create SM4.1 geometry shader, hr %#x, feature level %#x.\n",
|
ok(SUCCEEDED(hr), "Failed to create SM4.1 geometry shader, hr %#x, feature level %#x.\n",
|
||||||
hr, feature_level);
|
hr, feature_level);
|
||||||
refcount = ID3D11GeometryShader_Release(gs);
|
refcount = ID3D11GeometryShader_Release(gs);
|
||||||
ok(!refcount, "Geometry shader has %u references left.\n", refcount);
|
ok(!refcount, "Geometry shader has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
todo_wine_if(feature_level >= D3D_FEATURE_LEVEL_10_0)
|
todo_wine_if(feature_level >= D3D_FEATURE_LEVEL_10_0)
|
||||||
ok(hr == E_INVALIDARG, "Created a SM4.1 geometry shader, hr %#x, feature level %#x.\n",
|
ok(hr == E_INVALIDARG, "Created a SM4.1 geometry shader, hr %#x, feature level %#x.\n",
|
||||||
hr, feature_level);
|
hr, feature_level);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
ID3D11GeometryShader_Release(gs);
|
ID3D11GeometryShader_Release(gs);
|
||||||
}
|
|
||||||
|
|
||||||
refcount = ID3D11Device_Release(device);
|
|
||||||
ok(!refcount, "Device has %u references left.\n", refcount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
refcount = ID3D11Device_Release(device);
|
||||||
|
ok(!refcount, "Device has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_create_sampler_state(void)
|
static void test_create_sampler_state(void)
|
||||||
|
@ -7565,16 +7536,17 @@ done:
|
||||||
ok(!refcount, "Device has %u references left.\n", refcount);
|
ok(!refcount, "Device has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_swapchain_formats(void)
|
static void test_swapchain_formats(const D3D_FEATURE_LEVEL feature_level)
|
||||||
{
|
{
|
||||||
DXGI_SWAP_CHAIN_DESC swapchain_desc;
|
DXGI_SWAP_CHAIN_DESC swapchain_desc;
|
||||||
|
struct device_desc device_desc;
|
||||||
IDXGISwapChain *swapchain;
|
IDXGISwapChain *swapchain;
|
||||||
IDXGIDevice *dxgi_device;
|
IDXGIDevice *dxgi_device;
|
||||||
HRESULT hr, expected_hr;
|
HRESULT hr, expected_hr;
|
||||||
IDXGIAdapter *adapter;
|
IDXGIAdapter *adapter;
|
||||||
IDXGIFactory *factory;
|
IDXGIFactory *factory;
|
||||||
ID3D11Device *device;
|
ID3D11Device *device;
|
||||||
unsigned int i, j;
|
unsigned int i;
|
||||||
ULONG refcount;
|
ULONG refcount;
|
||||||
|
|
||||||
swapchain_desc.BufferDesc.Width = 800;
|
swapchain_desc.BufferDesc.Width = 800;
|
||||||
|
@ -7592,76 +7564,69 @@ static void test_swapchain_formats(void)
|
||||||
swapchain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
swapchain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
||||||
swapchain_desc.Flags = 0;
|
swapchain_desc.Flags = 0;
|
||||||
|
|
||||||
for (i = 0; i < sizeof(d3d11_feature_levels) / sizeof(*d3d11_feature_levels); ++i)
|
device_desc.feature_level = &feature_level;
|
||||||
|
device_desc.flags = 0;
|
||||||
|
if (!(device = create_device(&device_desc)))
|
||||||
{
|
{
|
||||||
const D3D_FEATURE_LEVEL feature_level = d3d11_feature_levels[i];
|
skip("Failed to create device for feature level %#x.\n", feature_level);
|
||||||
struct device_desc device_desc;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
device_desc.feature_level = &feature_level;
|
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device);
|
||||||
device_desc.flags = 0;
|
ok(SUCCEEDED(hr), "Failed to query IDXGIDevice, hr %#x.\n", hr);
|
||||||
if (!(device = create_device(&device_desc)))
|
hr = IDXGIDevice_GetAdapter(dxgi_device, &adapter);
|
||||||
|
ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr);
|
||||||
|
IDXGIDevice_Release(dxgi_device);
|
||||||
|
hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory);
|
||||||
|
ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr);
|
||||||
|
IDXGIAdapter_Release(adapter);
|
||||||
|
|
||||||
|
swapchain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_TYPELESS;
|
||||||
|
hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
|
||||||
|
todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x for typeless format (feature level %#x).\n",
|
||||||
|
hr, feature_level);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
IDXGISwapChain_Release(swapchain);
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(display_format_support) / sizeof(*display_format_support); ++i)
|
||||||
|
{
|
||||||
|
DXGI_FORMAT format = display_format_support[i].format;
|
||||||
|
BOOL todo = FALSE;
|
||||||
|
|
||||||
|
if (display_format_support[i].fl_required <= feature_level)
|
||||||
|
{
|
||||||
|
expected_hr = S_OK;
|
||||||
|
if (format == DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM)
|
||||||
|
todo = TRUE;
|
||||||
|
}
|
||||||
|
else if (!display_format_support[i].fl_optional
|
||||||
|
|| display_format_support[i].fl_optional > feature_level)
|
||||||
|
{
|
||||||
|
expected_hr = E_INVALIDARG;
|
||||||
|
if (format != DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM)
|
||||||
|
todo = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
skip("Failed to create device for feature level %#x.\n", feature_level);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device);
|
swapchain_desc.BufferDesc.Format = format;
|
||||||
ok(SUCCEEDED(hr), "Failed to query IDXGIDevice, hr %#x.\n", hr);
|
|
||||||
hr = IDXGIDevice_GetAdapter(dxgi_device, &adapter);
|
|
||||||
ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr);
|
|
||||||
IDXGIDevice_Release(dxgi_device);
|
|
||||||
hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory);
|
|
||||||
ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr);
|
|
||||||
IDXGIAdapter_Release(adapter);
|
|
||||||
|
|
||||||
swapchain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_TYPELESS;
|
|
||||||
hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
|
hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
|
||||||
todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x for typeless format (feature level %#x).\n",
|
todo_wine_if(todo)
|
||||||
hr, d3d11_feature_levels[i]);
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
IDXGISwapChain_Release(swapchain);
|
|
||||||
|
|
||||||
for (j = 0; j < sizeof(display_format_support) / sizeof(*display_format_support); ++j)
|
|
||||||
{
|
|
||||||
DXGI_FORMAT format = display_format_support[j].format;
|
|
||||||
BOOL todo = FALSE;
|
|
||||||
|
|
||||||
if (display_format_support[j].fl_required <= feature_level)
|
|
||||||
{
|
|
||||||
expected_hr = S_OK;
|
|
||||||
if (format == DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM)
|
|
||||||
todo = TRUE;
|
|
||||||
}
|
|
||||||
else if (!display_format_support[j].fl_optional
|
|
||||||
|| display_format_support[j].fl_optional > feature_level)
|
|
||||||
{
|
|
||||||
expected_hr = E_INVALIDARG;
|
|
||||||
if (format != DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM)
|
|
||||||
todo = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
swapchain_desc.BufferDesc.Format = format;
|
|
||||||
hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
|
|
||||||
todo_wine_if(todo)
|
|
||||||
ok(hr == expected_hr || broken(hr == E_OUTOFMEMORY),
|
ok(hr == expected_hr || broken(hr == E_OUTOFMEMORY),
|
||||||
"Got hr %#x, expected %#x (feature level %#x, format %#x).\n",
|
"Got hr %#x, expected %#x (feature level %#x, format %#x).\n",
|
||||||
hr, expected_hr, feature_level, format);
|
hr, expected_hr, feature_level, format);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
continue;
|
continue;
|
||||||
refcount = IDXGISwapChain_Release(swapchain);
|
refcount = IDXGISwapChain_Release(swapchain);
|
||||||
ok(!refcount, "Swapchain has %u references left.\n", refcount);
|
ok(!refcount, "Swapchain has %u references left.\n", refcount);
|
||||||
}
|
|
||||||
|
|
||||||
refcount = ID3D11Device_Release(device);
|
|
||||||
ok(!refcount, "Device has %u references left.\n", refcount);
|
|
||||||
refcount = IDXGIFactory_Release(factory);
|
|
||||||
ok(!refcount, "Factory has %u references left.\n", refcount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
refcount = ID3D11Device_Release(device);
|
||||||
|
ok(!refcount, "Device has %u references left.\n", refcount);
|
||||||
|
refcount = IDXGIFactory_Release(factory);
|
||||||
|
ok(!refcount, "Factory has %u references left.\n", refcount);
|
||||||
DestroyWindow(swapchain_desc.OutputWindow);
|
DestroyWindow(swapchain_desc.OutputWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10651,12 +10616,12 @@ static void check_format_support(const unsigned int *format_support, D3D_FEATURE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_required_format_support(void)
|
static void test_required_format_support(const D3D_FEATURE_LEVEL feature_level)
|
||||||
{
|
{
|
||||||
unsigned int format_support[DXGI_FORMAT_B4G4R4A4_UNORM + 1];
|
unsigned int format_support[DXGI_FORMAT_B4G4R4A4_UNORM + 1];
|
||||||
|
struct device_desc device_desc;
|
||||||
ID3D11Device *device;
|
ID3D11Device *device;
|
||||||
DXGI_FORMAT format;
|
DXGI_FORMAT format;
|
||||||
unsigned int i;
|
|
||||||
ULONG refcount;
|
ULONG refcount;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
@ -10666,62 +10631,49 @@ static void test_required_format_support(void)
|
||||||
{DXGI_FORMAT_R16_UINT, D3D_FEATURE_LEVEL_9_1},
|
{DXGI_FORMAT_R16_UINT, D3D_FEATURE_LEVEL_9_1},
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0; i < sizeof(d3d11_feature_levels) / sizeof(*d3d11_feature_levels); ++i)
|
device_desc.feature_level = &feature_level;
|
||||||
|
device_desc.flags = 0;
|
||||||
|
if (!(device = create_device(&device_desc)))
|
||||||
{
|
{
|
||||||
D3D_FEATURE_LEVEL feature_level = d3d11_feature_levels[i];
|
skip("Failed to create device for feature level %#x.\n", feature_level);
|
||||||
struct device_desc device_desc;
|
return;
|
||||||
|
|
||||||
device_desc.feature_level = &feature_level;
|
|
||||||
device_desc.flags = 0;
|
|
||||||
if (!(device = create_device(&device_desc)))
|
|
||||||
{
|
|
||||||
skip("Failed to create device for feature level %#x.\n", feature_level);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(format_support, 0, sizeof(format_support));
|
|
||||||
for (format = DXGI_FORMAT_UNKNOWN; format <= DXGI_FORMAT_B4G4R4A4_UNORM; ++format)
|
|
||||||
{
|
|
||||||
hr = ID3D11Device_CheckFormatSupport(device, format, &format_support[format]);
|
|
||||||
todo_wine ok(hr == S_OK || (hr == E_FAIL && !format_support[format]),
|
|
||||||
"Got unexpected result for format %#x: hr %#x, format_support %#x.\n",
|
|
||||||
format, hr, format_support[format]);
|
|
||||||
}
|
|
||||||
if (hr == E_NOTIMPL)
|
|
||||||
{
|
|
||||||
skip("CheckFormatSupport not implemented.\n");
|
|
||||||
ID3D11Device_Release(device);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
check_format_support(format_support, feature_level,
|
|
||||||
index_buffers, sizeof(index_buffers) / sizeof(*index_buffers),
|
|
||||||
D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER, "index buffer");
|
|
||||||
|
|
||||||
check_format_support(format_support, feature_level,
|
|
||||||
display_format_support, sizeof(display_format_support) / sizeof(*display_format_support),
|
|
||||||
D3D11_FORMAT_SUPPORT_DISPLAY, "display");
|
|
||||||
|
|
||||||
refcount = ID3D11Device_Release(device);
|
|
||||||
ok(!refcount, "Device has %u references left.\n", refcount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(format_support, 0, sizeof(format_support));
|
||||||
|
for (format = DXGI_FORMAT_UNKNOWN; format <= DXGI_FORMAT_B4G4R4A4_UNORM; ++format)
|
||||||
|
{
|
||||||
|
hr = ID3D11Device_CheckFormatSupport(device, format, &format_support[format]);
|
||||||
|
todo_wine ok(hr == S_OK || (hr == E_FAIL && !format_support[format]),
|
||||||
|
"Got unexpected result for format %#x: hr %#x, format_support %#x.\n",
|
||||||
|
format, hr, format_support[format]);
|
||||||
|
}
|
||||||
|
if (hr == E_NOTIMPL)
|
||||||
|
{
|
||||||
|
skip("CheckFormatSupport not implemented.\n");
|
||||||
|
ID3D11Device_Release(device);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
check_format_support(format_support, feature_level,
|
||||||
|
index_buffers, sizeof(index_buffers) / sizeof(*index_buffers),
|
||||||
|
D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER, "index buffer");
|
||||||
|
|
||||||
|
check_format_support(format_support, feature_level,
|
||||||
|
display_format_support, sizeof(display_format_support) / sizeof(*display_format_support),
|
||||||
|
D3D11_FORMAT_SUPPORT_DISPLAY, "display");
|
||||||
|
|
||||||
|
refcount = ID3D11Device_Release(device);
|
||||||
|
ok(!refcount, "Device has %u references left.\n", refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_fl9_draw(void)
|
static void test_fl9_draw(const D3D_FEATURE_LEVEL feature_level)
|
||||||
{
|
{
|
||||||
struct d3d11_test_context test_context;
|
struct d3d11_test_context test_context;
|
||||||
ID3D11DeviceContext *context;
|
ID3D11DeviceContext *context;
|
||||||
ID3D11PixelShader *ps;
|
ID3D11PixelShader *ps;
|
||||||
ID3D11Device *device;
|
ID3D11Device *device;
|
||||||
unsigned int i;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
static const D3D_FEATURE_LEVEL feature_levels[] =
|
|
||||||
{
|
|
||||||
D3D_FEATURE_LEVEL_9_3,
|
|
||||||
D3D_FEATURE_LEVEL_9_2,
|
|
||||||
D3D_FEATURE_LEVEL_9_1,
|
|
||||||
};
|
|
||||||
static const struct vec4 color = {0.2f, 0.3f, 0.0f, 1.0f};
|
static const struct vec4 color = {0.2f, 0.3f, 0.0f, 1.0f};
|
||||||
static const DWORD ps_code[] =
|
static const DWORD ps_code[] =
|
||||||
{
|
{
|
||||||
|
@ -10745,33 +10697,62 @@ static void test_fl9_draw(void)
|
||||||
0x45475241, 0xabab0054,
|
0x45475241, 0xabab0054,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0; i < sizeof(feature_levels) / sizeof(*feature_levels); ++i)
|
if (!init_test_context(&test_context, &feature_level))
|
||||||
|
return;
|
||||||
|
|
||||||
|
device = test_context.device;
|
||||||
|
context = test_context.immediate_context;
|
||||||
|
|
||||||
|
hr = ID3D11Device_CreatePixelShader(device, ps_code, sizeof(ps_code), NULL, &ps);
|
||||||
|
ok(SUCCEEDED(hr), "Failed to create pixel shader, hr %#x, feature level %#x.\n",
|
||||||
|
hr, feature_level);
|
||||||
|
ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0);
|
||||||
|
draw_quad(&test_context);
|
||||||
|
check_texture_color(test_context.backbuffer, 0x7f0000ff, 1);
|
||||||
|
ID3D11PixelShader_Release(ps);
|
||||||
|
|
||||||
|
draw_color_quad(&test_context, &color);
|
||||||
|
todo_wine check_texture_color(test_context.backbuffer, 0xff004c33, 1);
|
||||||
|
|
||||||
|
release_test_context(&test_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void run_for_each_feature_level(void (*test_func)(const D3D_FEATURE_LEVEL fl))
|
||||||
|
{
|
||||||
|
static const D3D_FEATURE_LEVEL feature_levels[] =
|
||||||
{
|
{
|
||||||
if (!init_test_context(&test_context, &feature_levels[i]))
|
D3D_FEATURE_LEVEL_11_1,
|
||||||
return;
|
D3D_FEATURE_LEVEL_11_0,
|
||||||
|
D3D_FEATURE_LEVEL_10_1,
|
||||||
|
D3D_FEATURE_LEVEL_10_0,
|
||||||
|
D3D_FEATURE_LEVEL_9_3,
|
||||||
|
D3D_FEATURE_LEVEL_9_2,
|
||||||
|
D3D_FEATURE_LEVEL_9_1
|
||||||
|
};
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
device = test_context.device;
|
for (i = 0; i < sizeof(feature_levels) / sizeof(*feature_levels); ++i)
|
||||||
context = test_context.immediate_context;
|
test_func(feature_levels[i]);
|
||||||
|
}
|
||||||
|
|
||||||
hr = ID3D11Device_CreatePixelShader(device, ps_code, sizeof(ps_code), NULL, &ps);
|
static void run_for_each_9_x_feature_level(void (*test_func)(const D3D_FEATURE_LEVEL fl))
|
||||||
ok(SUCCEEDED(hr), "Failed to create pixel shader, hr %#x, feature level %#x.\n",
|
{
|
||||||
hr, feature_levels[i]);
|
static const D3D_FEATURE_LEVEL feature_levels[] =
|
||||||
ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0);
|
{
|
||||||
draw_quad(&test_context);
|
D3D_FEATURE_LEVEL_9_3,
|
||||||
check_texture_color(test_context.backbuffer, 0x7f0000ff, 1);
|
D3D_FEATURE_LEVEL_9_2,
|
||||||
ID3D11PixelShader_Release(ps);
|
D3D_FEATURE_LEVEL_9_1,
|
||||||
|
};
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
draw_color_quad(&test_context, &color);
|
for (i = 0; i < sizeof(feature_levels) / sizeof(*feature_levels); ++i)
|
||||||
todo_wine check_texture_color(test_context.backbuffer, 0xff004c33, 1);
|
test_func(feature_levels[i]);
|
||||||
|
|
||||||
release_test_context(&test_context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
START_TEST(d3d11)
|
START_TEST(d3d11)
|
||||||
{
|
{
|
||||||
test_create_device();
|
test_create_device();
|
||||||
test_device_interfaces();
|
run_for_each_feature_level(test_device_interfaces);
|
||||||
test_get_immediate_context();
|
test_get_immediate_context();
|
||||||
test_create_texture2d();
|
test_create_texture2d();
|
||||||
test_texture2d_interfaces();
|
test_texture2d_interfaces();
|
||||||
|
@ -10782,7 +10763,7 @@ START_TEST(d3d11)
|
||||||
test_depthstencil_view_interfaces();
|
test_depthstencil_view_interfaces();
|
||||||
test_create_rendertarget_view();
|
test_create_rendertarget_view();
|
||||||
test_create_shader_resource_view();
|
test_create_shader_resource_view();
|
||||||
test_create_shader();
|
run_for_each_feature_level(test_create_shader);
|
||||||
test_create_sampler_state();
|
test_create_sampler_state();
|
||||||
test_create_blend_state();
|
test_create_blend_state();
|
||||||
test_create_depthstencil_state();
|
test_create_depthstencil_state();
|
||||||
|
@ -10804,7 +10785,7 @@ START_TEST(d3d11)
|
||||||
test_buffer_data_init();
|
test_buffer_data_init();
|
||||||
test_texture_data_init();
|
test_texture_data_init();
|
||||||
test_check_multisample_quality_levels();
|
test_check_multisample_quality_levels();
|
||||||
test_swapchain_formats();
|
run_for_each_feature_level(test_swapchain_formats);
|
||||||
test_swapchain_views();
|
test_swapchain_views();
|
||||||
test_swapchain_flip();
|
test_swapchain_flip();
|
||||||
test_clear_render_target_view();
|
test_clear_render_target_view();
|
||||||
|
@ -10826,6 +10807,6 @@ START_TEST(d3d11)
|
||||||
test_index_buffer_offset();
|
test_index_buffer_offset();
|
||||||
test_face_culling();
|
test_face_culling();
|
||||||
test_line_antialiasing_blending();
|
test_line_antialiasing_blending();
|
||||||
test_required_format_support();
|
run_for_each_feature_level(test_required_format_support);
|
||||||
test_fl9_draw();
|
run_for_each_9_x_feature_level(test_fl9_draw);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue