Axiom.RenderSystems.OpenGL.ATI.PixelShader.Pass2scan C# (CSharp) Method

Pass2scan() private method

private Pass2scan ( Axiom.RenderSystems.OpenGL.ATI.TokenInstruction Tokens, int size ) : bool
Tokens Axiom.RenderSystems.OpenGL.ATI.TokenInstruction
size int
return bool
		bool Pass2scan( TokenInstruction[] Tokens, int size )
		{
			// execute TokenInstructions to build MachineInstructions
			bool passed = true;
			SymbolDef cursymboldef;
			Symbol ActiveNTTRuleID;

			ClearMachineInstState();

			// iterate through all the tokens and build machine instruction
			// for each machine instruction need: optype, opinst, and up to 5 parameters
			for ( int i = 0; i < size; i++ )
			{
				// lookup instruction type in library
				cursymboldef = symbolTypeLib[ (int)Tokens[ i ].ID ];
				ActiveNTTRuleID = (Symbol)Tokens[ i ].NTTRuleID;
				currentLine = Tokens[ i ].line;
				charPos = Tokens[ i ].pos;

				switch ( ActiveNTTRuleID )
				{
					case Symbol.CONSTANT:
					case Symbol.COLOR:
					case Symbol.REG_PS1_4:
					case Symbol.TEX_PS1_4:
					case Symbol.REG_PS1_1_3:
					case Symbol.TEX_PS1_1_3:
						// registars can be used for read and write so they can be used for dst and arg
						passed = SetOpParam( cursymboldef );
						break;

					case Symbol.DEFCONST:
					case Symbol.UNARYOP:
					case Symbol.BINARYOP:
					case Symbol.TERNARYOP:
					case Symbol.TEXOP_PS1_1_3:
					case Symbol.TEXOP_PS1_4:
					case Symbol.PHASEMARKER:
					case Symbol.TEXCISCOP_PS1_1_3:
						// if the last instruction has not been passed on then do it now
						// make sure the pipe is clear for a new instruction
						BuildMachineInst();
						if ( opInst == Symbol.Invalid )
						{
							opInst = cursymboldef.ID;
						}
						else
						{
							passed = false;
						}
						break;

					case Symbol.DSTMASK:
					case Symbol.SRCREP:
					case Symbol.TEXSWIZZLE:
						// could be a dst mask or a arg replicator
						// if dst mask and alpha included then make up a alpha instruction: maybe best to wait until instruction args completed
						opParams[ argCnt ].MaskRep = (uint)cursymboldef.pass2Data;
						break;

					case Symbol.DSTMOD:
					case Symbol.DSTSAT:
					case Symbol.PRESRCMOD:
					case Symbol.POSTSRCMOD:
						opParams[ argCnt ].Mod |= cursymboldef.pass2Data;
						break;

					case Symbol.NUMVAL:
						passed = SetOpParam( cursymboldef );
						// keep track of how many values are used
						// update Constants array position
						constantsPos++;
						break;

					case Symbol.SEPERATOR:
						argCnt++;
						break;
				} // end of switch

				if ( !passed )
				{
					break;
				}
			}// end of for: i<TokenInstCnt

			// check to see if there is still an instruction left in the pipe
			if ( passed )
			{
				BuildMachineInst();
				// if there are no more instructions in the pipe than OpInst should be invalid
				if ( opInst != Symbol.Invalid )
				{
					passed = false;
				}
			}

			return passed;
		}