[PATCH 7/7] d3dx9: Support skip_constants parameter for effect.
Matteo Bruni
matteo.mystral at gmail.com
Mon Jul 10 16:04:40 CDT 2017
2017-07-06 13:15 GMT+02:00 Paul Gofman <gofmanp at gmail.com>:
> HRESULT d3dx_create_param_eval(struct d3dx9_base_effect *base_effect, void *byte_code,
> unsigned int byte_code_size, D3DXPARAMETER_TYPE type,
> - struct d3dx_param_eval **peval, ULONG64 *version_counter) DECLSPEC_HIDDEN;
> + struct d3dx_param_eval **peval, ULONG64 *version_counter,
> + const char **skip_constants_names, unsigned int skip_constant_name_count) DECLSPEC_HIDDEN;
I think you can get rid of the "_name" part in those parameters, for brevity.
> +static HRESULT parse_skip_constants_string(char *skip_constants, const char ***names,
> + unsigned int *name_count)
It's a bit a matter of personal taste but triple pointers look quite
ugly to me. In this case you could e.g. return "names" in place of
HRESULT.
> +{
> + const char *name;
> + char *s;
> + unsigned int size = INITIAL_CONST_NAMES_SIZE;
> +
> + *names = HeapAlloc(GetProcessHeap(), 0, sizeof(*names) * size);
> + if (!*names)
> + return E_OUTOFMEMORY;
> +
> + *name_count = 0;
> + s = skip_constants;
> + while ((name = next_valid_constant_name(&s)))
> + {
> + if (*name_count == size)
> + {
> + size *= 2;
> + *names = HeapReAlloc(GetProcessHeap(), 0, *names, sizeof(*names) * size);
> + if (!*names)
> + return E_OUTOFMEMORY;
I think you're leaking memory on failure here.
> + }
> + (*names)[(*name_count)++] = name;
> + }
> + *names = HeapReAlloc(GetProcessHeap(), 0, *names, *name_count * sizeof(*names));
> + if (!*names)
> + return E_OUTOFMEMORY;
And here.
> + for (i = 0; i < skip_constants_name_count; ++i)
> + {
> + struct d3dx_parameter *param;
> +
> + param = get_parameter_by_name(base, NULL, skip_constants_names[i]);
> + if (param)
> + {
> + for (j = 0; j < base->technique_count; ++j)
> + {
> + if (is_parameter_used(param, &base->techniques[j]))
> + {
> + WARN("Parameter %s found in skip_constants is used in technique %u.\n",
> + debugstr_a(skip_constants_names[i]), j);
> + HeapFree(GetProcessHeap(), 0, skip_constants_buffer);
> + HeapFree(GetProcessHeap(), 0, skip_constants_names);
> + d3dx9_base_effect_cleanup(base);
> + return D3DERR_INVALIDCALL;
> + }
> + }
> + }
> + else
> + {
> + TRACE("Parameter %s found in skip_constants not found.\n",
> + debugstr_a(skip_constants_names[i]));
This one sounds a bit awkward ("found... not found"). Maybe just
rewrite that as "skip_constants parameter %s not found". You could
apply the same trick to the previous message too.
> + for (j = 0; j < skip_constant_name_count; ++j)
> + {
> + if (!strcmp(cdesc[index].Name, skip_constants_names[j]))
I assume the skip_constants thing isn't used often and, when it is,
very few constants (1-3) are in the list. If that's not the case, we
might want to use an rbtree for the constant names.
More information about the wine-devel
mailing list