[PATCH 3/4] d3d10: Implement ShaderResource effect variable set method.

Matteo Bruni matteo.mystral at gmail.com
Wed Mar 25 16:31:41 CDT 2020


On Wed, Mar 25, 2020 at 7:17 PM Connor McAdams <conmanx360 at gmail.com> wrote:
>
> Signed-off-by: Connor McAdams <conmanx360 at gmail.com>
> ---
>  dlls/d3d10/d3d10_private.h |   7 +++
>  dlls/d3d10/effect.c        | 114 ++++++++++++++++++++++++++++++++++---
>  2 files changed, 114 insertions(+), 7 deletions(-)
>
> diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
> index 21d7f964e8..5d7c4e128b 100644
> --- a/dlls/d3d10/d3d10_private.h
> +++ b/dlls/d3d10/d3d10_private.h
> @@ -131,6 +131,12 @@ struct d3d10_effect_state_object_variable
>      } object;
>  };
>
> +struct d3d10_effect_resource_variable
> +{
> +    ID3D10ShaderResourceView **resource_view;
> +    BOOL parent;
> +};

Just to give a couple more naming options: that could also be srv or view.

> +
>  struct d3d10_effect_buffer_variable
>  {
>      ID3D10Buffer *buffer;
> @@ -196,6 +202,7 @@ struct d3d10_effect_variable
>          struct d3d10_effect_state_object_variable state;
>          struct d3d10_effect_shader_variable shader;
>          struct d3d10_effect_buffer_variable buffer;
> +        struct d3d10_effect_resource_variable resource;
>      } u;
>  };
>
> diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
> index 3d397a38eb..91cb189362 100644
> --- a/dlls/d3d10/effect.c
> +++ b/dlls/d3d10/effect.c
> @@ -2079,6 +2079,28 @@ static HRESULT parse_fx10_local_variable(const char *data, size_t data_size,
>          case D3D10_SVT_TEXTURE2DMSARRAY:
>          case D3D10_SVT_TEXTURE3D:
>          case D3D10_SVT_TEXTURECUBE:
> +            if (!v->type->element_count)
> +                i = 1;
> +            else
> +                i = v->type->element_count;
> +
> +            if (!(v->u.resource.resource_view = heap_calloc(i, sizeof(ID3D10ShaderResourceView *))))

sizeof(*v->u.resource.resource_view)

> @@ -5924,8 +5977,27 @@ static const struct ID3D10EffectStringVariableVtbl d3d10_effect_string_variable_
>      d3d10_effect_string_variable_GetStringArray,
>  };
>
> +static void set_shader_resource_variable(ID3D10ShaderResourceView **src, ID3D10ShaderResourceView **dst)
> +{
> +    if (*dst == *src)
> +        return;
> +
> +    if (*dst)
> +        ID3D10ShaderResourceView_Release(*dst);
> +    if (*src)
> +        ID3D10ShaderResourceView_AddRef(*src);
> +
> +    *dst = *src;
> +}

Nitpick: can you swap the order of the if (*src) / if (*dst)? I know
it doesn't matter since there is the equality check just above, but
with the AddRef() before the Release() it becomes obviously correct
and a bit easier to read.

> @@ -6082,9 +6154,13 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetRawVal
>  static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_SetResource(
>          ID3D10EffectShaderResourceVariable *iface, ID3D10ShaderResourceView *resource)
>  {
> -    FIXME("iface %p, resource %p stub!\n", iface, resource);
> +    struct d3d10_effect_variable *effect_var = impl_from_ID3D10EffectShaderResourceVariable(iface);

Just var is fine.

>
> -    return E_NOTIMPL;
> +    TRACE("iface %p, resource %p.\n", iface, resource);
> +
> +    set_shader_resource_variable(&resource, effect_var->u.resource.resource_view);
> +
> +    return S_OK;
>  }
>
>  static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResource(
> @@ -6098,9 +6174,33 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResour
>  static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_SetResourceArray(
>          ID3D10EffectShaderResourceVariable *iface, ID3D10ShaderResourceView **resources, UINT offset, UINT count)
>  {
> -    FIXME("iface %p, resources %p, offset %u, count %u stub!\n", iface, resources, offset, count);
> +    struct d3d10_effect_variable *effect_var = impl_from_ID3D10EffectShaderResourceVariable(iface);
> +    ID3D10ShaderResourceView **rsrc_view;
> +    UINT i;

unsigned int i;



More information about the wine-devel mailing list