public static DebugBytecodeContainerHeader Parse(DebugBytecodeReader reader) { var fourCc = reader.ReadUInt32("fourCC"); if (fourCc != "DXBC".ToFourCc()) { throw new ParseException($"Invalid FourCC 0x{fourCc.ToString("X2")}"); } var uniqueKey = new uint[4]; uniqueKey[0] = reader.ReadUInt32("uniqueKey1"); uniqueKey[1] = reader.ReadUInt32("uniqueKey2"); uniqueKey[2] = reader.ReadUInt32("uniqueKey3"); uniqueKey[3] = reader.ReadUInt32("uniqueKey4"); return(new DebugBytecodeContainerHeader { FourCc = fourCc, UniqueKey = uniqueKey, One = reader.ReadUInt32("One"), TotalSize = reader.ReadUInt32("TotalSize"), ChunkCount = reader.ReadUInt32("ChunkCount") }); }
public DebugBytecodeContainer(DebugBytecodeReader reader) { try { Chunks = new List <DebugBytecodeChunk>(); _reader = reader; var magicNumber = reader.PeekUint32(); if (magicNumber == 0xFEFF2001) { Chunks.Add(DebugEffectChunk.Parse(reader, (uint)reader.Count)); return; } Header = DebugBytecodeContainerHeader.Parse(reader); for (uint i = 0; i < Header.ChunkCount; i++) { uint chunkOffset = reader.ReadUInt32("chunkOffset"); var fourCC = DebugUtil.ToReadable(reader.PeekUInt32At((int)chunkOffset).ToFourCcString()); var chunkReader = reader.CopyAtOffset($"Chunk{fourCC}", reader, (int)chunkOffset); var chunk = DebugBytecodeChunk.ParseChunk(chunkReader, this); if (chunk != null) { Chunks.Add(chunk); } } } catch (Exception ex) { Exception = ex; Error = ex.ToString(); } }
public static DebugShaderVersion ParseShex(DebugBytecodeReader reader) { uint versionToken = reader.ReadUInt32("Version"); var version = FromShexToken(versionToken); reader.AddNote("MajorVersion", version.MajorVersion); reader.AddNote("MinorVersion", version.MinorVersion); reader.AddNote("ProgramType", version.ProgramType); return(version); }
public DebugBytecodeContainer(byte[] rawBytes) { try { _rawBytes = rawBytes; var reader = new DebugBytecodeReader(rawBytes, 0, rawBytes.Length); Chunks = new List <DebugBytecodeChunk>(); _reader = reader; var magicNumber = reader.PeekUint32(); if (magicNumber == 0xFEFF2001) { Chunks.Add(DebugEffectChunk.Parse(reader, (uint)rawBytes.Length)); return; } Header = DebugBytecodeContainerHeader.Parse(reader); for (uint i = 0; i < Header.ChunkCount; i++) { uint chunkOffset = reader.ReadUInt32("chunkOffset"); var fourCC = DebugUtil.ToReadable(reader.PeekUInt32At((int)chunkOffset).ToFourCcString()); var chunkReader = reader.CopyAtOffset($"Chunk{fourCC}", reader, (int)chunkOffset); var chunk = DebugBytecodeChunk.ParseChunk(chunkReader, this); if (chunk != null) { Chunks.Add(chunk); } } foreach (var chunk in Chunks.OfType <DebugPipelineStateValidationChunk>()) { chunk.UpdateVersion(Chunks.OfType <DebugDxilChunk>().First().Version); } } catch (Exception ex) { Exception = ex; Error = ex.ToString(); } }
public static DebugBytecodeChunk ParseChunk(DebugBytecodeReader chunkReader, DebugBytecodeContainer container) { // Type of chunk this is. uint fourCc = BitConverter.ToUInt32(chunkReader.ReadBytes("fourCc", 4), 0); // Total length of the chunk in bytes. uint chunkSize = chunkReader.ReadUInt32("chunkSize"); ChunkType chunkType; if (KnownChunkTypes.ContainsKey(fourCc)) { chunkType = KnownChunkTypes[fourCc]; } else { //System.Diagnostics.Debug.Assert(false, "Chunk type '" + fourCc.ToFourCcString() + "' is not yet supported."); System.Diagnostics.Debug.WriteLine("Chunk type '" + fourCc.ToFourCcString() + "' is not yet supported."); var unknownChunkReader = chunkReader.CopyAtCurrentPosition($"{fourCc.ToFourCcString()}", chunkReader, (int)chunkSize); unknownChunkReader.ReadBytes("UnknownChunk", (int)chunkSize); return(null); } var chunkContentReader = chunkReader.CopyAtCurrentPosition($"{fourCc.ToFourCcString()}", chunkReader, (int)chunkSize); DebugBytecodeChunk chunk = null; switch (chunkType) { case ChunkType.Ifce: chunk = DebugInterfacesChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Isgn: case ChunkType.Osgn: case ChunkType.Osg5: case ChunkType.Pcsg: case ChunkType.Isg1: case ChunkType.Osg1: chunk = DebugInputOutputSignatureChunk.Parse(chunkContentReader, chunkType, container.ResourceDefinition?.Target?.ProgramType ?? (DXDecompiler.Chunks.Common.ProgramType) 100); break; case ChunkType.Rdef: chunk = DebugResourceDefinitionChunk.Parse(chunkContentReader); break; case ChunkType.Sdbg: case ChunkType.Spdb: //chunk = DebuggingChunk.Parse(chunkContentReader, chunkType, (int)chunkSize); break; case ChunkType.Sfi0: chunk = DebugSfi0Chunk.Parse(chunkContentReader, null, chunkSize); break; case ChunkType.Shdr: case ChunkType.Shex: chunk = DebugShaderProgramChunk.Parse(chunkContentReader); break; case ChunkType.Stat: try { chunk = DebugStatisticsChunk.Parse(chunkContentReader, chunkSize); } catch (ParseException ex) { return(null); } break; case ChunkType.Xnas: case ChunkType.Xnap: case ChunkType.Aon9: chunk = DebugLevel9ShaderChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Priv: break; case ChunkType.Libf: chunk = DebugLibfChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Libh: chunk = DebugLibHeaderChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Lfs0: chunk = DebugLibraryParameterSignatureChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Fx10: chunk = DebugEffectChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Ctab: chunk = DebugCtabChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Cli4: chunk = DebugCli4Chunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Fxlc: chunk = DebugFxlcChunk.Parse(chunkContentReader, chunkSize, container); break; case ChunkType.Dxil: chunk = DebugDxilChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Psv0: chunk = DebugPipelineStateValidationChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Ildn: chunk = DebugDebugNameChunk.Parse(chunkContentReader, chunkSize); break; case ChunkType.Ildb: chunk = DebugDebugInfoDXILChunk.Parse(chunkContentReader, chunkSize); break; //default: // throw new ParseException("Invalid chunk type: " + chunkType); } if (chunk == null) { chunkReader.ReadBytes("UnknownChunk", (int)chunkSize); return(null); } chunk.Container = container; chunk.FourCc = fourCc; chunk.ChunkSize = chunkSize; chunk.ChunkType = chunkType; return(chunk); }