public static DebugConstantTable Parse(DebugBytecodeReader reader) { var result = new DebugConstantTable(); var ctabReader = reader.CopyAtCurrentPosition("CTabReader", reader); var ctabSize = ctabReader.ReadUInt32("CtabSize"); var creatorOffset = ctabReader.ReadInt32("CreatorPosition"); var minorVersion = ctabReader.ReadByte("MinorVersion"); var majorVersion = ctabReader.ReadByte("MajorVersion"); var shaderType = ctabReader.ReadEnum16 <ShaderType>("ShaderType"); var numConstants = ctabReader.ReadInt32("NumConstants"); var constantInfoOffset = ctabReader.ReadInt32("ConstantInfoOffset"); var shaderFlags = ctabReader.ReadEnum32 <ShaderFlags>("ShaderFlags"); var shaderModelOffset = ctabReader.ReadInt32("ShaderModelOffset"); for (int i = 0; i < numConstants; i++) { var decReader = ctabReader.CopyAtOffset($"Declaration {i}", ctabReader, constantInfoOffset + i * 20); DebugConstantDeclaration declaration = DebugConstantDeclaration.Parse(ctabReader, decReader); result.ConstantDeclarations.Add(declaration); } var shaderModelReader = ctabReader.CopyAtOffset("ShaderModelReader", ctabReader, shaderModelOffset); var shaderModel = shaderModelReader.ReadString("ShaderModel"); var creatorReader = ctabReader.CopyAtOffset("CreaterReader", ctabReader, creatorOffset); var creatorString = creatorReader.ReadString("CreatorString"); return(result); }
public static DebugConstantDeclaration Parse(DebugBytecodeReader reader, DebugBytecodeReader decReader) { var result = new DebugConstantDeclaration(); var nameOffset = decReader.ReadUInt32("NameOffset"); result.RegisterSet = decReader.ReadEnum16 <RegisterSet>("RegisterSet"); result.RegisterIndex = decReader.ReadUInt16("RegisterIndex"); result.RegisterCount = decReader.ReadUInt16("RegisterCount"); decReader.ReadUInt16("Reserved"); var typeInfoOffset = decReader.ReadUInt32("TypeInfoOffset"); var defaultValueOffset = decReader.ReadUInt32("DefaultValueOffset"); var nameReader = reader.CopyAtOffset("NameReader", decReader, (int)nameOffset); result.Name = nameReader.ReadString("Name"); var typeReader = reader.CopyAtOffset("TypeReader", decReader, (int)typeInfoOffset); result.Type = DebugConstantType.Parse(reader, typeReader); if (defaultValueOffset != 0) { //Note: thre are corrisponding def instructions. TODO: check that they are the same var defaultValueReader = reader.CopyAtOffset("DefaultValueReader", decReader, (int)defaultValueOffset); var elementCount = result.Type.GetSize() / 4; for (int i = 0; i < elementCount; i++) { result.DefaultValue.Add(defaultValueReader.ReadSingle($"DefaultValue {i}")); } } return(result); }