/// <summary> /// Generates local parameters for the split parameters and perform packing/unpacking operation using them. /// </summary> /// <param name="fun"> </param> /// <param name="progType"> </param> /// <param name="mergedParams"> </param> /// <param name="splitParams"> </param> /// <param name="localParamsMap"> </param> internal static void GenerateLocalSplitParameters( Function func, GpuProgramType progType, List<MergeParameter> mergedParams, List<Parameter> splitParams, Dictionary<Parameter, Parameter> localParamsMap ) { //No split params created. if ( splitParams.Count == 0 ) { return; } //Create the local parameters + map from source to local for ( int i = 0; i < splitParams.Count; i++ ) { Parameter srcParameter = splitParams[ i ]; Parameter localParameter = func.ResolveLocalParameter( srcParameter.Semantic, srcParameter.Index, "lssplit_" + srcParameter.Name, srcParameter.Type ); localParamsMap.Add( srcParameter, localParameter ); } int invocationCounter = 0; //Establish link between the local parameter to the merged parameter. for ( int i = 0; i < mergedParams.Count; i++ ) { var curMergeParameter = mergedParams[ i ]; for ( int p = 0; p < curMergeParameter.SourceParameterCount; p++ ) { Parameter srcMergedParameter = curMergeParameter.SourceParameter[ p ]; if ( localParamsMap.ContainsKey( srcMergedParameter ) ) { //Case it is the vertex shader -> assign the local parameter to the output merged parameter if ( progType == GpuProgramType.Vertex ) { var curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, (int) FFPRenderState.FFPVertexShaderStage. VSPostProcess, invocationCounter++ ); curFuncInvocation.PushOperand( localParamsMap[ srcMergedParameter ], Operand.OpSemantic.In, curMergeParameter.GetSourceParameterMask( p ) ); curFuncInvocation.PushOperand( curMergeParameter.GetDestinationParameter( (int)Operand.OpSemantic.Out, i ), Operand.OpSemantic.Out, curMergeParameter.GetDestinationParameterMask( p ) ); func.AddAtomInstance( curFuncInvocation ); } else if ( progType == GpuProgramType.Fragment ) { var curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, (int) FFPRenderState.FFPFragmentShaderStage. PSPreProcess, invocationCounter++ ); curFuncInvocation.PushOperand( curMergeParameter.GetDestinationParameter( (int)Operand.OpSemantic.In, i ), Operand.OpSemantic.In, curMergeParameter.GetDestinationParameterMask( p ) ); curFuncInvocation.PushOperand( localParamsMap[ srcMergedParameter ], Operand.OpSemantic.Out, curMergeParameter.GetSourceParameterMask( p ) ); func.AddAtomInstance( curFuncInvocation ); } } } } }