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

Paul Gofman gofmanp at gmail.com
Fri Sep 1 06:38:03 CDT 2017


Please ignore this patch for now (along with the previous version). I 
have discovered that there is still the case when object_id can be 
nonzero, but the object is never created (not initialized array of 
shaders). So we should keep the creation_failed flag probably. I will 
send the test for null shaders and the new patch version in the next series.

On 09/01/2017 01:56 PM, Paul Gofman wrote:
> 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");





More information about the wine-devel mailing list