Module: wine Branch: master Commit: f3f59d2cf865c697f4c1c05b45e50ccdfded95db URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3f59d2cf865c697f4c1c05b45...
Author: Rico Schüller kgbricola@web.de Date: Tue May 3 14:46:59 2011 +0200
d3dx9: Implement ID3DXBaseEffect::GetString().
---
dlls/d3dx9_36/effect.c | 168 ++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 154 insertions(+), 14 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c index 6373f1c..fcc3050 100644 --- a/dlls/d3dx9_36/effect.c +++ b/dlls/d3dx9_36/effect.c @@ -83,9 +83,11 @@ struct ID3DXBaseEffectImpl
UINT parameter_count; UINT technique_count; + UINT object_count;
D3DXHANDLE *parameter_handles; D3DXHANDLE *technique_handles; + D3DXHANDLE *objects; };
struct ID3DXEffectImpl @@ -292,11 +294,6 @@ static void free_parameter(D3DXHANDLE handle, BOOL element, BOOL child) return; }
- if (!child) - { - HeapFree(GetProcessHeap(), 0, param->data); - } - if (param->annotation_handles) { for (i = 0; i < param->annotation_count; ++i) @@ -320,6 +317,25 @@ static void free_parameter(D3DXHANDLE handle, BOOL element, BOOL child) HeapFree(GetProcessHeap(), 0, param->member_handles); }
+ if (param->class == D3DXPC_OBJECT && !param->element_count) + { + switch(param->type) + { + case D3DXPT_STRING: + HeapFree(GetProcessHeap(), 0, *(LPSTR *)param->data); + break; + + default: + FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type)); + break; + } + } + + if (!child) + { + HeapFree(GetProcessHeap(), 0, param->data); + } + /* only the parent has to release name and semantic */ if (!element) { @@ -1251,10 +1267,22 @@ static HRESULT WINAPI ID3DXBaseEffectImpl_SetString(ID3DXBaseEffect *iface, D3DX static HRESULT WINAPI ID3DXBaseEffectImpl_GetString(ID3DXBaseEffect *iface, D3DXHANDLE parameter, LPCSTR *string) { struct ID3DXBaseEffectImpl *This = impl_from_ID3DXBaseEffect(iface); + struct d3dx_parameter *param = is_valid_parameter(This, parameter);
- FIXME("iface %p, parameter %p, string %p stub\n", This, parameter, string); + TRACE("iface %p, parameter %p, string %p\n", This, parameter, string);
- return E_NOTIMPL; + if (!param) param = get_parameter_by_name(This, NULL, parameter); + + if (string && param && !param->element_count && param->type == D3DXPT_STRING) + { + *string = *(LPCSTR *)param->data; + TRACE("Returning %s\n", debugstr_a(*string)); + return D3D_OK; + } + + WARN("Invalid argument specified\n"); + + return D3DERR_INVALIDCALL; }
static HRESULT WINAPI ID3DXBaseEffectImpl_SetTexture(ID3DXBaseEffect *iface, D3DXHANDLE parameter, LPDIRECT3DBASETEXTURE9 texture) @@ -2967,11 +2995,12 @@ static const struct ID3DXEffectCompilerVtbl ID3DXEffectCompiler_Vtbl = ID3DXEffectCompilerImpl_CompileShader, };
-static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value) +static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, const char **ptr) { unsigned int i; HRESULT hr; UINT old_size = 0; + DWORD id;
if (param->element_count) { @@ -2981,7 +3010,7 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value) { struct d3dx_parameter *member = get_parameter_struct(param->member_handles[i]);
- hr = d3dx9_parse_value(member, (char *)value + old_size); + hr = d3dx9_parse_value(member, (char *)value + old_size, ptr); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3010,7 +3039,7 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value) { struct d3dx_parameter *member = get_parameter_struct(param->member_handles[i]);
- hr = d3dx9_parse_value(member, (char *)value + old_size); + hr = d3dx9_parse_value(member, (char *)value + old_size, ptr); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3021,6 +3050,22 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value) } break;
+ case D3DXPC_OBJECT: + switch (param->type) + { + case D3DXPT_STRING: + read_dword(ptr, &id); + TRACE("Id: %u\n", id); + param->base->objects[id] = get_parameter_handle(param); + param->data = value; + break; + + default: + FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type)); + break; + } + break; + default: FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class)); break; @@ -3029,12 +3074,11 @@ static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value) return D3D_OK; }
- static HRESULT d3dx9_parse_init_value(struct d3dx_parameter *param, const char *ptr) { UINT size = param->bytes; HRESULT hr; - void *value; + void *value = NULL;
TRACE("param size: %u\n", size);
@@ -3048,7 +3092,7 @@ static HRESULT d3dx9_parse_init_value(struct d3dx_parameter *param, const char * TRACE("Data: %s.\n", debugstr_an(ptr, size)); memcpy(value, ptr, size);
- hr = d3dx9_parse_value(param, value); + hr = d3dx9_parse_value(param, value, &ptr); if (hr != D3D_OK) { WARN("Failed to parse value\n"); @@ -3086,6 +3130,46 @@ static HRESULT d3dx9_parse_name(char **name, const char *ptr) return D3D_OK; }
+static HRESULT d3dx9_parse_data(struct d3dx_parameter *param, const char **ptr) +{ + DWORD size; + HRESULT hr; + + TRACE("Parse data for parameter %s, type %s\n", debugstr_a(param->name), debug_d3dxparameter_type(param->type)); + + read_dword(ptr, &size); + TRACE("Data size: %#x\n", size); + + if (!size) + { + TRACE("Size is 0\n"); + *(void **)param->data = NULL; + return D3D_OK; + } + + switch (param->type) + { + case D3DXPT_STRING: + /* re-read with size (sizeof(DWORD) = 4) */ + hr = d3dx9_parse_name((LPSTR *)param->data, *ptr - 4); + if (hr != D3D_OK) + { + WARN("Failed to parse string data\n"); + return hr; + } + break; + + default: + FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type)); + break; + } + + + *ptr += ((size + 3) & ~3); + + return D3D_OK; +} + static HRESULT d3dx9_parse_effect_typedef(struct d3dx_parameter *param, const char *data, const char **ptr, struct d3dx_parameter *parent, UINT flags) { @@ -3156,6 +3240,19 @@ static HRESULT d3dx9_parse_effect_typedef(struct d3dx_parameter *param, const ch TRACE("Members: %u\n", param->member_count); break;
+ case D3DXPC_OBJECT: + switch (param->type) + { + case D3DXPT_STRING: + param->bytes = sizeof(LPCSTR); + break; + + default: + FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type)); + break; + } + break; + default: FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class)); break; @@ -3615,6 +3712,8 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * const char *ptr = data + start; D3DXHANDLE *parameter_handles = NULL; D3DXHANDLE *technique_handles = NULL; + D3DXHANDLE *objects = NULL; + unsigned int stringcount; HRESULT hr; unsigned int i;
@@ -3624,7 +3723,20 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * read_dword(&ptr, &base->technique_count); TRACE("Technique count: %u\n", base->technique_count);
- skip_dword_unknown(&ptr, 2); + skip_dword_unknown(&ptr, 1); + + read_dword(&ptr, &base->object_count); + TRACE("Object count: %u\n", base->object_count); + + objects = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*objects) * base->object_count); + if (!objects) + { + ERR("Out of memory\n"); + hr = E_OUTOFMEMORY; + goto err_out; + } + + base->objects = objects;
if (base->parameter_count) { @@ -3694,6 +3806,32 @@ static HRESULT d3dx9_parse_effect(struct ID3DXBaseEffectImpl *base, const char * } }
+ read_dword(&ptr, &stringcount); + TRACE("String count: %u\n", stringcount); + + skip_dword_unknown(&ptr, 1); + + for (i = 0; i < stringcount; ++i) + { + DWORD id; + struct d3dx_parameter *param; + + read_dword(&ptr, &id); + TRACE("Id: %u\n", id); + + param = get_parameter_struct(base->objects[id]); + + hr = d3dx9_parse_data(param, &ptr); + if (hr != D3D_OK) + { + WARN("Failed to parse data\n"); + goto err_out; + } + } + + HeapFree(GetProcessHeap(), 0, objects); + base->objects = NULL; + base->technique_handles = technique_handles; base->parameter_handles = parameter_handles;
@@ -3719,6 +3857,8 @@ err_out: HeapFree(GetProcessHeap(), 0, parameter_handles); }
+ HeapFree(GetProcessHeap(), 0, objects); + return hr; }