Esempio n. 1
0
        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]];
            }
        }
Esempio n. 2
0
        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];
        }