[PATCH 4/8] d3d10/effect: Explicitly store rasterizer state variable.
Nikolay Sivov
nsivov at codeweavers.com
Wed Oct 6 02:53:35 CDT 2021
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
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);
--
2.33.0
More information about the wine-devel
mailing list