From 1f43b0e64ed5d05d2d30ffeb94c87ef431370b9a Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 10 May 2014 23:46:53 +0100 Subject: [PATCH] In release advance precisely opcode length. Fixes #54. In non-release, still warn + log for unexpected tokens, and error for over-reading, but since there's no good documentation we have to just assume the opcode length is accurate and try not to worry about mysterious inaccuracies. --- renderdoc/driver/d3d11/shaders/dxbc_disassemble.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/d3d11/shaders/dxbc_disassemble.cpp b/renderdoc/driver/d3d11/shaders/dxbc_disassemble.cpp index 2d757a9fb..ba88d473f 100644 --- a/renderdoc/driver/d3d11/shaders/dxbc_disassemble.cpp +++ b/renderdoc/driver/d3d11/shaders/dxbc_disassemble.cpp @@ -1827,6 +1827,7 @@ bool DXBCFile::ExtractOperation(uint32_t *&tokenStream, ASMOperation &retOp) } } +#if !defined(RELEASE) if((uint32_t)(tokenStream - begin) > retOp.length) { RDCERR("Consumed too many tokens for %d!", retOp.operation); @@ -1837,17 +1838,25 @@ bool DXBCFile::ExtractOperation(uint32_t *&tokenStream, ASMOperation &retOp) } else if((uint32_t)(tokenStream - begin) < retOp.length) { - RDCERR("Consumed too few tokens for %d!", retOp.operation); + // sometimes this just happens, which is why we only print this in non-release so we can + // inspect it. There's probably not much we can do though, it's just magic. + RDCWARN("Consumed too few tokens for %d!", retOp.operation); uint32_t missing = retOp.length - (uint32_t)(tokenStream - begin); for(uint32_t i=0; i < missing; i++) { - RDCLOG("missing token %d: 0x%08x", tokenStream[0]); + RDCLOG("missing token %d: 0x%08x", i, tokenStream[0]); tokenStream++; } } // make sure we consumed all uint32s RDCASSERT((uint32_t)(tokenStream - begin) == retOp.length); +#else + // there's no good documentation for this, we're freewheeling blind in a nightmarish hellscape. + // Instead of assuming we can predictably decode the whole of every opcode, just advance by the + // defined length. + tokenStream = begin + retOp.length; +#endif return true; }