[v3 3/3] d3dx9: Return E_FAIL from ValidateTechnique() for techniques with unsupported shaders.

Paul Gofman gofmanp at gmail.com
Fri Sep 1 05:56:44 CDT 2017


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
v3:
    - use object_id != 0 as the indication of non-null shader.
---
 dlls/d3dx9_36/effect.c       | 45 +++++++++++++++++++++++++++++++++++++++++---
 dlls/d3dx9_36/tests/effect.c |  3 ---
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 2cd0c22f64..ef772d99b5 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -3941,11 +3941,50 @@ static D3DXHANDLE WINAPI ID3DXEffectImpl_GetCurrentTechnique(ID3DXEffect *iface)
 
 static HRESULT WINAPI ID3DXEffectImpl_ValidateTechnique(ID3DXEffect* iface, D3DXHANDLE technique)
 {
-    struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
+    struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
+    struct d3dx9_base_effect *base = &effect->base_effect;
+    struct d3dx_technique *tech = get_valid_technique(base, technique);
+    HRESULT ret = D3D_OK;
+    unsigned int i, j;
 
-    FIXME("(%p)->(%p): stub\n", This, technique);
+    FIXME("iface %p, technique %p semi-stub.\n", iface, technique);
 
-    return D3D_OK;
+    if (!tech)
+    {
+        ret = D3DERR_INVALIDCALL;
+        goto done;
+    }
+    for (i = 0; i < tech->pass_count; ++i)
+    {
+        struct d3dx_pass *pass = &tech->passes[i];
+
+        for (j = 0; j < pass->state_count; ++j)
+        {
+            struct d3dx_state *state = &pass->states[j];
+
+            if (state_table[state->operation].class == SC_VERTEXSHADER
+                    || state_table[state->operation].class == SC_PIXELSHADER)
+            {
+                struct d3dx_parameter *param;
+                void *param_value;
+                BOOL param_dirty;
+                HRESULT hr;
+
+                if (FAILED(hr = d3dx9_get_param_value_ptr(pass, &pass->states[j], &param_value, &param,
+                        FALSE, &param_dirty)))
+                    return hr;
+
+                if (param->object_id && !*(void **)param->data)
+                {
+                    ret = E_FAIL;
+                    goto done;
+                }
+            }
+        }
+    }
+done:
+    TRACE("Returning %#x.\n", ret);
+    return ret;
 }
 
 static HRESULT WINAPI ID3DXEffectImpl_FindNextValidTechnique(ID3DXEffect* iface, D3DXHANDLE technique, D3DXHANDLE* next_technique)
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index bb26fe4e51..7260411c39 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -7090,10 +7090,8 @@ static void test_effect_unsupported_shader(void)
     ok(hr == D3D_OK, "Got result %#x.\n", hr);
 
     hr = effect->lpVtbl->ValidateTechnique(effect, "missing_technique");
-    todo_wine
     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
     hr = effect->lpVtbl->ValidateTechnique(effect, "tech0");
-    todo_wine
     ok(hr == E_FAIL, "Got result %#x.\n", hr);
 
     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
@@ -7101,7 +7099,6 @@ static void test_effect_unsupported_shader(void)
     effect->lpVtbl->SetInt(effect, "i", 1);
     ok(hr == D3D_OK, "Got result %#x.\n", hr);
     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
-    todo_wine
     ok(hr == E_FAIL, "Got result %#x.\n", hr);
     effect->lpVtbl->SetInt(effect, "i", 0);
     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
-- 
2.13.5




More information about the wine-patches mailing list