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);
        }