public static DebugEffectGroup Parse(DebugBytecodeReader reader, DebugBytecodeReader groupReader, DebugShaderVersion version) { var result = new DebugEffectGroup(); result.NameOffset = groupReader.ReadUInt32("NameOffset"); result.TechniqueCount = groupReader.ReadUInt32("TechniqueCount"); result.AnnotationCount = groupReader.ReadUInt32("AnnotationCount"); if (result.NameOffset != 0) { var nameReader = reader.CopyAtOffset("NameReader", groupReader, (int)result.NameOffset); result.Name = nameReader.ReadString("Name"); } else { result.Name = ""; } for (int i = 0; i < result.TechniqueCount; i++) { groupReader.AddIndent($"Technique {i}"); result.Techniques.Add(DebugEffectTechnique.Parse(reader, groupReader, version)); groupReader.RemoveIndent(); } for (int i = 0; i < result.AnnotationCount; i++) { groupReader.AddIndent($"Annotation {i}"); result.Annotations.Add(DebugEffectAnnotation.Parse(reader, groupReader, version)); groupReader.RemoveIndent(); } return(result); }
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 DebugEffectTechnique Parse(DebugBytecodeReader reader, DebugBytecodeReader techniqueReader, DebugShaderVersion version) { var result = new DebugEffectTechnique(version); var nameOffset = result.NameOffset = techniqueReader.ReadUInt32("NameOffset"); var nameReader = reader.CopyAtOffset("NameReader", techniqueReader, (int)nameOffset); result.Name = nameReader.ReadString("Name"); result.PassCount = techniqueReader.ReadUInt32("PassCount"); result.AnnotationCount = techniqueReader.ReadUInt32("AnnotationCount"); for (int i = 0; i < result.AnnotationCount; i++) { techniqueReader.AddIndent("Annotation"); result.Annotations.Add(DebugEffectAnnotation.Parse(reader, techniqueReader, version)); techniqueReader.RemoveIndent(); } for (int i = 0; i < result.PassCount; i++) { techniqueReader.AddIndent($"Pass {i}"); result.Passes.Add(DebugEffectPass.Parse(reader, techniqueReader, version)); techniqueReader.RemoveIndent(); } return(result); }
internal static DebugEffectNumericVariable Parse(DebugBytecodeReader reader, DebugBytecodeReader variableReader, DebugShaderVersion version, bool isShared) { var result = new DebugEffectNumericVariable(); 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); var semanticOffset = result.SemanticOffset = variableReader.ReadUInt32("SemeanticOffset"); if (semanticOffset != 0) { var semanticReader = reader.CopyAtOffset("SemanticReader", variableReader, (int)semanticOffset); result.Semantic = semanticReader.ReadString("Semantic"); } else { result.Semantic = ""; } result.BufferOffset = variableReader.ReadUInt32("BufferOffset"); var defaultValueOffset = result.DefaultValueOffset = variableReader.ReadUInt32("DefaultValueOffset"); List <Number> defaultValue = null; var size = result.Type.PackedSize; if (defaultValueOffset != 0) { defaultValue = new List <Number>(); var defaultValueReader = reader.CopyAtOffset("DefaultValueReader", variableReader, (int)defaultValueOffset); if (size % 4 != 0) { throw new ParseException("Can only deal with 4-byte default values at the moment."); } for (int i = 0; i < size; i += 4) { defaultValue.Add(new Number(defaultValueReader.ReadBytes("Number", 4))); } } result.DefaultValue = defaultValue; if (!isShared) { result.ExplicitBindPoint = variableReader.ReadUInt32("ExplicitBindPoint"); //TODO: Unknown1 //Debug.Assert(result.Unknown1 == 0, $"EffectBufferVariable.Unknown1 {result.Unknown1}"); } 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 DebugEffectPass Parse(DebugBytecodeReader reader, DebugBytecodeReader passReader, DebugShaderVersion version) { var result = new DebugEffectPass(); var nameOffset = result.NameOffset = passReader.ReadUInt32("NameOffset"); var nameReader = reader.CopyAtOffset("NameReader", passReader, (int)nameOffset); result.Name = nameReader.ReadString("Name"); result.ShaderCount = passReader.ReadUInt32("ShaderCount"); result.AnnotationCount = passReader.ReadUInt32("AnnotationCount"); for (int i = 0; i < result.AnnotationCount; i++) { passReader.AddIndent($"Annotation {i}"); result.Annotations.Add(DebugEffectAnnotation.Parse(reader, passReader, version)); passReader.RemoveIndent(); } for (int i = 0; i < result.ShaderCount; i++) { passReader.AddIndent($"Shader {i}"); result.Assignments.Add(DebugEffectAssignment.Parse(reader, passReader)); passReader.RemoveIndent(); } return(result); }
public static DebugEffectObjectVariable Parse(DebugBytecodeReader reader, DebugBytecodeReader variableReader, DebugShaderVersion version, bool isShared = false) { var result = new DebugEffectObjectVariable(); var nameOffset = result.NameOffset = variableReader.ReadUInt32("NameOffset"); var nameReader = reader.CopyAtOffset("NameReader", variableReader, (int)nameOffset); result.Name = nameReader.ReadString("Name"); result.TypeOffset = variableReader.ReadUInt32("TypeOffset"); var typeReader = reader.CopyAtOffset("TypeReader", variableReader, (int)result.TypeOffset); result.Type = DebugEffectType.Parse(reader, typeReader, version); var semanticOffset = result.SemanticOffset = variableReader.ReadUInt32("SemanticOffset"); if (semanticOffset != 0) { var semanticReader = reader.CopyAtOffset("SemanticReader", variableReader, (int)semanticOffset); result.Semantic = semanticReader.ReadString("Semantic"); } else { result.Semantic = ""; } result.BufferOffset = variableReader.ReadUInt32("BufferOffset"); if (isShared) { return(result); } // Initializer data if (result.Type.ObjectType == EffectObjectType.String) { for (int i = 0; i < result.ElementCount; i++) { var stringValueOffset = variableReader.ReadUInt32($"StringValueOffset{i}"); var stringValueReader = reader.CopyAtOffset($"StringValueReader{i}", variableReader, (int)stringValueOffset); result.Strings.Add(stringValueReader.ReadString($"StringValue{i}")); } } if (IfHasAssignments(result.Type)) { for (int i = 0; i < result.ElementCount; i++) { var assignmentCount = variableReader.ReadUInt32($"AssignmentCount{i}"); var assignments = new List <DebugEffectAssignment>(); result.Assignments.Add(assignments); for (int j = 0; j < assignmentCount; j++) { variableReader.AddIndent($"Assignment {i}"); assignments.Add(DebugEffectAssignment.Parse(reader, variableReader)); variableReader.RemoveIndent(); } } } if (result.Type.ObjectType == EffectObjectType.GeometryShaderWithStream) { for (int i = 0; i < result.ElementCount; i++) { variableReader.AddIndent($"GSSOInitializer {i}"); result.GSSOInitializers.Add(DebugEffectGSSOInitializer.Parse(reader, variableReader)); variableReader.RemoveIndent(); } } else if (IsShader5(result.Type)) { for (int i = 0; i < result.ElementCount; i++) { variableReader.AddIndent($"ShaderData5 {i}"); result.ShaderData5.Add(DebugEffectShaderData5.Parse(reader, variableReader)); variableReader.RemoveIndent(); } } else if (IsShader(result.Type)) { for (int i = 0; i < result.ElementCount; i++) { variableReader.AddIndent($"ShaderData {i}"); result.ShaderData.Add(DebugEffectShaderData.Parse(reader, variableReader)); variableReader.RemoveIndent(); } } 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); }