public ExpressionHLSLWriter(ShaderModel shader, string expressionName) { Shader = shader; ExpressionName = expressionName; Ctab = shader.ConstantTable; Cli = shader.Cli; }
public AssemblyLoader() { _signatureResolver = new SignatureResolver(this); _assemblyTable = new AssemblyTable(this); Const = new ConstantTable(this); Files = new FileTable(this); ManifestResources = new ManifestResourceTable(this); Modules = new ModuleTable(this); ModuleRefs = new ModuleRefTable(this); AssemblyRefs = new AssemblyRefTable(this); TypeRefs = new TypeRefTable(this); MemberRefs = new MemberRefTable(this); _typeSpec = new TypeSpecTable(this); _methodSpec = new MethodSpecTable(this); Parameters = new ParamTable(this); Fields = new FieldTable(this); Properties = new PropertyTable(this); Events = new EventTable(this); GenericParameters = new GenericParamTable(this); Methods = new MethodTable(this); Types = new TypeTable(this); }
void ReadConstants() { if (!m_tHeap.HasTable(ConstantTable.RId)) { return; } ConstantTable csTable = m_tableReader.GetConstantTable(); for (int i = 0; i < csTable.Rows.Count; i++) { ConstantRow csRow = csTable [i]; object constant = GetConstant(csRow.Value, csRow.Type); IHasConstant owner = null; switch (csRow.Parent.TokenType) { case TokenType.Field: owner = GetFieldDefAt(csRow.Parent.RID); break; case TokenType.Property: owner = GetPropertyDefAt(csRow.Parent.RID); break; case TokenType.Param: owner = GetParamDefAt(csRow.Parent.RID); break; } owner.Constant = constant; } }
private string FormatOperand(ConstantTable ctab, CliToken cli, FxlcOperandType type, uint index) { var elementIndex = index / 4; var componentIndex = index % 4; var component = FormatComponent(componentIndex, ComponentCount); switch (type) { case FxlcOperandType.Literal: var literal = string.Join(", ", Enumerable.Repeat(cli.GetLiteral(index), (int)ComponentCount)); return(string.Format("({0})", literal)); case FxlcOperandType.Temp: return(string.Format("r{0}{1}", elementIndex, component)); case FxlcOperandType.Variable: return(string.Format("c{0}{1}", elementIndex, component)); case FxlcOperandType.Expr: return(string.Format("c{0}{1}", elementIndex, component)); default: return(string.Format("unknown{0}{1}", elementIndex, component)); } }
public string ToString(ConstantTable ctab, Chunks.Fxlvm.Cli4Chunk cli) { var operands = string.Join(", ", Operands.Select(o => o.FormatOperand(ctab, cli))); return(string.Format("{0} {1}", Opcode.ToString().ToLowerInvariant(), operands)); }
public void WriteConstantTable(ConstantTable constantTable) { if (constantTable == null) { return; } WriteLine("//"); WriteLine("// Generated by {0}", constantTable.Creator); if (constantTable.ConstantDeclarations.Count == 0) { return; } WriteLine("//"); WriteLine("// Parameters:"); WriteLine("//"); foreach (var declaration in constantTable.ConstantDeclarations) { string arraySubscript = ""; if (declaration.Elements > 1) { arraySubscript = $"[{declaration.Elements}]"; } WriteLine("// {0} {1}{2};", declaration.GetTypeName(), declaration.Name, arraySubscript ); } WriteLine("//"); WriteLine("//"); WriteLine("// Registers:"); WriteLine("//"); var maxNameLength = constantTable.ConstantDeclarations.Max(cd => cd.Name.Length); if (maxNameLength < 12) { maxNameLength = 12; } WriteLine("// Name{0} Reg Size", new string(' ', maxNameLength - 4)); WriteLine("// {0} ----- ----", new string('-', maxNameLength)); foreach (var declaration in constantTable.ConstantDeclarations .OrderBy(cd => (int)cd.RegisterSet * 1000 + cd.RegisterIndex)) { var size = declaration.Rows * declaration.Columns / 4; if (size == 0) { size = 1; } size = declaration.RegisterCount; WriteLine(string.Format("// {0} {1,-5} {2,4}", declaration.Name.PadRight(maxNameLength, ' '), declaration.GetRegisterName(), size)); } WriteLine("//"); WriteLine(""); }
private string FormatComponent(ConstantTable ctab, Chunks.Fxlvm.Cli4Chunk cli, uint componentIndex, uint componentCount) { switch (componentCount) { case 1: switch (componentIndex) { case 0: return(".x"); case 1: return(".y"); case 2: return(".z"); case 3: return(".w"); default: return(""); } case 2: switch (componentIndex) { case 0: return(".xy"); case 1: return(".yz"); case 2: return(".zw"); default: return(""); } case 3: switch (componentIndex) { case 0: return(".xyz"); case 1: return(".yzw"); default: return(""); } default: return(""); } }
/// <summary> /// 提供PixelShader接口对渲染进一步处理 /// </summary> /// <param name="shaderbytes">编译出来的ps文件的bytes</param> public void SetPixelShader(byte[] shaderbytes) { this.SafeRelease(this.pixelShader); this.SafeRelease(this.pixelShaderConstantTable); this.SafeRelease(this.pixelShaderCode); this.pixelShaderCode = new ShaderBytecode(shaderbytes); this.pixelShader = new PixelShader(this.device, this.pixelShaderCode); this.pixelShaderConstantTable = this.pixelShaderCode.ConstantTable; }
void EncodeConstantTable(ConstantTable table) { // TODO: shall we move constants here as well or not? // Also, the ElementType enum in Cecil does not specify // a base type. this.asm.ALIGN(Assembly.OBJECT_ALIGNMENT); this.asm.LABEL(moduleName + " ConstantArray"); this.asm.AddArrayFields(0); }
/// <summary> /// 提供VertexShader接口对渲染进行进一步 /// </summary> /// <param name="shader">编译出来的shader文件的bytes</param> public void SetVertexShader(byte[] shaderbytes) { this.SafeRelease(this.vertexShader); this.SafeRelease(this.vertexConstantTable); this.SafeRelease(this.vertexShaderCode); this.vertexShaderCode = new ShaderBytecode(shaderbytes); this.vertexShader = new VertexShader(this.device, this.vertexShaderCode); this.vertexConstantTable = this.vertexShaderCode.ConstantTable; }
// Test<int,int>,支持递归深入下一层 /// <summary> /// 获取类型的泛型定义。 /// <para>获取示例 Test{int,int,List{int}}></para> /// </summary> /// <param name="type"></param> /// <returns></returns> public static string GetGenriceName(this Type type) { if (!type.IsGenericType) { return(type.Name); } // 要识别出为定义泛型和已定义泛型 // List<>、List<int> StringBuilder code = new StringBuilder($"{WipeOutName(type.Name)}<"); List <string> vs = new List <string>(); // 未定义泛型 if (type.IsGenericTypeDefinition) { var gType = type.GetGenericTypeDefinition(); code.Append(string.Join(", ", gType.GetGenericArguments().Select(x => GetInOut(x) + x.Name))); } else { foreach (var item in type.GetGenericArguments()) { if (item.IsGenericType) { vs.Add(GetInOut(item) + GetGenriceName(item)); } else { vs.Add(GetInOut(item) + ConstantTable.GetBaseTypeName(item)); } } code.Append(string.Join(", ", vs)); } return(code.Append('>').ToString()); // 解析协变逆变 string GetInOut(Type type1) { if (!type1.IsGenericParameter) { return(string.Empty); } switch (type1.GenericParameterAttributes) { case GenericParameterAttributes.Contravariant: return("in"); case GenericParameterAttributes.Covariant: return("out"); default: return(string.Empty); } } }
/// <summary> /// Format operand for FX10 expressions /// </summary> /// <param name="ctab"></param> /// <param name="cli"></param> /// <returns></returns> public string FormatOperand(ConstantTable ctab, Chunks.Fxlvm.Cli4Chunk cli) { if (IsArray == 0) { return(FormatOperand(ctab, cli, OpType, OpIndex)); } else { return(string.Format("{0}[{1}]", FormatOperand(ctab, cli, ArrayType, ArrayIndex), FormatOperand(ctab, cli, OpType, OpIndex))); } }
public string ToString(ConstantTable ctab, CliToken cli) { if (IsArray == 0) { return(FormatOperand(ctab, cli, OpType, OpIndex)); } else { return(string.Format("{0}[{1}]", FormatOperand(ctab, cli, ArrayType, ArrayIndex), FormatOperand(ctab, cli, OpType, OpIndex))); } }
internal void WriteHasConstant(int token) { int encodedToken = ConstantTable.EncodeHasConstant(token); if (bigHasConstant) { Write(encodedToken); } else { Write((short)encodedToken); } }
private DataLocation RegisterConstant(Constant constant, bool customName = false) { if (ConstantTable.TryGetValue(constant, out var location)) { return(location); } return(ConstantTable[constant] = new DataLocation( customName ? constant.DebugName : constant.Type.FullyQualifiedName + RequestName(), constant.Type.Size, constant.Type == PrimitiveType.Pointer)); }
/// <summary> /// 获取泛型类型中的参数列表,如果泛型参数未定义,则列表数为 0 /// <para>注意,只支持一层泛型</para> /// </summary> /// <param name="type"></param> /// <returns></returns> public static string[] GetGenriceParams(this Type type) { if (!type.IsGenericType) { return(new string[0]); } #if NETSTANDARD2_0 return(type.GetGenericArguments().Select(x => x.IsGenericParameter ? x.Name : ConstantTable.GetBaseTypeName(x)) .ToArray()); #else return(type.GetGenericArguments().Select(x => x.IsGenericTypeParameter ? x.Name : ConstantTable.GetBaseTypeName(x)) .ToArray()); #endif }
public void Test() { var output = ConstantTable.GetBaseTypeName <Int32>(); Assert.Equal("int", output); output = ConstantTable.GetBaseTypeName(666); Assert.Equal("int", output); output = ConstantTable.GetBaseTypeName(new object()); Assert.Equal("object", output); output = ConstantTable.GetBaseTypeName(typeof(object)); Assert.Equal("object", output); output = ConstantTable.GetBaseTypeName(typeof(int)); Assert.Equal("int", output); }
public void BuildConstant(OutputRow row) { string lex = row.Name; foreach (ConstantRow idRow in ConstantTable) { if (idRow.Name.CompareTo(lex) == 0) { row.Index = idRow.Index; return; } } ConstantRow idRow2 = new ConstantRow() { Name = lex, Index = ConstantTable.Count + 1 }; ConstantTable.Add(idRow2); row.Index = idRow2.Index; }
public ShaderInfo(FileChunk fileChunk) { bytecode = new ShaderBytecode(fileChunk.CompiledShader); this.Name = fileChunk.Name; this.ConstantHandles = new List <EffectHandle>(); this.ConstantDescriptions = new List <ConstantDescription>(); int i = 0; ConstantTable cTable = bytecode.ConstantTable; if (cTable != null) { EffectHandle handle = bytecode.ConstantTable.GetConstant(null, 0); while (handle != null) { ConstantHandles.Add(handle); var desc = bytecode.ConstantTable.GetConstantDescription(handle); ConstantDescriptions.Add(desc); i++; handle = bytecode.ConstantTable.GetConstant(null, i); } } }
private string FormatOperand(ConstantTable ctab, Chunks.Fxlvm.Cli4Chunk cli, FxlcOperandType type, uint index) { var elementIndex = index / 4; var componentIndex = index % 4; var component = FormatComponent(componentIndex, ComponentCount); switch (type) { case FxlcOperandType.Literal: return(string.Format("({0})", cli.GetLiteral(index, ComponentCount))); case FxlcOperandType.Temp: return(string.Format("r{0}{1}", elementIndex, component)); case FxlcOperandType.Variable: return(string.Format("{0}{1}", ctab.GetVariable(elementIndex), component)); case FxlcOperandType.Expr: if (ComponentCount == 1) { if (componentIndex == 0) { return(string.Format("expr{0}", component)); } else { return(string.Format("expr0{0}", component)); } } return(string.Format("expr{0}", component)); default: return(string.Format("unknown{0}{1}", elementIndex, component)); } }
public virtual void VisitConstantTable(ConstantTable table) { }
private bool CompileVertexShader( string code, out VertexShader vs, out ConstantTable consts ) { string errs; using( GraphicsStream gs = ShaderLoader.CompileShader( code, "main", new Macro[0], null, "vs_2_0", ShaderFlags.None, out errs, out consts ) ) { if( !string.IsNullOrEmpty( errs ) ) throw new Exception( "Shader compilation error: " + errs ); vs = new VertexShader( pn3D.Device, gs ); } return true; }
public void Read(ReaderContext ctxt) { var reader = ctxt.GetTablesReader(); var actualReserved0 = reader.ReadUInt32(); if (actualReserved0 != reserved0) { throw new PEException("invalid MetadataTable header"); } var actualMajorVersion = reader.ReadByte(); if (actualMajorVersion != majorVersion) { throw new PEException("invalid MetadataTable header"); } var actualMinorVersion = reader.ReadByte(); if (actualMinorVersion != minorVersion) { throw new PEException("invalid MetadataTable header"); } var heapSizes = reader.ReadByte(); IsStringStreamBig = (heapSizes & 0x01) != 0; IsGuidStreamBig = (heapSizes & 0x02) != 0; IsBlobStreamBig = (heapSizes & 0x04) != 0; Reserved1 = reader.ReadByte(); var valid = new IntSet64(reader.ReadUInt64()); var sorted = new IntSet64(reader.ReadUInt64()); for (var i = 0; i < 64; i++) { var numRows = 0; if (valid[i]) { numRows = (int)reader.ReadUInt32(); } switch ((TableTag)i) { case TableTag.Module: ModuleTable = new ModuleTable(numRows); break; case TableTag.Assembly: AssemblyTable = new AssemblyTable(numRows); break; case TableTag.AssemblyOS: AssemblyOSTable = new AssemblyOSTable(numRows); break; case TableTag.AssemblyProcessor: AssemblyProcessorTable = new AssemblyProcessorTable(numRows); break; case TableTag.AssemblyRef: AssemblyRefTable = new AssemblyRefTable(numRows); break; case TableTag.AssemblyRefOS: AssemblyRefOSTable = new AssemblyRefOSTable(numRows); break; case TableTag.AssemblyRefProcessor: AssemblyRefProcessorTable = new AssemblyRefProcessorTable(numRows); break; case TableTag.ClassLayout: ClassLayoutTable = new ClassLayoutTable(numRows); break; case TableTag.Constant: ConstantTable = new ConstantTable(numRows); break; case TableTag.CustomAttribute: CustomAttributeTable = new CustomAttributeTable(numRows); break; case TableTag.DeclSecurity: DeclSecurityTable = new DeclSecurityTable(numRows); break; case TableTag.EventMap: EventMapTable = new EventMapTable(numRows); break; case TableTag.Event: EventTable = new EventTable(numRows); break; case TableTag.ExportedType: ExportedTypeTable = new ExportedTypeTable(numRows); break; case TableTag.Field: FieldTable = new FieldTable(numRows); break; case TableTag.FieldLayout: FieldLayoutTable = new FieldLayoutTable(numRows); break; case TableTag.FieldMarshal: FieldMarshalTable = new FieldMarshalTable(numRows); break; case TableTag.FieldRVA: FieldRVATable = new FieldRVATable(numRows); break; case TableTag.File: FileTable = new FileTable(numRows); break; case TableTag.GenericParam: GenericParamTable = new GenericParamTable(numRows); break; case TableTag.GenericParamConstraint: GenericParamConstraintTable = new GenericParamConstraintTable(numRows); break; case TableTag.ImplMap: ImplMapTable = new ImplMapTable(numRows); break; case TableTag.InterfaceImpl: InterfaceImplTable = new InterfaceImplTable(numRows); break; case TableTag.ManifestResource: ManifestResourceTable = new ManifestResourceTable(numRows); break; case TableTag.MemberRef: MemberRefTable = new MemberRefTable(numRows); break; case TableTag.MethodDef: MethodDefTable = new MethodDefTable(numRows); break; case TableTag.MethodImpl: MethodImplTable = new MethodImplTable(numRows); break; case TableTag.MethodSemantics: MethodSemanticsTable = new MethodSemanticsTable(numRows); break; case TableTag.MethodSpec: MethodSpecTable = new MethodSpecTable(numRows); break; case TableTag.ModuleRef: ModuleRefTable = new ModuleRefTable(numRows); break; case TableTag.NestedClass: NestedClassTable = new NestedClassTable(numRows); break; case TableTag.Param: ParamTable = new ParamTable(numRows); break; case TableTag.Property: PropertyTable = new PropertyTable(numRows); break; case TableTag.PropertyMap: PropertyMapTable = new PropertyMapTable(numRows); break; case TableTag.StandAloneSig: StandAloneSigTable = new StandAloneSigTable(numRows); break; case TableTag.TypeDef: TypeDefTable = new TypeDefTable(numRows); break; case TableTag.TypeRef: TypeRefTable = new TypeRefTable(numRows); break; case TableTag.TypeSpec: TypeSpecTable = new TypeSpecTable(numRows); break; default: // Ignore break; } } DetermineIndexCodingSizes(); for (var i = 0; i < 64; i++) { if (valid[i]) { switch ((TableTag)i) { case TableTag.Module: ModuleTable.Read(ctxt, reader); break; case TableTag.Assembly: AssemblyTable.Read(ctxt, reader); break; case TableTag.AssemblyOS: AssemblyOSTable.Read(ctxt, reader); break; case TableTag.AssemblyProcessor: AssemblyProcessorTable.Read(ctxt, reader); break; case TableTag.AssemblyRef: AssemblyRefTable.Read(ctxt, reader); break; case TableTag.AssemblyRefOS: AssemblyRefOSTable.Read(ctxt, reader); break; case TableTag.AssemblyRefProcessor: AssemblyRefProcessorTable.Read(ctxt, reader); break; case TableTag.ClassLayout: ClassLayoutTable.Read(ctxt, reader); break; case TableTag.Constant: ConstantTable.Read(ctxt, reader); break; case TableTag.CustomAttribute: CustomAttributeTable.Read(ctxt, reader); break; case TableTag.DeclSecurity: DeclSecurityTable.Read(ctxt, reader); break; case TableTag.EventMap: EventMapTable.Read(ctxt, reader); break; case TableTag.Event: EventTable.Read(ctxt, reader); break; case TableTag.ExportedType: ExportedTypeTable.Read(ctxt, reader); break; case TableTag.Field: FieldTable.Read(ctxt, reader); break; case TableTag.FieldLayout: FieldLayoutTable.Read(ctxt, reader); break; case TableTag.FieldMarshal: FieldMarshalTable.Read(ctxt, reader); break; case TableTag.FieldRVA: FieldRVATable.Read(ctxt, reader); break; case TableTag.File: FileTable.Read(ctxt, reader); break; case TableTag.GenericParam: GenericParamTable.Read(ctxt, reader); break; case TableTag.GenericParamConstraint: GenericParamConstraintTable.Read(ctxt, reader); break; case TableTag.ImplMap: ImplMapTable.Read(ctxt, reader); break; case TableTag.InterfaceImpl: InterfaceImplTable.Read(ctxt, reader); break; case TableTag.ManifestResource: ManifestResourceTable.Read(ctxt, reader); break; case TableTag.MemberRef: MemberRefTable.Read(ctxt, reader); break; case TableTag.MethodDef: MethodDefTable.Read(ctxt, reader); break; case TableTag.MethodImpl: MethodImplTable.Read(ctxt, reader); break; case TableTag.MethodSemantics: MethodSemanticsTable.Read(ctxt, reader); break; case TableTag.MethodSpec: MethodSpecTable.Read(ctxt, reader); break; case TableTag.ModuleRef: ModuleRefTable.Read(ctxt, reader); break; case TableTag.NestedClass: NestedClassTable.Read(ctxt, reader); break; case TableTag.Param: ParamTable.Read(ctxt, reader); break; case TableTag.Property: PropertyTable.Read(ctxt, reader); break; case TableTag.PropertyMap: PropertyMapTable.Read(ctxt, reader); break; case TableTag.StandAloneSig: StandAloneSigTable.Read(ctxt, reader); break; case TableTag.TypeDef: TypeDefTable.Read(ctxt, reader); break; case TableTag.TypeRef: TypeRefTable.Read(ctxt, reader); break; case TableTag.TypeSpec: TypeSpecTable.Read(ctxt, reader); break; default: throw new PEException("unexpected table tag in MetadataTable body"); } } } ModuleTable.ResolveIndexes(ctxt); TypeRefTable.ResolveIndexes(ctxt); TypeDefTable.ResolveIndexes(ctxt); FieldTable.ResolveIndexes(ctxt); MethodDefTable.ResolveIndexes(ctxt); ParamTable.ResolveIndexes(ctxt); InterfaceImplTable.ResolveIndexes(ctxt); MemberRefTable.ResolveIndexes(ctxt); ConstantTable.ResolveIndexes(ctxt); CustomAttributeTable.ResolveIndexes(ctxt); FieldMarshalTable.ResolveIndexes(ctxt); DeclSecurityTable.ResolveIndexes(ctxt); ClassLayoutTable.ResolveIndexes(ctxt); FieldLayoutTable.ResolveIndexes(ctxt); StandAloneSigTable.ResolveIndexes(ctxt); EventMapTable.ResolveIndexes(ctxt); EventTable.ResolveIndexes(ctxt); PropertyMapTable.ResolveIndexes(ctxt); PropertyTable.ResolveIndexes(ctxt); MethodSemanticsTable.ResolveIndexes(ctxt); MethodImplTable.ResolveIndexes(ctxt); ModuleRefTable.ResolveIndexes(ctxt); TypeSpecTable.ResolveIndexes(ctxt); ImplMapTable.ResolveIndexes(ctxt); FieldRVATable.ResolveIndexes(ctxt); AssemblyTable.ResolveIndexes(ctxt); AssemblyProcessorTable.ResolveIndexes(ctxt); AssemblyOSTable.ResolveIndexes(ctxt); AssemblyRefTable.ResolveIndexes(ctxt); AssemblyRefProcessorTable.ResolveIndexes(ctxt); AssemblyRefOSTable.ResolveIndexes(ctxt); FileTable.ResolveIndexes(ctxt); ExportedTypeTable.ResolveIndexes(ctxt); ManifestResourceTable.ResolveIndexes(ctxt); NestedClassTable.ResolveIndexes(ctxt); GenericParamTable.ResolveIndexes(ctxt); MethodSpecTable.ResolveIndexes(ctxt); GenericParamConstraintTable.ResolveIndexes(ctxt); }
Token ReadInstruction(BytecodeReader reader) { uint instructionToken = reader.ReadUInt32(); Opcode opcode = (Opcode)(instructionToken & 0xffff); int size; if (opcode == Opcode.Comment) { size = (int)((instructionToken >> 16) & 0x7FFF); } else { size = (int)((instructionToken >> 24) & 0x0f); } Token token = null; if (opcode == Opcode.Comment) { var fourCC = reader.ReadUInt32(); if (KnownCommentTypes.ContainsKey(fourCC)) { var commentReader = reader.CopyAtCurrentPosition(); reader.ReadBytes(size * 4 - 4); switch (KnownCommentTypes[fourCC]) { case CommentType.CTAB: ConstantTable = ConstantTable.Parse(commentReader); return(null); case CommentType.C**T: Cli = CliToken.Parse(commentReader); return(null); case CommentType.FXLC: Fxlc = FxlcBlock.Parse(commentReader); return(null); case CommentType.PRES: Preshader = Preshader.Parse(commentReader); return(null); case CommentType.PRSI: Prsi = PrsiToken.Parse(commentReader); return(null); } } token = new CommentToken(opcode, size, this); token.Data[0] = fourCC; for (int i = 1; i < size; i++) { token.Data[i] = reader.ReadUInt32(); } } else { token = new InstructionToken(opcode, size, this); var inst = token as InstructionToken; for (int i = 0; i < size; i++) { token.Data[i] = reader.ReadUInt32(); if (opcode == Opcode.Def || opcode == Opcode.DefB || opcode == Opcode.DefI) { if (i == 0) { inst.Operands.Add(new DestinationOperand(token.Data[i])); } } else if (opcode == Opcode.Dcl) { if (i == 0) { inst.Operands.Add(new DeclarationOperand(token.Data[i])); } else { inst.Operands.Add(new DestinationOperand(token.Data[i])); } } else if (i == 0 && opcode.HasDestination()) { if ((token.Data[i] & (1 << 13)) != 0) { //Relative Address mode token.Data[i + 1] = reader.ReadUInt32(); inst.Operands.Add(new DestinationOperand(token.Data[i], token.Data[i + 1])); i++; } else { inst.Operands.Add(new DestinationOperand(token.Data[i])); } } else if ((token.Data[i] & (1 << 13)) != 0) { //Relative Address mode token.Data[i + 1] = reader.ReadUInt32(); inst.Operands.Add(new SourceOperand(token.Data[i], token.Data[i + 1])); i++; } else { inst.Operands.Add(new SourceOperand(token.Data[i])); } } if (opcode != Opcode.Comment) { token.Modifier = (int)((instructionToken >> 16) & 0xff); token.Predicated = (instructionToken & 0x10000000) != 0; token.CoIssue = (instructionToken & 0x40000000) != 0; Debug.Assert((instructionToken & 0xA0000000) == 0, $"Instruction has unexpected bits set {instructionToken & 0xE0000000}"); } } return(token); }
protected void ProcessParamElement( ConstantTable constantTable, EffectHandle parent, string prefix, int index ) { var constant = constantTable.GetConstant( parent, index ); // Since D3D HLSL doesn't deal with naming of array and struct parameters // automatically, we have to do it by hand var desc = constantTable.GetConstantDescription( constant ); var paramName = desc.Name; // trim the odd '$' which appears at the start of the names in HLSL if ( paramName.StartsWith( "$" ) ) { paramName = paramName.Remove( 0, 1 ); } // Also trim the '[0]' suffix if it exists, we will add our own indexing later if (paramName.EndsWith("[0]")) { paramName.Remove( paramName.Length - 3 ); } if (desc.Class == ParameterClass.Struct) { // work out a new prefix for the nextest members if its an array, we need the index prefix = prefix + paramName + "."; // Cascade into struct for (var i = 0; i < desc.StructMembers; ++i) { ProcessParamElement(constantTable, constant, prefix, i); } } else { // process params if ( desc.Type == ParameterType.Float || desc.Type == ParameterType.Int || desc.Type == ParameterType.Bool ) { var paramIndex = desc.RegisterIndex; var name = prefix + paramName; var def = new GpuProgramParameters.GpuConstantDefinition(); def.LogicalIndex = paramIndex; // populate type, array size & element size PopulateDef( desc, def ); if ( def.IsFloat ) { def.PhysicalIndex = floatLogicalToPhysical.BufferSize; lock ( floatLogicalToPhysical.Mutex ) { floatLogicalToPhysical.Map.Add( paramIndex, new GpuProgramParameters.GpuLogicalIndexUse( def.PhysicalIndex, def.ArraySize*def.ElementSize, GpuProgramParameters.GpuParamVariability.Global ) ); floatLogicalToPhysical.BufferSize += def.ArraySize*def.ElementSize; } } else { def.PhysicalIndex = intLogicalToPhysical.BufferSize; lock ( intLogicalToPhysical.Mutex ) { intLogicalToPhysical.Map.Add( paramIndex, new GpuProgramParameters.GpuLogicalIndexUse( def.PhysicalIndex, def.ArraySize*def.ElementSize, GpuProgramParameters.GpuParamVariability.Global ) ); intLogicalToPhysical.BufferSize += def.ArraySize*def.ElementSize; } } if ( !parametersMap.ContainsKey( paramName ) ) { parametersMap.Add( paramName, def ); /* parametersMapSizeAsBuffer += sizeof ( int ); parametersMapSizeAsBuffer += paramName.Length; parametersMapSizeAsBuffer += Marshal.SizeOf( def ); */ } } } }
public void Read(ReaderContext ctxt) { var reader = ctxt.GetTablesReader(); var actualReserved0 = reader.ReadUInt32(); if (actualReserved0 != reserved0) throw new PEException("invalid MetadataTable header"); var actualMajorVersion = reader.ReadByte(); if (actualMajorVersion != majorVersion) throw new PEException("invalid MetadataTable header"); var actualMinorVersion = reader.ReadByte(); if (actualMinorVersion != minorVersion) throw new PEException("invalid MetadataTable header"); var heapSizes = reader.ReadByte(); IsStringStreamBig = (heapSizes & 0x01) != 0; IsGuidStreamBig = (heapSizes & 0x02) != 0; IsBlobStreamBig = (heapSizes & 0x04) != 0; Reserved1 = reader.ReadByte(); var valid = new IntSet64(reader.ReadUInt64()); var sorted = new IntSet64(reader.ReadUInt64()); for (var i = 0; i < 64; i++) { var numRows = 0; if (valid[i]) numRows = (int)reader.ReadUInt32(); switch ((TableTag)i) { case TableTag.Module: ModuleTable = new ModuleTable(numRows); break; case TableTag.Assembly: AssemblyTable = new AssemblyTable(numRows); break; case TableTag.AssemblyOS: AssemblyOSTable = new AssemblyOSTable(numRows); break; case TableTag.AssemblyProcessor: AssemblyProcessorTable = new AssemblyProcessorTable(numRows); break; case TableTag.AssemblyRef: AssemblyRefTable = new AssemblyRefTable(numRows); break; case TableTag.AssemblyRefOS: AssemblyRefOSTable = new AssemblyRefOSTable(numRows); break; case TableTag.AssemblyRefProcessor: AssemblyRefProcessorTable = new AssemblyRefProcessorTable(numRows); break; case TableTag.ClassLayout: ClassLayoutTable = new ClassLayoutTable(numRows); break; case TableTag.Constant: ConstantTable = new ConstantTable(numRows); break; case TableTag.CustomAttribute: CustomAttributeTable = new CustomAttributeTable(numRows); break; case TableTag.DeclSecurity: DeclSecurityTable = new DeclSecurityTable(numRows); break; case TableTag.EventMap: EventMapTable = new EventMapTable(numRows); break; case TableTag.Event: EventTable = new EventTable(numRows); break; case TableTag.ExportedType: ExportedTypeTable = new ExportedTypeTable(numRows); break; case TableTag.Field: FieldTable = new FieldTable(numRows); break; case TableTag.FieldLayout: FieldLayoutTable = new FieldLayoutTable(numRows); break; case TableTag.FieldMarshal: FieldMarshalTable = new FieldMarshalTable(numRows); break; case TableTag.FieldRVA: FieldRVATable = new FieldRVATable(numRows); break; case TableTag.File: FileTable = new FileTable(numRows); break; case TableTag.GenericParam: GenericParamTable = new GenericParamTable(numRows); break; case TableTag.GenericParamConstraint: GenericParamConstraintTable = new GenericParamConstraintTable(numRows); break; case TableTag.ImplMap: ImplMapTable = new ImplMapTable(numRows); break; case TableTag.InterfaceImpl: InterfaceImplTable = new InterfaceImplTable(numRows); break; case TableTag.ManifestResource: ManifestResourceTable = new ManifestResourceTable(numRows); break; case TableTag.MemberRef: MemberRefTable = new MemberRefTable(numRows); break; case TableTag.MethodDef: MethodDefTable = new MethodDefTable(numRows); break; case TableTag.MethodImpl: MethodImplTable = new MethodImplTable(numRows); break; case TableTag.MethodSemantics: MethodSemanticsTable = new MethodSemanticsTable(numRows); break; case TableTag.MethodSpec: MethodSpecTable = new MethodSpecTable(numRows); break; case TableTag.ModuleRef: ModuleRefTable = new ModuleRefTable(numRows); break; case TableTag.NestedClass: NestedClassTable = new NestedClassTable(numRows); break; case TableTag.Param: ParamTable = new ParamTable(numRows); break; case TableTag.Property: PropertyTable = new PropertyTable(numRows); break; case TableTag.PropertyMap: PropertyMapTable = new PropertyMapTable(numRows); break; case TableTag.StandAloneSig: StandAloneSigTable = new StandAloneSigTable(numRows); break; case TableTag.TypeDef: TypeDefTable = new TypeDefTable(numRows); break; case TableTag.TypeRef: TypeRefTable = new TypeRefTable(numRows); break; case TableTag.TypeSpec: TypeSpecTable = new TypeSpecTable(numRows); break; default: // Ignore break; } } DetermineIndexCodingSizes(); for (var i = 0; i < 64; i++) { if (valid[i]) { switch ((TableTag)i) { case TableTag.Module: ModuleTable.Read(ctxt, reader); break; case TableTag.Assembly: AssemblyTable.Read(ctxt, reader); break; case TableTag.AssemblyOS: AssemblyOSTable.Read(ctxt, reader); break; case TableTag.AssemblyProcessor: AssemblyProcessorTable.Read(ctxt, reader); break; case TableTag.AssemblyRef: AssemblyRefTable.Read(ctxt, reader); break; case TableTag.AssemblyRefOS: AssemblyRefOSTable.Read(ctxt, reader); break; case TableTag.AssemblyRefProcessor: AssemblyRefProcessorTable.Read(ctxt, reader); break; case TableTag.ClassLayout: ClassLayoutTable.Read(ctxt, reader); break; case TableTag.Constant: ConstantTable.Read(ctxt, reader); break; case TableTag.CustomAttribute: CustomAttributeTable.Read(ctxt, reader); break; case TableTag.DeclSecurity: DeclSecurityTable.Read(ctxt, reader); break; case TableTag.EventMap: EventMapTable.Read(ctxt, reader); break; case TableTag.Event: EventTable.Read(ctxt, reader); break; case TableTag.ExportedType: ExportedTypeTable.Read(ctxt, reader); break; case TableTag.Field: FieldTable.Read(ctxt, reader); break; case TableTag.FieldLayout: FieldLayoutTable.Read(ctxt, reader); break; case TableTag.FieldMarshal: FieldMarshalTable.Read(ctxt, reader); break; case TableTag.FieldRVA: FieldRVATable.Read(ctxt, reader); break; case TableTag.File: FileTable.Read(ctxt, reader); break; case TableTag.GenericParam: GenericParamTable.Read(ctxt, reader); break; case TableTag.GenericParamConstraint: GenericParamConstraintTable.Read(ctxt, reader); break; case TableTag.ImplMap: ImplMapTable.Read(ctxt, reader); break; case TableTag.InterfaceImpl: InterfaceImplTable.Read(ctxt, reader); break; case TableTag.ManifestResource: ManifestResourceTable.Read(ctxt, reader); break; case TableTag.MemberRef: MemberRefTable.Read(ctxt, reader); break; case TableTag.MethodDef: MethodDefTable.Read(ctxt, reader); break; case TableTag.MethodImpl: MethodImplTable.Read(ctxt, reader); break; case TableTag.MethodSemantics: MethodSemanticsTable.Read(ctxt, reader); break; case TableTag.MethodSpec: MethodSpecTable.Read(ctxt, reader); break; case TableTag.ModuleRef: ModuleRefTable.Read(ctxt, reader); break; case TableTag.NestedClass: NestedClassTable.Read(ctxt, reader); break; case TableTag.Param: ParamTable.Read(ctxt, reader); break; case TableTag.Property: PropertyTable.Read(ctxt, reader); break; case TableTag.PropertyMap: PropertyMapTable.Read(ctxt, reader); break; case TableTag.StandAloneSig: StandAloneSigTable.Read(ctxt, reader); break; case TableTag.TypeDef: TypeDefTable.Read(ctxt, reader); break; case TableTag.TypeRef: TypeRefTable.Read(ctxt, reader); break; case TableTag.TypeSpec: TypeSpecTable.Read(ctxt, reader); break; default: throw new PEException("unexpected table tag in MetadataTable body"); } } } ModuleTable.ResolveIndexes(ctxt); TypeRefTable.ResolveIndexes(ctxt); TypeDefTable.ResolveIndexes(ctxt); FieldTable.ResolveIndexes(ctxt); MethodDefTable.ResolveIndexes(ctxt); ParamTable.ResolveIndexes(ctxt); InterfaceImplTable.ResolveIndexes(ctxt); MemberRefTable.ResolveIndexes(ctxt); ConstantTable.ResolveIndexes(ctxt); CustomAttributeTable.ResolveIndexes(ctxt); FieldMarshalTable.ResolveIndexes(ctxt); DeclSecurityTable.ResolveIndexes(ctxt); ClassLayoutTable.ResolveIndexes(ctxt); FieldLayoutTable.ResolveIndexes(ctxt); StandAloneSigTable.ResolveIndexes(ctxt); EventMapTable.ResolveIndexes(ctxt); EventTable.ResolveIndexes(ctxt); PropertyMapTable.ResolveIndexes(ctxt); PropertyTable.ResolveIndexes(ctxt); MethodSemanticsTable.ResolveIndexes(ctxt); MethodImplTable.ResolveIndexes(ctxt); ModuleRefTable.ResolveIndexes(ctxt); TypeSpecTable.ResolveIndexes(ctxt); ImplMapTable.ResolveIndexes(ctxt); FieldRVATable.ResolveIndexes(ctxt); AssemblyTable.ResolveIndexes(ctxt); AssemblyProcessorTable.ResolveIndexes(ctxt); AssemblyOSTable.ResolveIndexes(ctxt); AssemblyRefTable.ResolveIndexes(ctxt); AssemblyRefProcessorTable.ResolveIndexes(ctxt); AssemblyRefOSTable.ResolveIndexes(ctxt); FileTable.ResolveIndexes(ctxt); ExportedTypeTable.ResolveIndexes(ctxt); ManifestResourceTable.ResolveIndexes(ctxt); NestedClassTable.ResolveIndexes(ctxt); GenericParamTable.ResolveIndexes(ctxt); MethodSpecTable.ResolveIndexes(ctxt); GenericParamConstraintTable.ResolveIndexes(ctxt); }
public void Run(OpsContext context, OpsStatement statement) { ShadeArgs args = statement.Arguments as ShadeArgs; ConstantTable constantTable = SetupDevice(context, args); EffectHandle hTarget = constantTable.GetConstant(null, "Target"); ArrayList containers = statement.GetContent(context); OpsConsole.WriteLine("Shading textures with \"{0}\"", args.File); foreach (OpsTexture container in containers) { if (hTarget != null) { context.Device.SetTexture( constantTable.GetSamplerIndex(hTarget), container.Texture); } if (container.Texture is Texture) { Texture oldTexture = container.Texture as Texture; Texture newTexture = OpsTextureHelper.CloneTexture(oldTexture, Usage.None, Pool.Managed); for (int mip = 0; mip < oldTexture.LevelCount; mip++) { SurfaceDescription sd = oldTexture.GetLevelDescription(mip); CheckFormatValid(sd.Format); Surface rt = context.Device.CreateRenderTarget(sd.Width, sd.Height, sd.Format, MultiSampleType.None, 0, true); context.Device.SetRenderTarget(0, rt); ShadeVertex[] vb = new ShadeVertex[] { ShadeVertex.ForTexture(-1.0f, -1.0f, sd.Width, sd.Height), ShadeVertex.ForTexture(1.0f, -1.0f, sd.Width, sd.Height), ShadeVertex.ForTexture(-1.0f, 1.0f, sd.Width, sd.Height), ShadeVertex.ForTexture(1.0f, 1.0f, sd.Width, sd.Height), }; context.Device.BeginScene(); context.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, vb); context.Device.EndScene(); context.Device.SetRenderTarget(0, context.Device.GetBackBuffer(0, 0, BackBufferType.Mono)); SurfaceLoader.FromSurface(newTexture.GetSurfaceLevel(mip), rt, Filter.None | (container.SRGB?Filter.SrgbOut:0), 0); } oldTexture.Dispose(); container.Texture = newTexture; } else if (container.Texture is VolumeTexture) { VolumeTexture oldTexture = container.Texture as VolumeTexture; VolumeTexture newTexture = OpsTextureHelper.CloneVolume(oldTexture, Usage.None, Pool.Managed); for (int mip = 0; mip < oldTexture.LevelCount; mip++) { VolumeDescription vd = oldTexture.GetLevelDescription(mip); CheckFormatValid(vd.Format); Surface sliceRT = context.Device.CreateRenderTarget(vd.Width, vd.Height, vd.Format, MultiSampleType.None, 0, true); for (int slice = 0; slice < vd.Depth; slice++) { context.Device.SetRenderTarget(0, sliceRT); ShadeVertex[] vb = new ShadeVertex[] { ShadeVertex.ForVolume(-1.0f, -1.0f, slice, vd.Width, vd.Height, vd.Depth), ShadeVertex.ForVolume(1.0f, -1.0f, slice, vd.Width, vd.Height, vd.Depth), ShadeVertex.ForVolume(-1.0f, 1.0f, slice, vd.Width, vd.Height, vd.Depth), ShadeVertex.ForVolume(1.0f, 1.0f, slice, vd.Width, vd.Height, vd.Depth), }; context.Device.BeginScene(); context.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, vb); context.Device.EndScene(); context.Device.SetRenderTarget(0, context.Device.GetBackBuffer(0, 0, BackBufferType.Mono)); OpsTextureHelper.LoadVolumeSliceFromSurface(newTexture, mip, slice, Filter.None | (container.SRGB?Filter.SrgbOut:0), sliceRT); } sliceRT.Dispose(); } oldTexture.Dispose(); container.Texture = newTexture; } else if (container.Texture is CubeTexture) { CubeTexture oldTexture = container.Texture as CubeTexture; CubeTexture newTexture = OpsTextureHelper.CloneCube(oldTexture, Usage.None, Pool.Managed); for (int mip = 0; mip < oldTexture.LevelCount; mip++) { SurfaceDescription sd = oldTexture.GetLevelDescription(mip); CheckFormatValid(sd.Format); Surface rt = context.Device.CreateRenderTarget(sd.Width, sd.Height, sd.Format, MultiSampleType.None, 0, true); RenderCubeMapFace(context, newTexture, rt, CubeMapFace.PositiveX, mip, sd.Width, container.SRGB); RenderCubeMapFace(context, newTexture, rt, CubeMapFace.PositiveY, mip, sd.Width, container.SRGB); RenderCubeMapFace(context, newTexture, rt, CubeMapFace.PositiveZ, mip, sd.Width, container.SRGB); RenderCubeMapFace(context, newTexture, rt, CubeMapFace.NegativeX, mip, sd.Width, container.SRGB); RenderCubeMapFace(context, newTexture, rt, CubeMapFace.NegativeY, mip, sd.Width, container.SRGB); RenderCubeMapFace(context, newTexture, rt, CubeMapFace.NegativeZ, mip, sd.Width, container.SRGB); } oldTexture.Dispose(); container.Texture = newTexture; } } }