Instead of a hex number, print the type of chunk, or at least the four tag chars. This makes it easier to check if a skipped chunk is a problem.
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d-shader/dxbc.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index 98c51e4..20a273c 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -1862,6 +1862,11 @@ bool shader_sm4_is_end(void *data, const DWORD **ptr) #define TAG_SHEX MAKE_TAG('S', 'H', 'E', 'X') #define TAG_AON9 MAKE_TAG('A', 'o', 'n', '9') #define TAG_RTS0 MAKE_TAG('R', 'T', 'S', '0') +#define TAG_ICFE MAKE_TAG('I', 'C', 'F', 'E') +#define TAG_RDEF MAKE_TAG('R', 'D', 'E', 'F') +#define TAG_SFI0 MAKE_TAG('S', 'F', 'I', '0') +#define TAG_SPDB MAKE_TAG('S', 'P', 'D', 'B') +#define TAG_STAT MAKE_TAG('S', 'T', 'A', 'T')
static bool require_space(size_t offset, size_t count, size_t size, size_t data_size) { @@ -2092,6 +2097,7 @@ int shader_parse_input_signature(const void *dxbc, size_t dxbc_length, static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *context) { struct vkd3d_shader_desc *desc = context; + char tag_chars[sizeof(tag) + 1]; int ret;
switch (tag) @@ -2142,8 +2148,33 @@ static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *cont TRACE("Skipping AON9 shader code chunk.\n"); break;
+ case TAG_ICFE: + TRACE("Skipping interface/class reflection chunk.\n"); + break; + + case TAG_RDEF: + TRACE("Skipping resource reflection chunk.\n"); + break; + + case TAG_SFI0: + if (data_size >= sizeof(DWORD)) + TRACE("Ignoring flag chunk, value %#x.\n", *(const DWORD *)data); + else + TRACE("Ignoring flag chunk.\n"); + break; + + case TAG_SPDB: + TRACE("Skipping debug info chunk.\n"); + break; + + case TAG_STAT: + TRACE("Skipping statistics chunk.\n"); + break; + default: - TRACE("Skipping chunk %#x.\n", tag); + memcpy(tag_chars, &tag, sizeof(tag)); + tag_chars[sizeof(tag)] = 0; + TRACE("Skipping chunk %s.\n", tag_chars); break; }
On Wed, 27 Nov 2019 at 18:48, Conor McCarthy cmccarthy@codeweavers.com wrote:
+#define TAG_ICFE MAKE_TAG('I', 'C', 'F', 'E') +#define TAG_RDEF MAKE_TAG('R', 'D', 'E', 'F') +#define TAG_SFI0 MAKE_TAG('S', 'F', 'I', '0') +#define TAG_SPDB MAKE_TAG('S', 'P', 'D', 'B') +#define TAG_STAT MAKE_TAG('S', 'T', 'A', 'T')
Where do these come from? Should that be "IFCE"?
default:
TRACE("Skipping chunk %#x.\n", tag);
memcpy(tag_chars, &tag, sizeof(tag));
tag_chars[sizeof(tag)] = 0;
TRACE("Skipping chunk %s.\n", tag_chars); break;
That's not safe, "tag" can contain arbitrary data.
November 29, 2019 6:46 PM, "Henri Verbeet" hverbeet@gmail.com wrote:
On Wed, 27 Nov 2019 at 18:48, Conor McCarthy cmccarthy@codeweavers.com wrote:
Where do these come from? Should that be "IFCE"?
From timjones.io/blog/archive/2015/09/02/parsing-direct3d-shader-bytecode Yes, the table has a typo.