[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