d3d10: Parse local buffers.
This commit is contained in:
parent
74ec910397
commit
710b57a5aa
|
@ -58,6 +58,12 @@ struct d3d10_effect_shader_variable
|
||||||
} shader;
|
} shader;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct d3d10_effect_local_buffer
|
||||||
|
{
|
||||||
|
DWORD data_size;
|
||||||
|
DWORD variable_count;
|
||||||
|
};
|
||||||
|
|
||||||
/* ID3D10EffectPass */
|
/* ID3D10EffectPass */
|
||||||
struct d3d10_effect_pass
|
struct d3d10_effect_pass
|
||||||
{
|
{
|
||||||
|
@ -91,7 +97,7 @@ struct d3d10_effect
|
||||||
|
|
||||||
ID3D10Device *device;
|
ID3D10Device *device;
|
||||||
DWORD version;
|
DWORD version;
|
||||||
DWORD localbuffers_count;
|
DWORD local_buffer_count;
|
||||||
DWORD localobjects_count;
|
DWORD localobjects_count;
|
||||||
DWORD sharedbuffers_count;
|
DWORD sharedbuffers_count;
|
||||||
DWORD sharedobjects_count;
|
DWORD sharedobjects_count;
|
||||||
|
@ -101,6 +107,8 @@ struct d3d10_effect
|
||||||
DWORD blendstate_count;
|
DWORD blendstate_count;
|
||||||
DWORD rasterizerstate_count;
|
DWORD rasterizerstate_count;
|
||||||
DWORD samplerstate_count;
|
DWORD samplerstate_count;
|
||||||
|
|
||||||
|
struct d3d10_effect_local_buffer *local_buffers;
|
||||||
struct d3d10_effect_technique *techniques;
|
struct d3d10_effect_technique *techniques;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -411,13 +411,44 @@ static HRESULT parse_fx10_technique(struct d3d10_effect_technique *t, const char
|
||||||
return hr;
|
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)
|
static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD data_size)
|
||||||
{
|
{
|
||||||
const char *ptr = data + e->index_offset;
|
const char *ptr = data + e->index_offset;
|
||||||
HRESULT hr = S_OK;
|
|
||||||
unsigned int i;
|
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));
|
e->techniques = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->technique_count * sizeof(*e->techniques));
|
||||||
if (!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;
|
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)
|
for (i = 0; i < e->technique_count; ++i)
|
||||||
{
|
{
|
||||||
struct d3d10_effect_technique *t = &e->techniques[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;
|
t->effect = e;
|
||||||
|
|
||||||
hr = parse_fx10_technique_index(t, &ptr);
|
hr = parse_fx10_technique_index(t, &ptr);
|
||||||
if (FAILED(hr)) break;
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
hr = parse_fx10_technique(t, data);
|
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)
|
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);
|
read_dword(&ptr, &e->version);
|
||||||
TRACE("Target: %#x\n", e->version);
|
TRACE("Target: %#x\n", e->version);
|
||||||
|
|
||||||
read_dword(&ptr, &e->localbuffers_count);
|
read_dword(&ptr, &e->local_buffer_count);
|
||||||
TRACE("Localbuffers count: %u\n", e->localbuffers_count);
|
TRACE("Local buffer count: %u.\n", e->local_buffer_count);
|
||||||
|
|
||||||
/* Number of variables in local buffers? */
|
/* Number of variables in local buffers? */
|
||||||
read_dword(&ptr, &unknown);
|
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->techniques);
|
||||||
}
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, This->local_buffers);
|
||||||
ID3D10Device_Release(This->device);
|
ID3D10Device_Release(This->device);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue