[PATCH 3/6] d3d10/effect: Fix index access in GetSampler().

Nikolay Sivov nsivov at codeweavers.com
Fri Jan 21 01:26:25 CST 2022


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d3d10/effect.c       | 12 +++++-------
 dlls/d3d10/tests/effect.c | 11 +++++++++++
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index daca3379fde..6fec572d692 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -9254,17 +9254,15 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_sampler_variable_GetSampler(ID3D10
 
     TRACE("iface %p, index %u, sampler %p.\n", iface, index, sampler);
 
-    if (v->type->element_count)
-        v = impl_from_ID3D10EffectVariable(iface->lpVtbl->GetElement(iface, index));
-    else if (index)
-        return E_FAIL;
-
-    if (v->type->basetype != D3D10_SVT_SAMPLER)
+    if (!iface->lpVtbl->IsValid(iface))
     {
-        WARN("Variable is not a sampler state.\n");
+        WARN("Invalid variable.\n");
         return E_FAIL;
     }
 
+    if (!(v = d3d10_get_state_variable(v, index, &v->effect->samplers)))
+        return E_FAIL;
+
     if ((*sampler = v->u.state.object.sampler))
         ID3D10SamplerState_AddRef(*sampler);
 
diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c
index 84a2abcb4d9..5ca6b539524 100644
--- a/dlls/d3d10/tests/effect.c
+++ b/dlls/d3d10/tests/effect.c
@@ -4446,6 +4446,7 @@ static void test_effect_state_groups(void)
     ID3D10EffectBlendVariable *b;
     D3D10_BLEND_DESC blend_desc;
     D3D10_STATE_BLOCK_MASK mask;
+    ID3D10SamplerState *sampler;
     D3D10_PASS_DESC pass_desc;
     ID3D10EffectVariable *v;
     ID3D10EffectPass *pass;
@@ -4496,9 +4497,19 @@ static void test_effect_state_groups(void)
     ok(sampler_desc.BorderColor[3] == 4.0f, "Got unexpected BorderColor[3] %.8e.\n", sampler_desc.BorderColor[3]);
     ok(sampler_desc.MinLOD == 6.0f, "Got unexpected MinLOD %.8e.\n", sampler_desc.MinLOD);
     ok(sampler_desc.MaxLOD == 5.0f, "Got unexpected MaxLOD %.8e.\n", sampler_desc.MaxLOD);
+    hr = s->lpVtbl->GetSampler(s, 0, &sampler);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ID3D10SamplerState_GetDesc(sampler, &sampler_desc);
+    ok(sampler_desc.Filter == D3D10_FILTER_MIN_MAG_MIP_LINEAR, "Got unexpected Filter %#x.\n", sampler_desc.Filter);
+    ID3D10SamplerState_Release(sampler);
 
     s->lpVtbl->GetBackingStore(s, 1, &sampler_desc);
     ok(sampler_desc.AddressU == D3D10_TEXTURE_ADDRESS_MIRROR, "Got unexpected AddressU %#x.\n", sampler_desc.AddressU);
+    hr = s->lpVtbl->GetSampler(s, 1, &sampler);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ID3D10SamplerState_GetDesc(sampler, &sampler_desc);
+    ok(sampler_desc.AddressU == D3D10_TEXTURE_ADDRESS_MIRROR, "Got unexpected AddressU %#x.\n", sampler_desc.AddressU);
+    ID3D10SamplerState_Release(sampler);
 
     v = effect->lpVtbl->GetVariableByName(effect, "blend_state");
     b = v->lpVtbl->AsBlend(v);
-- 
2.34.1




More information about the wine-devel mailing list