2010/9/20 Rico Schüller kgbricola@web.de:
Sure that abroach works pretty well for the D3DGetBlobPart() function, but you it is a bit ugly to use it for the D3DStripShader(). There you have to add some quirks. You would have to parse the dxbc twice to get the correct count (could be != count in dxbc original) and then parse only the needed blob parts. Therefore I added the dxbc_remove_section() function. I've attached all patches so that you could see what D3DStripShader() does.
Well, you'd do something like the following:
struct dxbc src_dxbc, dst_dxbc; unsigned int i;
dxbc_init(&src_dxbc); dxbc_init(&dst_dxbc);
dxbc_parse(&src_dxbc, data, data_size);
for (i = 0; i < src_dxbc.section_count; ++i) { struct dxbc_section *s = &src_dxbc.sections[i]; switch (s->tag) { case TAG_SDBG: if (!(flags & D3DCOMPILER_STRIP_DEBUG_INFO)) dxbc_add_section(&dst_dxbc, s->tag, s->data, s->data_size); break;
case TAG_RDEF: case TAG_STAT: if (!(flags & D3DCOMPILER_STRIP_REFLECTION_DATA)) dxbc_add_section(&dst_dxbc, s->tag, s->data, s->data_size); break;
default: dxbc_add_section(&dst_dxbc, s->tag, s->data, s->data_size); break; } }
dxbc_write(&dst_dxbc, blob);
dxbc_destroy(&dst_dxbc); dxbc_destroy(&src_dxbc);
But if it turns out to really be much nicer you could certainly introduce a dxbc_remove_section() function, but I doubt it. In the current patch it's simply dead code though. Somewhat related, do you happen to know if section tags need to be unique within a DXBC? I'd imagine the DXBC format doesn't restrict that, though specific functions may have additional constraints on what is considered a valid input DXBC.