Beispiel #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="prefix"></param>
        /// <param name="index"></param>
        /// <param name="parms"></param>
        protected void ProcessParamElement(D3D.EffectHandle parent, string prefix, int index, GpuProgramParameters parms)
        {
            D3D.EffectHandle 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
            D3D.ConstantDescription[] descs = constantTable.GetConstantDescription(constant, 1);
            D3D.ConstantDescription   desc  = descs[0];

            string paramName = desc.Name;

            // trim the odd '$' which appears at the start of the names in HLSL
            if (paramName.StartsWith("$"))
            {
                paramName = paramName.Remove(0, 1);
            }

            // If it's an array, elements will be > 1
            for (int e = 0; e < desc.Elements; e++)
            {
                if (desc.Class == ParameterClass.Struct)
                {
                    // work out a new prefix for the nextest members
                    // if its an array, we need the index
                    if (desc.Elements > 1)
                    {
                        prefix += string.Format("{0}[{1}].", paramName, e);
                    }
                    else
                    {
                        prefix += ".";
                    }

                    // cascade into the struct members
                    for (int i = 0; i < desc.StructMembers; i++)
                    {
                        ProcessParamElement(constant, prefix, i, parms);
                    }
                }
                else
                {
                    // process params
                    if (desc.ParameterType == ParameterType.Float ||
                        desc.ParameterType == ParameterType.Integer ||
                        desc.ParameterType == ParameterType.Boolean)
                    {
                        int    paramIndex = desc.RegisterIndex;
                        string newName    = prefix + paramName;

                        // if this is an array, we need to appent the element index
                        if (desc.Elements > 1)
                        {
                            newName += string.Format("[{0}]", e);
                        }

                        // map the named param to the index
                        parms.MapParamNameToIndex(newName, paramIndex + e);
                    }
                }
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="parms"></param>
        protected override void PopulateParameterNames(GpuProgramParameters parms)
        {
            Debug.Assert(cgProgram != IntPtr.Zero);

            // Note use of 'leaf' format so we only get bottom-level params, not structs
            IntPtr param = Cg.cgGetFirstLeafParameter(cgProgram, Cg.CG_PROGRAM);

            int index = 0;

            // loop through the rest of the params
            while (param != IntPtr.Zero)
            {
                // get the type of this param up front
                int paramType = Cg.cgGetParameterType(param);

                // Look for uniform parameters only
                // Don't bother enumerating unused parameters, especially since they will
                // be optimized out and therefore not in the indexed versions
                if (Cg.cgIsParameterReferenced(param) != 0 &&
                    Cg.cgGetParameterVariability(param) == Cg.CG_UNIFORM &&
                    Cg.cgGetParameterDirection(param) != Cg.CG_OUT &&
                    paramType != Cg.CG_SAMPLER1D &&
                    paramType != Cg.CG_SAMPLER2D &&
                    paramType != Cg.CG_SAMPLER3D &&
                    paramType != Cg.CG_SAMPLERCUBE &&
                    paramType != Cg.CG_SAMPLERRECT)
                {
                    // get the name and index of the program param
                    string name = Cg.cgGetParameterName(param);

                    // fp30 uses named rather than indexed params, so Cg returns
                    // 0 for the index. However, we need the index to be unique here
                    // Resource type 3256 doesn't have a define in the Cg header, so I assume
                    // it means an unused or non-indexed params, since it is also returned
                    // for programs that have a param that is not referenced in the program
                    // and ends up getting pruned by the Cg compiler
                    if (selectedCgProfile == Cg.CG_PROFILE_FP30)
                    {
                        // use a fake index just to order the named fp30 params
                        index++;
                    }
                    else
                    {
                        // get the param constant index the normal way
                        index = Cg.cgGetParameterResourceIndex(param);
                    }

                    // get the underlying resource type of this param
                    // we need a special case for the register combiner
                    // stage constants.
                    int resource = Cg.cgGetParameterResource(param);

                    // Get the parameter resource, so we know what type we're dealing with
                    switch (resource)
                    {
                    case Cg.CG_COMBINER_STAGE_CONST0:
                        // register combiner, const 0
                        // the index relates to the texture stage; store this as (stage * 2) + 0
                        index = index * 2;
                        break;

                    case Cg.CG_COMBINER_STAGE_CONST1:
                        // register combiner, const 1
                        // the index relates to the texture stage; store this as (stage * 2) + 1
                        index = (index * 2) + 1;
                        break;
                    }

                    // map the param to the index
                    parms.MapParamNameToIndex(name, index);
                }

                // get the next param
                param = Cg.cgGetNextLeafParameter(param);
            }
        }