[PATCH 3/3] d3dx9: Return E_FAIL from ValidateTechnique() for techniques with unsupported shaders.
Paul Gofman
gofmanp at gmail.com
Thu Aug 31 12:40:43 CDT 2017
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
dlls/d3dx9_36/effect.c | 50 +++++++++++++++++++++++++++++++++++++++++---
dlls/d3dx9_36/tests/effect.c | 3 ---
2 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 2cd0c22f64..94bbba1510 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,52 @@ 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], ¶m_value, ¶m,
+ FALSE, ¶m_dirty)))
+ return hr;
+
+ if (!param->object_id || base->objects[param->object_id].creation_failed)
+ {
+ if (!param->object_id)
+ FIXME("Zero object ID in shader parameter.\n");
+ 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,6 +5980,7 @@ static HRESULT d3dx9_create_object(struct d3dx9_base_effect *base, struct d3dx_o
(IDirect3DVertexShader9 **)param->data)))
{
WARN("Failed to create vertex shader.\n");
+ object->creation_failed = TRUE;
return D3D_OK;
}
break;
@@ -5946,6 +5989,7 @@ static HRESULT d3dx9_create_object(struct d3dx9_base_effect *base, struct d3dx_o
(IDirect3DPixelShader9 **)param->data)))
{
WARN("Failed to create pixel shader.\n");
+ object->creation_failed = TRUE;
return D3D_OK;
}
break;
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index 072ee61447..f1ca9ffde0 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