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); } } }
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); } }
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); }
public IrEffect(EffectChunk effect) { EffectChunk = effect; }