public ExecutionContext(VirtualMachine virtualMachine, int index, RequiredRegisters requiredRegisters) { _virtualMachine = virtualMachine; Index = index; Inputs = new Number4[requiredRegisters.NumPrimitives][]; for (int i = 0; i < requiredRegisters.NumPrimitives; i++) { Inputs[i] = new Number4[requiredRegisters.Inputs]; } Outputs = new Number4[requiredRegisters.Outputs]; Temps = new Number4[requiredRegisters.Temps]; IndexableTemps = new Number4[requiredRegisters.IndexableTemps.Count][]; for (int i = 0; i < requiredRegisters.IndexableTemps.Count; i++) { IndexableTemps[i] = new Number4[requiredRegisters.IndexableTemps[i]]; } }
public VirtualMachine(BytecodeContainer bytecode, int numContexts) { if (bytecode.Shader.Version.ProgramType == ProgramType.PixelShader && numContexts % 4 != 0) { throw new ArgumentOutOfRangeException("numContexts", "numContexts must be a multiple of 4 for pixel shaders."); } _bytecode = bytecode; var instructionTokens = bytecode.Shader.Tokens.OfType <InstructionToken>().ToArray(); var branchingInstructions = ExplicitBranchingRewriter.Rewrite(instructionTokens); var controlFlowGraph = ControlFlowGraph.FromInstructions(branchingInstructions); _executableInstructions = ExecutableInstructionRewriter.Rewrite(controlFlowGraph).ToArray(); _requiredRegisters = RequiredRegisters.FromShader(bytecode.Shader); _executionContexts = new ExecutionContext[numContexts]; for (int i = 0; i < _executionContexts.Length; i++) { _executionContexts[i] = new ExecutionContext(this, i, _requiredRegisters); } ConstantBuffers = new Number4[_requiredRegisters.ConstantBuffers.Count][]; for (int i = 0; i < _requiredRegisters.ConstantBuffers.Count; i++) { ConstantBuffers[i] = new Number4[_requiredRegisters.ConstantBuffers[i]]; } TextureSamplers = new TextureSampler[_requiredRegisters.Resources.Count]; for (int i = 0; i < _requiredRegisters.Resources.Count; i++) { TextureSamplers[i] = TextureSamplerFactory.Create(_requiredRegisters.Resources[i]); } Textures = new ITexture[_requiredRegisters.Resources.Count]; Samplers = new SamplerState[_requiredRegisters.Samplers]; }