Nikolay Sivov : d3d10/effect: Explicitly store rasterizer state variable.

Alexandre Julliard julliard at winehq.org
Thu Oct 7 16:21:22 CDT 2021


Module: wine
Branch: master
Commit: 0c5c8fd84d89108aa2aab74d52b149121c8d4678
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0c5c8fd84d89108aa2aab74d52b149121c8d4678

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Oct  6 10:53:35 2021 +0300

d3d10/effect: Explicitly store rasterizer state variable.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3d10/d3d10_private.h |  2 +-
 dlls/d3d10/effect.c        | 22 ++++++++++++++++++----
 dlls/d3d10/tests/effect.c  | 17 +++++++++++++++++
 3 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index f799d27b323..4e35a2f319d 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -79,7 +79,6 @@ struct d3d10_effect_object
     enum d3d10_effect_object_type type;
     union
     {
-        ID3D10RasterizerState *rs;
         ID3D10DepthStencilState *ds;
         ID3D10BlendState *bs;
         ID3D10VertexShader *vs;
@@ -247,6 +246,7 @@ struct d3d10_effect_pass
     struct d3d10_effect_pass_shader_desc vs;
     struct d3d10_effect_pass_shader_desc ps;
     struct d3d10_effect_pass_shader_desc gs;
+    struct d3d10_effect_variable *rasterizer;
     UINT stencil_ref;
     UINT sample_mask;
     float blend_factor[4];
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 70f6c3b3166..66eb723fe9c 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -1918,8 +1918,19 @@ static HRESULT parse_fx10_object(const char *data, size_t data_size,
         case D3D10_EOT_RASTERIZER_STATE:
         {
             ID3D10EffectRasterizerVariable *rv = variable->lpVtbl->AsRasterizer(variable);
-            if (FAILED(hr = rv->lpVtbl->GetRasterizerState(rv, variable_idx, &o->object.rs)))
-                return hr;
+            if (!rv->lpVtbl->IsValid(rv))
+            {
+                WARN("Invalid variable type.\n");
+                return E_FAIL;
+            }
+            v = impl_from_ID3D10EffectVariable(variable);
+            if (v->type->element_count)
+            {
+                if (variable_idx >= v->type->element_count) return E_FAIL;
+                o->pass->rasterizer = &v->elements[variable_idx];
+            }
+            else
+                o->pass->rasterizer = v;
             break;
         }
 
@@ -2903,8 +2914,7 @@ static HRESULT d3d10_effect_object_apply(struct d3d10_effect_object *o)
     switch(o->type)
     {
         case D3D10_EOT_RASTERIZER_STATE:
-            ID3D10Device_RSSetState(device, o->object.rs);
-            return S_OK;
+            break;
 
         case D3D10_EOT_DEPTH_STENCIL_STATE:
             ID3D10Device_OMSetDepthStencilState(device, o->object.ds, o->pass->stencil_ref);
@@ -2935,6 +2945,8 @@ static HRESULT d3d10_effect_object_apply(struct d3d10_effect_object *o)
             FIXME("Unhandled effect object type %#x.\n", o->type);
             return E_FAIL;
     }
+
+    return S_OK;
 }
 
 static void d3d10_effect_shader_variable_destroy(struct d3d10_effect_shader_variable *s,
@@ -4100,6 +4112,8 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_Apply(ID3D10EffectPass *iface
         apply_shader_resources(device, pass->gs.shader);
     if (pass->ps.shader != &null_shader_variable)
         apply_shader_resources(device, pass->ps.shader);
+    if (pass->rasterizer)
+        ID3D10Device_RSSetState(device, pass->rasterizer->u.state.object.rasterizer);
 
     for (i = 0; i < pass->object_count; ++i)
     {
diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c
index f3b81a2c58d..1a06ff95365 100644
--- a/dlls/d3d10/tests/effect.c
+++ b/dlls/d3d10/tests/effect.c
@@ -4195,6 +4195,7 @@ static void test_effect_state_groups(void)
     UINT sample_mask, stencil_ref;
     ID3D10EffectBlendVariable *b;
     D3D10_BLEND_DESC blend_desc;
+    D3D10_STATE_BLOCK_MASK mask;
     D3D10_PASS_DESC pass_desc;
     ID3D10EffectVariable *v;
     ID3D10EffectPass *pass;
@@ -4203,6 +4204,7 @@ static void test_effect_state_groups(void)
     ID3D10Device *device;
     ULONG refcount;
     HRESULT hr;
+    BOOL ret;
 
     if (!(device = create_device()))
     {
@@ -4323,6 +4325,21 @@ static void test_effect_state_groups(void)
     ok(pass_desc.BlendFactor[1] == 0.6f, "Got unexpected BlendFactor[1] %.8e.\n", pass_desc.BlendFactor[1]);
     ok(pass_desc.BlendFactor[2] == 0.7f, "Got unexpected BlendFactor[2] %.8e.\n", pass_desc.BlendFactor[2]);
     ok(pass_desc.BlendFactor[3] == 0.8f, "Got unexpected BlendFactor[3] %.8e.\n", pass_desc.BlendFactor[3]);
+
+    hr = D3D10StateBlockMaskDisableAll(&mask);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = pass->lpVtbl->ComputeStateBlockMask(pass, &mask);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ret = D3D10StateBlockMaskGetSetting(&mask, D3D10_DST_RS_RASTERIZER_STATE, 0);
+todo_wine
+    ok(ret, "Unexpected mask.\n");
+    ret = D3D10StateBlockMaskGetSetting(&mask, D3D10_DST_OM_DEPTH_STENCIL_STATE, 0);
+todo_wine
+    ok(ret, "Unexpected mask.\n");
+    ret = D3D10StateBlockMaskGetSetting(&mask, D3D10_DST_OM_BLEND_STATE, 0);
+todo_wine
+    ok(ret, "Unexpected mask.\n");
+
     hr = pass->lpVtbl->Apply(pass, 0);
     ok(SUCCEEDED(hr), "Failed to apply pass, hr %#x.\n", hr);
 




More information about the wine-cvs mailing list