Paul Gofman : d3dx9: Return E_FAIL from ValidateTechnique() for techniques with unsupported shaders.

Alexandre Julliard julliard at winehq.org
Fri Sep 8 15:03:20 CDT 2017


Module: wine
Branch: master
Commit: 07cc9acc9fccd2a007370b8ca9fc0303af84ab18
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=07cc9acc9fccd2a007370b8ca9fc0303af84ab18

Author: Paul Gofman <gofmanp at gmail.com>
Date:   Fri Sep  8 00:08:00 2017 +0200

d3dx9: Return E_FAIL from ValidateTechnique() for techniques with unsupported shaders.

Signed-off-by: Paul Gofman <gofmanp at gmail.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3dx9_36/effect.c       | 50 +++++++++++++++++++++++++++++++++++++++-----
 dlls/d3dx9_36/tests/effect.c |  4 ----
 2 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 2cd0c22..75e0931 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -103,6 +103,7 @@ struct d3dx_object
     UINT size;
     void *data;
     struct d3dx_parameter *param;
+    BOOL creation_failed;
 };
 
 struct d3dx_state
@@ -3941,11 +3942,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 && base->objects[param->object_id].creation_failed)
+                {
+                    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)
@@ -5938,7 +5978,7 @@ static HRESULT d3dx9_create_object(struct d3dx9_base_effect *base, struct d3dx_o
                     (IDirect3DVertexShader9 **)param->data)))
             {
                 WARN("Failed to create vertex shader.\n");
-                return D3D_OK;
+                object->creation_failed = TRUE;
             }
             break;
         case D3DXPT_PIXELSHADER:
@@ -5946,7 +5986,7 @@ static HRESULT d3dx9_create_object(struct d3dx9_base_effect *base, struct d3dx_o
                     (IDirect3DPixelShader9 **)param->data)))
             {
                 WARN("Failed to create pixel shader.\n");
-                return D3D_OK;
+                object->creation_failed = TRUE;
             }
             break;
         default:
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index a3cf28e..45d3ace 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");
@@ -7275,7 +7272,6 @@ static void test_effect_null_shader(void)
     effect->lpVtbl->SetInt(effect, "i", 2);
     ok(hr == D3D_OK, "Failed to set parameter, hr %#x.\n", hr);
     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
-    todo_wine
     ok(hr == E_FAIL, "Got result %#x.\n", hr);
 
     effect->lpVtbl->Release(effect);




More information about the wine-cvs mailing list