From 7f426a51d120c5ea790ba330c31db0043fd3e59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rico=20Sch=C3=BCller?= Date: Wed, 25 May 2011 10:55:13 +0200 Subject: [PATCH] d3dx9: Pass objects to functions instead of using the base effect in the parameter. --- dlls/d3dx9_36/effect.c | 67 +++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 43 deletions(-) diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c index 712839b191a..6a7ca28171f 100644 --- a/dlls/d3dx9_36/effect.c +++ b/dlls/d3dx9_36/effect.c @@ -32,8 +32,6 @@ static const struct ID3DXEffectCompilerVtbl ID3DXEffectCompiler_Vtbl; struct d3dx_parameter { - struct ID3DXBaseEffectImpl *base; - char *name; char *semantic; void *data; @@ -53,8 +51,6 @@ struct d3dx_parameter struct d3dx_pass { - struct ID3DXBaseEffectImpl *base; - char *name; UINT state_count; UINT annotation_count; @@ -64,8 +60,6 @@ struct d3dx_pass struct d3dx_technique { - struct ID3DXBaseEffectImpl *base; - char *name; UINT pass_count; UINT annotation_count; @@ -83,11 +77,9 @@ struct ID3DXBaseEffectImpl UINT parameter_count; UINT technique_count; - UINT object_count; D3DXHANDLE *parameter_handles; D3DXHANDLE *technique_handles; - D3DXHANDLE *objects; }; struct ID3DXEffectImpl @@ -3355,7 +3347,7 @@ static const struct ID3DXEffectCompilerVtbl ID3DXEffectCompiler_Vtbl = ID3DXEffectCompilerImpl_CompileShader, }; -static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, const char **ptr) +static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, const char **ptr, D3DXHANDLE *objects) { unsigned int i; HRESULT hr; @@ -3370,7 +3362,7 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, cons { struct d3dx_parameter *member = get_parameter_struct(param->member_handles[i]); - hr = d3dx9_parse_value(member, value ? (char *)value + old_size : NULL, ptr); + hr = d3dx9_parse_value(member, value ? (char *)value + old_size : NULL, ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3399,7 +3391,7 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, cons { struct d3dx_parameter *member = get_parameter_struct(param->member_handles[i]); - hr = d3dx9_parse_value(member, (char *)value + old_size, ptr); + hr = d3dx9_parse_value(member, (char *)value + old_size, ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3423,7 +3415,7 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, cons case D3DXPT_VERTEXSHADER: read_dword(ptr, &id); TRACE("Id: %u\n", id); - param->base->objects[id] = get_parameter_handle(param); + objects[id] = get_parameter_handle(param); param->data = value; break; @@ -3460,7 +3452,7 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, cons return D3D_OK; } -static HRESULT d3dx9_parse_init_value(struct d3dx_parameter *param, const char *ptr) +static HRESULT d3dx9_parse_init_value(struct d3dx_parameter *param, const char *ptr, D3DXHANDLE *objects) { UINT size = param->bytes; HRESULT hr; @@ -3481,7 +3473,7 @@ static HRESULT d3dx9_parse_init_value(struct d3dx_parameter *param, const char * memcpy(value, ptr, size); } - hr = d3dx9_parse_value(param, value, &ptr); + hr = d3dx9_parse_value(param, value, &ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3731,7 +3723,6 @@ static HRESULT d3dx9_parse_effect_typedef(struct d3dx_parameter *param, const ch } member_handles[i] = get_parameter_handle(member); - member->base = param->base; hr = d3dx9_parse_effect_typedef(member, data, ptr, param, flags); if (hr != D3D_OK) @@ -3768,7 +3759,6 @@ static HRESULT d3dx9_parse_effect_typedef(struct d3dx_parameter *param, const ch } member_handles[i] = get_parameter_handle(member); - member->base = param->base; hr = d3dx9_parse_effect_typedef(member, data, ptr, NULL, flags); if (hr != D3D_OK) @@ -3812,7 +3802,7 @@ err_out: return hr; } -static HRESULT d3dx9_parse_effect_annotation(struct d3dx_parameter *anno, const char *data, const char **ptr) +static HRESULT d3dx9_parse_effect_annotation(struct d3dx_parameter *anno, const char *data, const char **ptr, D3DXHANDLE *objects) { DWORD offset; const char *ptr2; @@ -3832,7 +3822,7 @@ static HRESULT d3dx9_parse_effect_annotation(struct d3dx_parameter *anno, const read_dword(ptr, &offset); TRACE("Value offset: %#x\n", offset); - hr = d3dx9_parse_init_value(anno, data + offset); + hr = d3dx9_parse_init_value(anno, data + offset, objects); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3842,7 +3832,7 @@ static HRESULT d3dx9_parse_effect_annotation(struct d3dx_parameter *anno, const return D3D_OK; } -static HRESULT d3dx9_parse_effect_parameter(struct d3dx_parameter *param, const char *data, const char **ptr) +static HRESULT d3dx9_parse_effect_parameter(struct d3dx_parameter *param, const char *data, const char **ptr, D3DXHANDLE *objects) { DWORD offset; HRESULT hr; @@ -3870,7 +3860,7 @@ static HRESULT d3dx9_parse_effect_parameter(struct d3dx_parameter *param, const return hr; } - hr = d3dx9_parse_init_value(param, data + offset); + hr = d3dx9_parse_init_value(param, data + offset, objects); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3900,9 +3890,8 @@ static HRESULT d3dx9_parse_effect_parameter(struct d3dx_parameter *param, const } annotation_handles[i] = get_parameter_handle(annotation); - annotation->base = param->base; - hr = d3dx9_parse_effect_annotation(annotation, data, ptr); + hr = d3dx9_parse_effect_annotation(annotation, data, ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse annotation\n"); @@ -3929,7 +3918,7 @@ err_out: return hr; } -static HRESULT d3dx9_parse_effect_pass(struct d3dx_pass *pass, const char *data, const char **ptr) +static HRESULT d3dx9_parse_effect_pass(struct d3dx_pass *pass, const char *data, const char **ptr, D3DXHANDLE *objects) { DWORD offset; HRESULT hr; @@ -3975,9 +3964,8 @@ static HRESULT d3dx9_parse_effect_pass(struct d3dx_pass *pass, const char *data, } annotation_handles[i] = get_parameter_handle(annotation); - annotation->base = pass->base; - hr = d3dx9_parse_effect_annotation(annotation, data, ptr); + hr = d3dx9_parse_effect_annotation(annotation, data, ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse annotations\n"); @@ -4015,7 +4003,7 @@ err_out: return hr; } -static HRESULT d3dx9_parse_effect_technique(struct d3dx_technique *technique, const char *data, const char **ptr) +static HRESULT d3dx9_parse_effect_technique(struct d3dx_technique *technique, const char *data, const char **ptr, D3DXHANDLE *objects) { DWORD offset; HRESULT hr; @@ -4062,9 +4050,8 @@ static HRESULT d3dx9_parse_effect_technique(struct d3dx_technique *technique, co } annotation_handles[i] = get_parameter_handle(annotation); - annotation->base = technique->base; - hr = d3dx9_parse_effect_annotation(annotation, data, ptr); + hr = d3dx9_parse_effect_annotation(annotation, data, ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse annotations\n"); @@ -4096,9 +4083,8 @@ static HRESULT d3dx9_parse_effect_technique(struct d3dx_technique *technique, co } pass_handles[i] = get_pass_handle(pass); - pass->base = technique->base; - hr = d3dx9_parse_effect_pass(pass, data, ptr); + hr = d3dx9_parse_effect_pass(pass, data, ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse passes\n"); @@ -4144,9 +4130,9 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * D3DXHANDLE *parameter_handles = NULL; D3DXHANDLE *technique_handles = NULL; D3DXHANDLE *objects = NULL; - unsigned int stringcount; + UINT stringcount, objectcount; HRESULT hr; - unsigned int i; + UINT i; read_dword(&ptr, &base->parameter_count); TRACE("Parameter count: %u\n", base->parameter_count); @@ -4156,10 +4142,10 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * skip_dword_unknown(&ptr, 1); - read_dword(&ptr, &base->object_count); - TRACE("Object count: %u\n", base->object_count); + read_dword(&ptr, &objectcount); + TRACE("Object count: %u\n", objectcount); - objects = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*objects) * base->object_count); + objects = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*objects) * objectcount); if (!objects) { ERR("Out of memory\n"); @@ -4167,8 +4153,6 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * goto err_out; } - base->objects = objects; - if (base->parameter_count) { parameter_handles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*parameter_handles) * base->parameter_count); @@ -4192,9 +4176,8 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * } parameter_handles[i] = get_parameter_handle(parameter); - parameter->base = base; - hr = d3dx9_parse_effect_parameter(parameter, data, &ptr); + hr = d3dx9_parse_effect_parameter(parameter, data, &ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse parameter\n"); @@ -4226,9 +4209,8 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * } technique_handles[i] = get_technique_handle(technique); - technique->base = base; - hr = d3dx9_parse_effect_technique(technique, data, &ptr); + hr = d3dx9_parse_effect_technique(technique, data, &ptr, objects); if (hr != D3D_OK) { WARN("Failed to parse technique\n"); @@ -4250,7 +4232,7 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * read_dword(&ptr, &id); TRACE("Id: %u\n", id); - param = get_parameter_struct(base->objects[id]); + param = get_parameter_struct(objects[id]); hr = d3dx9_parse_data(param, &ptr, base->effect->device); if (hr != D3D_OK) @@ -4261,7 +4243,6 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * } HeapFree(GetProcessHeap(), 0, objects); - base->objects = NULL; base->technique_handles = technique_handles; base->parameter_handles = parameter_handles;