Rico Schüller : d3dx9: Implement ID3DXBaseEffect:: GetString().
Alexandre Julliard
julliard at winehq.org
Tue May 3 13:31:02 CDT 2011
Module: wine
Branch: master
Commit: f3f59d2cf865c697f4c1c05b45e50ccdfded95db
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3f59d2cf865c697f4c1c05b45e50ccdfded95db
Author: Rico Schüller <kgbricola at 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;
}
More information about the wine-cvs
mailing list