[PATCH 3/6] d3d11: Only accept shader versions supported by the feature level of the device.
Matteo Bruni
mbruni at codeweavers.com
Tue Mar 1 17:50:02 CST 2016
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
dlls/d3d11/shader.c | 6 +-
dlls/d3d11/tests/d3d11.c | 153 ++++++++++++++++++++++++++---------------------
2 files changed, 89 insertions(+), 70 deletions(-)
diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c
index 0e277fc..4c50f8b 100644
--- a/dlls/d3d11/shader.c
+++ b/dlls/d3d11/shader.c
@@ -389,7 +389,7 @@ static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d
desc.byte_code = shader_info.shader_code;
desc.input_signature = &input_signature;
desc.output_signature = &output_signature;
- desc.max_version = 4;
+ desc.max_version = device->max_sm;
hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader,
&d3d_vertex_shader_wined3d_parent_ops, &shader->wined3d_shader);
@@ -708,7 +708,7 @@ static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader, stru
desc.byte_code = shader_info.shader_code;
desc.input_signature = &input_signature;
desc.output_signature = &output_signature;
- desc.max_version = 4;
+ desc.max_version = device->max_sm;
hr = wined3d_shader_create_gs(device->wined3d_device, &desc, shader,
&d3d_geometry_shader_wined3d_parent_ops, &shader->wined3d_shader);
@@ -1034,7 +1034,7 @@ static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d
desc.byte_code = shader_info.shader_code;
desc.input_signature = &input_signature;
desc.output_signature = &output_signature;
- desc.max_version = 4;
+ desc.max_version = device->max_sm;
hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader,
&d3d_pixel_shader_wined3d_parent_ops, &shader->wined3d_shader);
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 00b3d18..50fc5b5 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -1734,6 +1734,8 @@ static void test_create_shader(void)
for (i = 0; i < sizeof(d3d11_feature_levels) / sizeof(*d3d11_feature_levels); ++i)
{
D3D_FEATURE_LEVEL feature_level = d3d11_feature_levels[i];
+ BOOL todo = feature_level >= D3D_FEATURE_LEVEL_9_1 && feature_level <= D3D_FEATURE_LEVEL_9_3;
+
if (!(device = create_device(&feature_level)))
{
skip("Failed to create device for feature level %#x.\n", feature_level);
@@ -1742,16 +1744,22 @@ static void test_create_shader(void)
/* level_9 shaders */
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_0 shader, hr %#x, feature level %#x.\n", hr, feature_level);
- ID3D11PixelShader_Release(ps);
+ todo_wine_if(todo)
+ ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_0 shader, hr %#x, feature level %#x.\n", hr, feature_level);
+ 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);
- ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_1 shader, hr %#x, feature level %#x.\n", hr, feature_level);
- ID3D11PixelShader_Release(ps);
+ todo_wine_if(todo)
+ ok(SUCCEEDED(hr), "Failed to create ps_4_0_level_9_1 shader, hr %#x, feature level %#x.\n", hr, feature_level);
+ if (SUCCEEDED(hr))
+ ID3D11PixelShader_Release(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_3 shader, hr %#x, feature level %#x.\n", hr, feature_level);
- ID3D11PixelShader_Release(ps);
+ todo_wine_if(todo)
+ 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);
/* vertex shader */
hr = ID3D11Device_CreateVertexShader(device, vs_2_0, sizeof(vs_2_0), NULL, &vs);
@@ -1764,86 +1772,97 @@ static void test_create_shader(void)
ok(hr == E_INVALIDARG, "Created a SM4 vertex shader from a pixel shader source, hr %#x, feature level %#x.\n",
hr, feature_level);
- if (feature_level < D3D_FEATURE_LEVEL_10_0)
- {
- refcount = ID3D11Device_Release(device);
- ok(!refcount, "Device has %u references left.\n", refcount);
- continue;
- }
-
- expected_refcount = get_refcount((IUnknown *)device) + 1;
+ expected_refcount = get_refcount((IUnknown *)device) + (feature_level >= D3D_FEATURE_LEVEL_10_0);
hr = ID3D11Device_CreateVertexShader(device, vs_4_0, sizeof(vs_4_0), NULL, &vs);
- ok(SUCCEEDED(hr), "Failed to create SM4 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
+ 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);
- 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);
+ 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);
+ }
/* pixel shader */
- expected_refcount = get_refcount((IUnknown *)device) + 1;
+ 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);
- ok(SUCCEEDED(hr), "Failed to create SM4 vertex shader, hr %#x, feature level %#x.\n", hr, feature_level);
+ 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);
+ else
+ 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);
- 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);
- ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
- "Pixel shader should implement ID3D10PixelShader.\n");
- if (SUCCEEDED(hr)) IUnknown_Release(iface);
-
- refcount = ID3D11PixelShader_Release(ps);
- ok(!refcount, "Pixel shader has %u references left.\n", 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);
+ 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);
+ ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
+ "Pixel shader should implement ID3D10PixelShader.\n");
+ if (SUCCEEDED(hr)) IUnknown_Release(iface);
+
+ refcount = ID3D11PixelShader_Release(ps);
+ ok(!refcount, "Pixel shader has %u references left.\n", refcount);
+ }
/* geometry shader */
- expected_refcount = get_refcount((IUnknown *)device) + 1;
+ 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);
- ok(SUCCEEDED(hr), "Failed to create SM4 geometry shader, hr %#x.\n", hr);
+ 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);
+ else
+ 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);
- 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);
- ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
- "Geometry shader should implement ID3D10GeometryShader.\n");
- if (SUCCEEDED(hr)) IUnknown_Release(iface);
-
- refcount = ID3D11GeometryShader_Release(gs);
- ok(!refcount, "Geometry shader has %u references left.\n", 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);
+ 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);
+ ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
+ "Geometry shader should implement ID3D10GeometryShader.\n");
+ if (SUCCEEDED(hr)) IUnknown_Release(iface);
+
+ refcount = ID3D11GeometryShader_Release(gs);
+ ok(!refcount, "Geometry shader has %u references left.\n", refcount);
+ }
refcount = ID3D11Device_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount);
--
2.4.10
More information about the wine-patches
mailing list