public static DebugConstantBuffer Parse( DebugBytecodeReader reader, DebugBytecodeReader constantBufferReader, DebugShaderVersion target) { uint nameOffset = constantBufferReader.ReadUInt32("nameOffset"); var nameReader = reader.CopyAtOffset("nameReader", constantBufferReader, (int)nameOffset); var name = nameReader.ReadString("name"); uint variableCount = constantBufferReader.ReadUInt32("variableCount"); uint variableOffset = constantBufferReader.ReadUInt32("variableOffset"); var result = new DebugConstantBuffer { Name = name }; var variableReader = reader.CopyAtOffset("variableReader", constantBufferReader, (int)variableOffset); for (int i = 0; i < variableCount; i++) { variableReader.AddIndent($"Variable {i}"); result.Variables.Add(DebugShaderVariable.Parse(reader, variableReader, target, i == 0)); variableReader.RemoveIndent(); } result.Size = constantBufferReader.ReadUInt32("size"); result.Flags = (ConstantBufferFlags)constantBufferReader.ReadUInt32("Flags"); result.BufferType = (ConstantBufferType)constantBufferReader.ReadUInt32("BufferType"); return(result); }
internal static DebugShaderVariable Parse(DebugBytecodeReader reader, DebugBytecodeReader variableReader, DebugShaderVersion target, bool isFirst) { uint nameOffset = variableReader.ReadUInt32("nameOffset"); var nameReader = reader.CopyAtOffset("nameReader", variableReader, (int)nameOffset); var name = nameReader.ReadString("name"); var startOffset = variableReader.ReadUInt32("startOffset"); uint size = variableReader.ReadUInt32("size"); var flags = variableReader.ReadEnum32 <ShaderVariableFlags>("flags"); var typeOffset = variableReader.ReadUInt32("typeOffset"); var typeReader = reader.CopyAtOffset("typeReader", variableReader, (int)typeOffset); var shaderType = DebugShaderType.Parse(reader, typeReader, target, 2, isFirst, startOffset); var defaultValueOffset = variableReader.ReadUInt32("defaultValueOffset"); List <Number> defaultValue = null; 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($"defaultValue{i}", 4))); } } var result = new DebugShaderVariable { DefaultValue = defaultValue, Member = new DebugShaderTypeMember(0) { Name = name, Offset = startOffset, Type = shaderType }, BaseType = name, Size = size, Flags = flags }; if (target.MajorVersion >= 5 || target.ProgramType == ProgramType.LibraryShader) { result.StartTexture = variableReader.ReadInt32("startTexture"); result.TextureSize = variableReader.ReadInt32("textureSize"); result.StartSampler = variableReader.ReadInt32("startSampler"); result.SamplerSize = variableReader.ReadInt32("samplerSize"); } return(result); }