Ejemplo n.º 1
0
        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);
        }
        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);
        }
Ejemplo n.º 3
0
        public static DebugEffectAnnotation Parse(DebugBytecodeReader reader, DebugBytecodeReader annotationReader, DebugShaderVersion version)
        {
            var result     = new DebugEffectAnnotation();
            var nameOffset = result.NameOffset = annotationReader.ReadUInt32("NameOffset");
            var nameReader = reader.CopyAtOffset("NameReader", reader, (int)nameOffset);

            result.Name = nameReader.ReadString("Name");
            var typeOffset = result.TypeOffset = annotationReader.ReadUInt32("TypeOffset");
            var typeReader = reader.CopyAtOffset("TypeReader", annotationReader, (int)typeOffset);

            result.Type = DebugEffectType.Parse(reader, typeReader, version);
            //Note: Points to 27 and "foo" in Texture2D tex<int bla=27;string blu="foo";>;
            /// Value format and stride depends on Type
            var valueOffset        = result.ValueOffset = annotationReader.ReadUInt32("ValueOffset");
            var defaultValueReader = reader.CopyAtOffset("DefaultValueReader", annotationReader, (int)valueOffset);

            if (result.Type.EffectVariableType == EffectVariableType.Numeric)
            {
                for (int i = 0; i < result.Type.PackedSize / 4; i++)
                {
                    result.DefaultNumericValue.Add(DebugNumber.Parse(defaultValueReader));
                }
            }
            else
            {
                for (int i = 0; i < result.ElementCount; i++)
                {
                    result.DefaultStringValue.Add(defaultValueReader.ReadString($"DefaultValueString{i}"));
                }
            }
            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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }