d3d10: Parse local buffers.

This commit is contained in:
Henri Verbeet 2009-07-14 11:17:38 +02:00 committed by Alexandre Julliard
parent 74ec910397
commit 710b57a5aa
2 changed files with 56 additions and 8 deletions

View File

@ -58,6 +58,12 @@ struct d3d10_effect_shader_variable
} shader;
};
struct d3d10_effect_local_buffer
{
DWORD data_size;
DWORD variable_count;
};
/* ID3D10EffectPass */
struct d3d10_effect_pass
{
@ -91,7 +97,7 @@ struct d3d10_effect
ID3D10Device *device;
DWORD version;
DWORD localbuffers_count;
DWORD local_buffer_count;
DWORD localobjects_count;
DWORD sharedbuffers_count;
DWORD sharedobjects_count;
@ -101,6 +107,8 @@ struct d3d10_effect
DWORD blendstate_count;
DWORD rasterizerstate_count;
DWORD samplerstate_count;
struct d3d10_effect_local_buffer *local_buffers;
struct d3d10_effect_technique *techniques;
};

View File

@ -411,13 +411,44 @@ static HRESULT parse_fx10_technique(struct d3d10_effect_technique *t, const char
return hr;
}
static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, const char **ptr)
{
unsigned int i;
DWORD offset;
read_dword(ptr, &offset);
TRACE("Local buffer name at offset %#x.\n", offset);
read_dword(ptr, &l->data_size);
TRACE("Local buffer data size: %#x.\n", l->data_size);
skip_dword_unknown(ptr, 1);
read_dword(ptr, &l->variable_count);
TRACE("Local buffer variable count: %#x.\n", l->variable_count);
skip_dword_unknown(ptr, 2);
for (i = 0; i < l->variable_count; ++i)
{
skip_dword_unknown(ptr, 7);
}
return S_OK;
}
static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD data_size)
{
const char *ptr = data + e->index_offset;
HRESULT hr = S_OK;
unsigned int i;
HRESULT hr;
skip_dword_unknown(&ptr, 6);
e->local_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->local_buffer_count * sizeof(*e->local_buffers));
if (!e->local_buffers)
{
ERR("Failed to allocate local buffer memory.\n");
return E_OUTOFMEMORY;
}
e->techniques = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->technique_count * sizeof(*e->techniques));
if (!e->techniques)
@ -426,6 +457,14 @@ static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD d
return E_OUTOFMEMORY;
}
for (i = 0; i < e->local_buffer_count; ++i)
{
struct d3d10_effect_local_buffer *l = &e->local_buffers[i];
hr = parse_fx10_local_buffer(l, &ptr);
if (FAILED(hr)) return hr;
}
for (i = 0; i < e->technique_count; ++i)
{
struct d3d10_effect_technique *t = &e->techniques[i];
@ -434,13 +473,13 @@ static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD d
t->effect = e;
hr = parse_fx10_technique_index(t, &ptr);
if (FAILED(hr)) break;
if (FAILED(hr)) return hr;
hr = parse_fx10_technique(t, data);
if (FAILED(hr)) break;
if (FAILED(hr)) return hr;
}
return hr;
return S_OK;
}
static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_size)
@ -452,8 +491,8 @@ static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_s
read_dword(&ptr, &e->version);
TRACE("Target: %#x\n", e->version);
read_dword(&ptr, &e->localbuffers_count);
TRACE("Localbuffers count: %u\n", e->localbuffers_count);
read_dword(&ptr, &e->local_buffer_count);
TRACE("Local buffer count: %u.\n", e->local_buffer_count);
/* Number of variables in local buffers? */
read_dword(&ptr, &unknown);
@ -660,6 +699,7 @@ static ULONG STDMETHODCALLTYPE d3d10_effect_Release(ID3D10Effect *iface)
}
HeapFree(GetProcessHeap(), 0, This->techniques);
}
HeapFree(GetProcessHeap(), 0, This->local_buffers);
ID3D10Device_Release(This->device);
HeapFree(GetProcessHeap(), 0, This);
}