[PATCH 08/10] d3d10: Implement ShaderResource effect variable set method.

Matteo Bruni matteo.mystral at gmail.com
Wed Jan 22 09:45:07 CST 2020


On Sat, Dec 7, 2019 at 7:24 PM Connor McAdams <conmanx360 at gmail.com> wrote:
>
> Implement the SetResource method for the
> ID3D10EffectShaderResourceVariable interface.
>
> Signed-off-by: Connor McAdams <conmanx360 at gmail.com>
> ---
>  dlls/d3d10/d3d10_private.h |  6 ++++
>  dlls/d3d10/effect.c        | 71 +++++++++++++++++++++++++++++++++++---
>  2 files changed, 73 insertions(+), 4 deletions(-)
>
> diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
> index 5c6c7a2d72..f3b4e65e1c 100644
> --- a/dlls/d3d10/d3d10_private.h
> +++ b/dlls/d3d10/d3d10_private.h
> @@ -114,6 +114,11 @@ struct d3d10_effect_state_object_variable
>      } object;
>  };
>
> +struct d3d10_effect_resource_variable
> +{
> +    ID3D10ShaderResourceView **resource_view;
> +};
> +
>  struct d3d10_effect_buffer_variable
>  {
>      ID3D10Buffer *buffer;
> @@ -179,6 +184,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 1e1d5d7f4c..9898b7f79f 100644
> --- a/dlls/d3d10/effect.c
> +++ b/dlls/d3d10/effect.c
> @@ -1994,6 +1994,19 @@ 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:
> +            TRACE("SVT could not have elements.\n");

That trace doesn't seem to apply. I guess it's an accidental copypaste
of the similar one below (not visible in the patch).

> +            if (!v->type->element_count)
> +                i = 1;
> +            else
> +                i = v->type->element_count;
> +
> +            if (!(v->u.resource.resource_view = heap_calloc(i, sizeof(ID3D10ShaderResourceView *))))
> +            {
> +                ERR("Failed to allocate shader resource view array memory.\n");
> +                return E_OUTOFMEMORY;
> +            }
> +            break;
> +
>          case D3D10_SVT_RENDERTARGETVIEW:
>          case D3D10_SVT_DEPTHSTENCILVIEW:
>          case D3D10_SVT_BUFFER:
> @@ -2689,6 +2702,31 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
>                      ID3D10SamplerState_Release(v->u.state.object.sampler);
>                  break;
>
> +            case D3D10_SVT_TEXTURE1D:
> +            case D3D10_SVT_TEXTURE1DARRAY:
> +            case D3D10_SVT_TEXTURE2D:
> +            case D3D10_SVT_TEXTURE2DARRAY:
> +            case D3D10_SVT_TEXTURE2DMS:
> +            case D3D10_SVT_TEXTURE2DMSARRAY:
> +            case D3D10_SVT_TEXTURE3D:
> +            case D3D10_SVT_TEXTURECUBE:
> +                if (!v->type->element_count)
> +                {
> +                    if (*v->u.resource.resource_view)
> +                        ID3D10ShaderResourceView_Release(*v->u.resource.resource_view);
> +                }
> +                else
> +                {
> +                    for (i = 0; i < v->type->element_count; i++)
> +                    {
> +                        if (v->u.resource.resource_view[i])
> +                            ID3D10ShaderResourceView_Release(v->u.resource.resource_view[i]);
> +
> +                    }
> +                }

I think it would be cleaner to use the for loop in the else branch for
element_count == 0, fixing up the iteration count accordingly (like
you do in parse_fx10_local_variable() above).



More information about the wine-devel mailing list