Example #1
0
        private bool CreateGpuPrograms(ProgramSet programSet)
        {
            // Before we start we need to make sure that the pixel shader input
            //  parameters are the same as the vertex output, this required by
            //  shader models 4 and 5.
            // This change may incrase the number of register used in older shader
            //  models - this is why the check is present here.
            bool isVs4 = GpuProgramManager.Instance.IsSyntaxSupported("vs_4_0");

            if (isVs4)
            {
                SynchronizePixelnToBeVertexOut(programSet);
            }

            //Grab the matching writer
            string        language      = ShaderGenerator.Instance.TargetLangauge;
            ProgramWriter programWriter = null;

            if (this.programWritersMap.ContainsKey(language))
            {
                programWriter = this.programWritersMap[language];
            }
            else
            {
                programWriter = ProgramWriterManager.Instance.CreateProgramWriter(language);
                this.programWritersMap.Add(language, programWriter);
            }

            ProgramProcessor programProcessor = null;

            if (this.programProcessorMap.ContainsKey(language) == false)
            {
                throw new AxiomException("Could not find processor for language " + language);
            }

            programProcessor = this.programProcessorMap[language];


            bool success;

            //Call the pre creation of GPU programs method
            success = programProcessor.PreCreateGpuPrograms(programSet);
            if (success == false)
            {
                return(false);
            }

            //Create the vertex shader program
            GpuProgram vsGpuProgram;

            vsGpuProgram = CreateGpuProgram(programSet.CpuVertexProgram, programWriter, language,
                                            ShaderGenerator.Instance.VertexShaderProfiles,
                                            ShaderGenerator.Instance.VertexShaderProfilesList,
                                            ShaderGenerator.Instance.ShaderChachePath);

            if (vsGpuProgram == null)
            {
                return(false);
            }

            programSet.GpuVertexProgram = vsGpuProgram;

            //update flags
            programSet.GpuVertexProgram.IsSkeletalAnimationIncluded =
                programSet.CpuVertexProgram.SkeletalAnimationIncluded;

            //Create the fragment shader program.
            GpuProgram psGpuProgram;

            psGpuProgram = CreateGpuProgram(programSet.CpuFragmentProgram, programWriter, language,
                                            ShaderGenerator.Instance.FragmentShaderProfiles,
                                            ShaderGenerator.Instance.FragmentShaderProfilesList,
                                            ShaderGenerator.Instance.ShaderChachePath);

            if (psGpuProgram == null)
            {
                return(false);
            }

            programSet.GpuFragmentProgram = psGpuProgram;

            //Call the post creation of GPU programs method.
            success = programProcessor.PostCreateGpuPrograms(programSet);
            if (success == false)
            {
                return(false);
            }

            return(true);
        }