Henri Verbeet : d3d10: Parse local buffers.
Alexandre Julliard
julliard at winehq.org
Tue Jul 14 10:37:33 CDT 2009
Module: wine
Branch: master
Commit: 710b57a5aa1d23222462d9b63c267d0111f87637
URL: http://source.winehq.org/git/wine.git/?a=commit;h=710b57a5aa1d23222462d9b63c267d0111f87637
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Tue Jul 14 11:17:38 2009 +0200
d3d10: Parse local buffers.
---
dlls/d3d10/d3d10_private.h | 10 +++++++-
dlls/d3d10/effect.c | 54 ++++++++++++++++++++++++++++++++++++++-----
2 files changed, 56 insertions(+), 8 deletions(-)
diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index c5a74aa..40ad33e 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -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;
};
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 8316db8..80fdcb0 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -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);
}
More information about the wine-cvs
mailing list