コード例 #1
0
ファイル: Registers.cs プロジェクト: ARLM-Attic/xna-xen
        public ShaderRegisters(SourceShader source, string techniqueName, Platform platform)
        {
            AsmTechnique technique = source.GetAsmTechnique(techniqueName, platform);

            vsReg = technique.VertexShader.RegisterSet;
            psReg = technique.PixelShader.RegisterSet;


            if (technique.VertexPreShader != null)
            {
                vsPreReg = technique.VertexPreShader.RegisterSet;
            }

            if (technique.PixelPreShader != null)
            {
                psPreReg = technique.PixelPreShader.RegisterSet;
            }

            staticArrays = new Dictionary <string, CodeExpression>();

            if (technique.TechniqueExtraData != null)
            {
                this.techniqueData = technique.TechniqueExtraData;

                psDefault = technique.TechniqueExtraData.PixelShaderConstants;
                vsDefault = technique.TechniqueExtraData.VertexShaderConstants;

                psBooleanDefault = technique.TechniqueExtraData.PixelShaderBooleanConstants;
                vsBooleanDefault = technique.TechniqueExtraData.VertexShaderBooleanConstants;
            }
        }
コード例 #2
0
ファイル: Registers.cs プロジェクト: ARLM-Attic/xna-xen
        private CodeExpression GeneratePreShaderFloatDefaults(TechniqueExtraData defaults, RegisterSet registers, int count, CompileDirectives directives, out int offset)
        {
            offset = 0;
            if (count == 0 || defaults == null)
            {
                return(null);
            }

            Vector4[] constants = new Vector4[count];
            bool      set       = false;

            foreach (KeyValuePair <string, Vector4[]> entry in defaults.DefaultSingleValues)
            {
                Register reg;
                if (registers.TryGetRegister(entry.Key, out reg))
                {
                    if (reg.Category == RegisterCategory.Float4)
                    {
                        for (int i = 0; i < Math.Max(1, reg.ArraySize) && i < entry.Value.Length && i < count - reg.Index; i++)
                        {
                            constants[i + reg.Index] = entry.Value[i];
                            set = true;
                        }
                    }
                }
            }

            if (!set)
            {
                return(null);
            }
            return(InitaliseConstants(count, constants, directives, out offset));
        }
コード例 #3
0
        public ShaderTextures(SourceShader source, string techniqueName, Platform platform)
        {
            this.psSamplers  = new List <Register>();
            this.vsSamplers  = new List <Register>();
            this.allSamplers = new Dictionary <string, SharedSampler>();

            AsmTechnique       technique = source.GetAsmTechnique(techniqueName, platform);
            TechniqueExtraData extras    = technique.TechniqueExtraData;

            //pull out the textures that will be used
            textures = new TextureAssociation[extras.TechniqueTextures.Length];
            for (int i = 0; i < extras.TechniqueTextures.Length; i++)
            {
                textures[i] = new TextureAssociation(extras.TechniqueTextures[i]);
            }

            //now do the samplers
            RegisterSet set = technique.PixelShader.RegisterSet;

            //pixel first
            foreach (Register reg in set)
            {
                if (reg.Category == RegisterCategory.Sampler)
                {
                    psSamplers.Add(reg);

                    int textureIndex = extras.PixelSamplerTextureIndex[reg.Index];

                    if (textureIndex == -1)
                    {
                        ThrowSamplerNoTextureException(reg);
                    }

                    textures[textureIndex].PsSamplers.Add(reg.Index);

                    //add the sampler to 'allSamplers'
                    SharedSampler ss = new SharedSampler();
                    ss.PsIndex        = reg.Index;
                    ss.SamplerDetails = reg;
                    ss.Index          = allSamplers.Count;
                    ss.DefaultState   = extras.PixelSamplerStates[reg.Index];
                    allSamplers.Add(reg.Name, ss);
                }
            }

            set = technique.VertexShader.RegisterSet;

            //now vertex
            foreach (Register reg in set)
            {
                if (reg.Category == RegisterCategory.Sampler)
                {
                    vsSamplers.Add(reg);

                    int textureIndex = extras.VertexSamplerTextureIndex[reg.Index];
                    if (textureIndex == -1)
                    {
                        ThrowSamplerNoTextureException(reg);
                    }

                    textures[textureIndex].VsSamplers.Add(reg.Index);

                    //add the sampler to 'allSamplers'
                    SharedSampler ss;
                    if (!allSamplers.TryGetValue(reg.Name, out ss))
                    {
                        ss = new SharedSampler();
                        ss.SamplerDetails = reg;
                        ss.Index          = allSamplers.Count;
                        ss.DefaultState   = extras.VertexSamplerStates[reg.Index];
                        allSamplers.Add(reg.Name, ss);
                    }
                    ss.VsIndex = reg.Index;
                }
            }
        }