Esempio n. 1
0
        public static string ToHlsl(this SourceDescription desc)
        {
            var s = new StringBuilder();

            // define uniforms
            desc.Uniforms.ForEach(
                v =>
            {
                var typ = v.Type.ToHlsl();
                if (v.IsSampler() && v.DefaultRegister.HasValue)
                {
                    // allocate a register for it
                    s.AppendFormat("uniform extern {0} {1} : register(s{3});{2}", typ, v.Name, v.Comment, v.DefaultRegister.Value).Append(Environment.NewLine);
                }
                else
                {
                    s.AppendFormat("uniform extern {0} {1};{2}", typ, v.Name, v.Comment).Append(Environment.NewLine);
                }
            });

            // expose varyings inputs and outputs as globals for unified access
            // through all functions

            var statics = desc.Varyings.Concat(desc.VertexIns).Concat(desc.FragmentOuts);

            foreach (var v in statics)
            {
                s.AppendFormat("static {0} {1};{2}", v.Type.ToHlsl(), v.Name, v.Comment).Append(Environment.NewLine);
            }

            s.AppendLine();


            var vmain = desc.VertexMain();
            var fmain = desc.FragmentMain();

            desc.ForwardDecl.ForEach(v => s.AppendLine(v));
            s.AppendLine();
            desc.Functions.ForEach(v => s.AppendLine(v.Body));

            // generate vertex input struct
            if (vmain != null)
            {
                s.AppendLine("struct SLSharp_VertexIn");
                s.AppendLine("{");
                desc.VertexIns.ForEach(
                    v => s.AppendFormat("    {0} {1}: {2};", v.Type.ToHlsl(), v.Name, v.Semantic.ToHlsl()).AppendLine());
                s.AppendLine("};");
                s.AppendLine();

                s.AppendLine("struct SLSharp_VertexOut");
                s.AppendLine("{");
                GenerateVaryingStruct(s, desc);
                s.AppendLine("};");
                s.AppendLine();

                s.AppendLine("SLSharp_VertexOut SLSharp_VertexMain(SLSharp_VertexIn input)");
                s.AppendLine("{");
                s.AppendLine("    SLSharp_VertexOut output;");
                // initialize globals from input
                desc.VertexIns.ForEach(v => s.AppendFormat("    {0} = input.{1};", v.Name, v.Name).AppendLine());
                // call entrypoint
                s.AppendFormat("    {0}();", vmain.Name).AppendLine();
                // write back results from globals
                desc.Varyings.ForEach(v => s.AppendFormat("    output.{0} = {1};", v.Name, v.Name).AppendLine());
                s.AppendLine("    return output;");
                s.AppendLine("}");
            }

            if (fmain != null)
            {
                s.AppendLine("struct SLSharp_FragmentIn");
                s.AppendLine("{");
                GenerateVaryingStruct(s, desc);
                s.AppendLine("};");
                s.AppendLine();

                s.AppendLine("struct SLSharp_FragmentOut");
                s.AppendLine("{");
                desc.FragmentOuts.ForEach(
                    v => s.AppendFormat("    {0} {1}: {2};", v.Type.ToHlsl(), v.Name, v.Semantic.ToHlsl()).AppendLine());
                s.AppendLine("};");
                s.AppendLine();

                s.AppendLine("SLSharp_FragmentOut SLSharp_FragmentMain(SLSharp_FragmentIn input)");
                s.AppendLine("{");
                s.AppendLine("    SLSharp_FragmentOut output;");
                // initialize globals from input
                desc.Varyings.ForEach(v => s.AppendFormat("    {0} = input.{1};", v.Name, v.Name).AppendLine());
                // call entrypoint
                s.AppendFormat("    {0}();", fmain.Name).AppendLine();
                // write back results from globals
                desc.FragmentOuts.ForEach(v => s.AppendFormat("    output.{0} = {1};", v.Name, v.Name).AppendLine());
                s.AppendLine("    return output;");
                s.AppendLine("}");
            }
            return(s.ToString());
        }