public BytecodeContainer(byte[] rawBytes)
        {
            _rawBytes = rawBytes;
            Chunks    = new List <BytecodeChunk>();

            var reader      = new BytecodeReader(rawBytes, 0, rawBytes.Length);
            var magicNumber = BitConverter.ToUInt32(rawBytes, 0);

            if (magicNumber == 0xFEFF2001)
            {
                Chunks.Add(EffectChunk.Parse(reader, (uint)rawBytes.Length));
                return;
            }
            Header = BytecodeContainerHeader.Parse(reader);

            for (uint i = 0; i < Header.ChunkCount; i++)
            {
                uint chunkOffset = reader.ReadUInt32();
                var  chunkReader = reader.CopyAtOffset((int)chunkOffset);

                var chunk = BytecodeChunk.ParseChunk(chunkReader, this);
                if (chunk != null)
                {
                    Chunks.Add(chunk);
                }
            }
        }
示例#2
0
        public BytecodeContainer(byte[] rawBytes)
        {
            _rawBytes = rawBytes;
            Chunks    = new List <BytecodeChunk>();

            var reader      = new BytecodeReader(rawBytes, 0, rawBytes.Length);
            var magicNumber = BitConverter.ToUInt32(rawBytes, 0);

            if (magicNumber == 0xFEFF2001)
            {
                Chunks.Add(EffectChunk.Parse(reader, (uint)rawBytes.Length));
                return;
            }
            Header = BytecodeContainerHeader.Parse(reader);

            for (uint i = 0; i < Header.ChunkCount; i++)
            {
                uint chunkOffset = reader.ReadUInt32();
                var  chunkReader = reader.CopyAtOffset((int)chunkOffset);

                var chunk = BytecodeChunk.ParseChunk(chunkReader, this);
                if (chunk != null)
                {
                    Chunks.Add(chunk);
                }
            }
            foreach (var chunk in Chunks.OfType <InputOutputSignatureChunk>())
            {
                chunk.UpdateVersion(Version);
            }
            foreach (var chunk in Chunks.OfType <Sfi0Chunk>())
            {
                chunk.UpdateVersion(Version);
            }
            foreach (var chunk in Chunks.OfType <PipelineStateValidationChunk>())
            {
                chunk.UpdateVersion(Version);
            }
        }
示例#3
0
        public static BytecodeChunk ParseChunk(BytecodeReader chunkReader, BytecodeContainer container)
        {
            // Type of chunk this is.
            uint fourCc = chunkReader.ReadUInt32();

            // Total length of the chunk in bytes.
            uint chunkSize = chunkReader.ReadUInt32();

            ChunkType chunkType;

            if (KnownChunkTypes.ContainsKey(fourCc))
            {
                chunkType = KnownChunkTypes[fourCc];
            }
            else
            {
                System.Diagnostics.Debug.Assert(false, "Chunk type '" + fourCc.ToFourCcString() + "' is not yet supported.");
                System.Diagnostics.Debug.WriteLine("Chunk type '" + fourCc.ToFourCcString() + "' is not yet supported.");
                return(null);
            }

            var           chunkContentReader = chunkReader.CopyAtCurrentPosition((int)chunkSize);
            BytecodeChunk chunk;

            switch (chunkType)
            {
            case ChunkType.Ifce:
                chunk = InterfacesChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Isgn:
            case ChunkType.Osgn:
            case ChunkType.Osg5:
            case ChunkType.Pcsg:
            case ChunkType.Isg1:
            case ChunkType.Osg1:
                chunk = InputOutputSignatureChunk.Parse(chunkContentReader, chunkType,
                                                        container.Version.ProgramType);
                break;

            case ChunkType.Rdef:
                chunk = ResourceDefinitionChunk.Parse(chunkContentReader);
                break;

            case ChunkType.Sdbg:
            case ChunkType.Spdb:
                chunk = DebuggingChunk.Parse(chunkContentReader, chunkType, chunkSize);
                break;

            case ChunkType.Sfi0:
                chunk = Sfi0Chunk.Parse(chunkContentReader, container.Version, chunkSize);
                break;

            case ChunkType.Shdr:
            case ChunkType.Shex:
                chunk = ShaderProgramChunk.Parse(chunkContentReader);
                break;

            case ChunkType.Stat:
                chunk = StatisticsChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Xnas:
            case ChunkType.Xnap:
            case ChunkType.Aon9:
                chunk = Level9ShaderChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Priv:
                chunk = PrivateChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Rts0:
                chunk = RootSignatureChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Libf:
                chunk = LibfChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Libh:
                chunk = LibHeaderChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Lfs0:
                chunk = LibraryParameterSignatureChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Fx10:
                chunk = EffectChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Ctab:
                chunk = CtabChunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Cli4:
                chunk = Cli4Chunk.Parse(chunkContentReader, chunkSize);
                break;

            case ChunkType.Fxlc:
                chunk = FxlcChunk.Parse(chunkContentReader, chunkSize, container);
                break;

            default:
                throw new ParseException("Invalid chunk type: " + chunkType);
            }

            chunk.Container = container;
            chunk.FourCc    = fourCc;
            chunk.ChunkSize = chunkSize;
            chunk.ChunkType = chunkType;

            return(chunk);
        }
示例#4
0
 public IrEffect(EffectChunk effect)
 {
     EffectChunk = effect;
 }