internal static DebugEffectInterfaceVariable Parse(DebugBytecodeReader reader, DebugBytecodeReader variableReader, DebugShaderVersion version) { var result = new DebugEffectInterfaceVariable(); var nameOffset = result.NameOffset = variableReader.ReadUInt32("NameOffset"); var nameReader = reader.CopyAtOffset("NameReader", variableReader, (int)nameOffset); result.Name = nameReader.ReadString("Name"); var typeOffset = result.TypeOffset = variableReader.ReadUInt32("TypeOffset"); var typeReader = reader.CopyAtOffset("TypeReader", variableReader, (int)typeOffset); result.Type = DebugEffectType.Parse(reader, typeReader, version); //Pointer to InterfaceInitializer result.DefaultValueOffset = variableReader.ReadUInt32("DefaultValueOffset"); var initializerReader = reader.CopyAtOffset("InitializerReader", variableReader, (int)result.DefaultValueOffset); var instanceNameOffset = result.InstanceNameOffset = initializerReader.ReadUInt32("InstanceNameOffset"); var instanceNameReader = reader.CopyAtOffset("InstanceNameReader", variableReader, (int)instanceNameOffset); result.InstanceName = instanceNameReader.ReadString("InstanceName"); result.Flags = variableReader.ReadUInt32("Flags"); result.AnnotationCount = variableReader.ReadUInt32("AnnotationCount"); for (int i = 0; i < result.AnnotationCount; i++) { variableReader.AddIndent($"Annotation {i}"); result.Annotations.Add(DebugEffectAnnotation.Parse(reader, variableReader, version)); variableReader.RemoveIndent(); } return(result); }
public static DebugEffectChunk Parse(DebugBytecodeReader reader, uint size) { var headerReader = reader.CopyAtCurrentPosition("Header", reader); var result = new DebugEffectChunk(); result.Size = size; var header = result.Header = DebugEffectHeader.Parse(headerReader); var bodyOffset = header.Version.MajorVersion < 5 ? 0x4C : 0x60; var footerOffset = (int)(result.Header.FooterOffset + bodyOffset); var bodyReader = reader.CopyAtOffset("Body", reader, (int)bodyOffset); var dummyReader = bodyReader.CopyAtCurrentPosition("DummyReader", bodyReader); dummyReader.ReadUInt32("Zero"); var footerReader = reader.CopyAtOffset("Footer", reader, footerOffset); var version = header.Version; for (int i = 0; i < header.ConstantBuffers; i++) { footerReader.AddIndent($"ConstantBuffer {i}"); result.LocalBuffers.Add(DebugEffectBuffer.Parse(bodyReader, footerReader, version, false)); footerReader.RemoveIndent(); } for (int i = 0; i < header.ObjectCount; i++) { footerReader.AddIndent($"Variable {i}"); result.LocalVariables.Add(DebugEffectObjectVariable.Parse(bodyReader, footerReader, version, false)); footerReader.RemoveIndent(); } for (int i = 0; i < header.SharedConstantBuffers; i++) { footerReader.AddIndent($"SharedConstantBuffer {i}"); result.SharedBuffers.Add(DebugEffectBuffer.Parse(bodyReader, footerReader, version, true)); footerReader.RemoveIndent(); } for (int i = 0; i < header.SharedObjectCount; i++) { footerReader.AddIndent($"SharedVariable {i}"); result.SharedVariables.Add(DebugEffectObjectVariable.Parse(bodyReader, footerReader, version, true)); footerReader.RemoveIndent(); } if (header.Version.MajorVersion >= 5) { for (int i = 0; i < header.InterfaceVariableCount; i++) { footerReader.AddIndent($"Interface {i}"); result.InterfaceVariables.Add(DebugEffectInterfaceVariable.Parse(bodyReader, footerReader, version)); footerReader.RemoveIndent(); } for (int i = 0; i < header.GroupCount; i++) { footerReader.AddIndent($"Group {i}"); result.Groups.Add(DebugEffectGroup.Parse(bodyReader, footerReader, header.Version)); footerReader.RemoveIndent(); } } else { for (int i = 0; i < header.Techniques; i++) { footerReader.AddIndent($"Technique {i}"); result.Techniques.Add(DebugEffectTechnique.Parse(bodyReader, footerReader, header.Version)); footerReader.RemoveIndent(); } } return(result); }