Module: wine Branch: master Commit: 19fea20963ba0020bea8ba32431edb50897555f2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=19fea20963ba0020bea8ba3243...
Author: Rico Schüller kgbricola@web.de Date: Sun Feb 6 21:56:35 2011 +0100
d3dcompiler: Parse OSG5 in the reflection interface.
---
dlls/d3dcompiler_43/reflection.c | 55 ++++++++++++++++++++++++++++++------- 1 files changed, 44 insertions(+), 11 deletions(-)
diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c index 4b0467a..96adb04 100644 --- a/dlls/d3dcompiler_43/reflection.c +++ b/dlls/d3dcompiler_43/reflection.c @@ -25,6 +25,12 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3dcompiler);
+enum D3DCOMPILER_SIGNATURE_ELEMENT_SIZE +{ + D3DCOMPILER_SIGNATURE_ELEMENT_SIZE6 = 6, + D3DCOMPILER_SIGNATURE_ELEMENT_SIZE7 = 7, +}; + static BOOL copy_name(const char *ptr, char **name) { size_t name_len; @@ -538,15 +544,34 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c return S_OK; }
-HRESULT d3dcompiler_parse_signature(struct d3dcompiler_shader_signature *s, const char *data, DWORD data_size) +HRESULT d3dcompiler_parse_signature(struct d3dcompiler_shader_signature *s, struct dxbc_section *section) { D3D11_SIGNATURE_PARAMETER_DESC *d; unsigned int string_data_offset; unsigned int string_data_size; - const char *ptr = data; + const char *ptr = section->data; char *string_data; unsigned int i; DWORD count; + enum D3DCOMPILER_SIGNATURE_ELEMENT_SIZE element_size; + + switch (section->tag) + { + case TAG_OSG5: + element_size = D3DCOMPILER_SIGNATURE_ELEMENT_SIZE7; + break; + + case TAG_ISGN: + case TAG_OSGN: + case TAG_PCSG: + element_size = D3DCOMPILER_SIGNATURE_ELEMENT_SIZE6; + break; + + default: + FIXME("Unhandled section %s!\n", debugstr_an((const char *)§ion->tag, 4)); + element_size = D3DCOMPILER_SIGNATURE_ELEMENT_SIZE6; + break; + }
read_dword(&ptr, &count); TRACE("%u elements\n", count); @@ -560,9 +585,10 @@ HRESULT d3dcompiler_parse_signature(struct d3dcompiler_shader_signature *s, cons return E_OUTOFMEMORY; }
- /* 2 DWORDs for the header, 6 for each element. */ - string_data_offset = 2 * sizeof(DWORD) + count * 6 * sizeof(DWORD); - string_data_size = data_size - string_data_offset; + /* 2 DWORDs for the header, element_size for each element. */ + string_data_offset = 2 * sizeof(DWORD) + count * element_size * sizeof(DWORD); + string_data_size = section->data_size - string_data_offset; + string_data = HeapAlloc(GetProcessHeap(), 0, string_data_size); if (!string_data) { @@ -570,15 +596,21 @@ HRESULT d3dcompiler_parse_signature(struct d3dcompiler_shader_signature *s, cons HeapFree(GetProcessHeap(), 0, d); return E_OUTOFMEMORY; } - memcpy(string_data, data + string_data_offset, string_data_size); + memcpy(string_data, section->data + string_data_offset, string_data_size);
for (i = 0; i < count; ++i) { UINT name_offset; DWORD mask;
- /* todo: Parse stream in shaderblobs v5 (dx11) */ - d[i].Stream = 0; + if (element_size == D3DCOMPILER_SIGNATURE_ELEMENT_SIZE7) + { + read_dword(&ptr, &d[i].Stream); + } + else + { + d[i].Stream = 0; + }
read_dword(&ptr, &name_offset); d[i].SemanticName = string_data + (name_offset - string_data_offset); @@ -675,7 +707,7 @@ HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection goto err_out; }
- hr = d3dcompiler_parse_signature(reflection->isgn, section->data, section->data_size); + hr = d3dcompiler_parse_signature(reflection->isgn, section); if (FAILED(hr)) { WARN("Failed to parse section ISGN.\n"); @@ -683,6 +715,7 @@ HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection } break;
+ case TAG_OSG5: case TAG_OSGN: reflection->osgn = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*reflection->osgn)); if (!reflection->osgn) @@ -692,7 +725,7 @@ HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection goto err_out; }
- hr = d3dcompiler_parse_signature(reflection->osgn, section->data, section->data_size); + hr = d3dcompiler_parse_signature(reflection->osgn, section); if (FAILED(hr)) { WARN("Failed to parse section OSGN.\n"); @@ -709,7 +742,7 @@ HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection goto err_out; }
- hr = d3dcompiler_parse_signature(reflection->pcsg, section->data, section->data_size); + hr = d3dcompiler_parse_signature(reflection->pcsg, section); if (FAILED(hr)) { WARN("Failed to parse section PCSG.\n");