From 711d4aa68b1713f26167c4fee560572118389cce Mon Sep 17 00:00:00 2001 From: Glatzemann Date: Tue, 15 Nov 2011 12:11:24 +0000 Subject: [PATCH] created StockShaderCodeGenerator tool (sscg) removed old shader files included sscg in pre-build events of RenderSystem DX10 and GL3 to generate shader files before compiling --- .../ANX.Framework.Windows.DX10.csproj | 3 + ANX.Framework.Windows.DX10/ShaderByteCode.cs | 199 +++++++------ .../ANX.Framework.Windows.GL3.csproj | 4 + ANX.Framework.Windows.GL3/ShaderByteCode.cs | 263 ++++++++++++++++++ ANX.Framework.sln | 1 + .../SampleContent/SampleContent.contentproj | 16 -- .../StockShaderCodeGenerator/CodeGenerator.cs | 126 +++++++++ Tools/StockShaderCodeGenerator/Compiler.cs | 115 ++++++++ .../StockShaderCodeGenerator/Configuration.cs | 165 +++++++++++ Tools/StockShaderCodeGenerator/Program.cs | 33 ++- .../Properties/AssemblyInfo.cs | 4 +- .../StockShaderCodeGenerator/Shader.cs | 58 ++-- .../StockShaderCodeGenerator.csproj | 18 ++ shader/DX10/SpriteBatch.fx | 87 ++++++ shader/DX10/build.xml | 9 + .../GL3/SpriteBatch_GLSL.fx | 1 + shader/GL3/build.xml | 9 + 17 files changed, 966 insertions(+), 145 deletions(-) create mode 100644 ANX.Framework.Windows.GL3/ShaderByteCode.cs create mode 100644 Tools/StockShaderCodeGenerator/CodeGenerator.cs create mode 100644 Tools/StockShaderCodeGenerator/Compiler.cs create mode 100644 Tools/StockShaderCodeGenerator/Configuration.cs rename Samples/SampleContent/Effects/SpriteEffect.fx => Tools/StockShaderCodeGenerator/Shader.cs (75%) rename Samples/SampleContent/Effects/SpriteEffect_GLSL.fx => shader/GL3/SpriteBatch_GLSL.fx (96%) diff --git a/ANX.Framework.Windows.DX10/ANX.Framework.Windows.DX10.csproj b/ANX.Framework.Windows.DX10/ANX.Framework.Windows.DX10.csproj index 8df5dec8..0b10fb20 100644 --- a/ANX.Framework.Windows.DX10/ANX.Framework.Windows.DX10.csproj +++ b/ANX.Framework.Windows.DX10/ANX.Framework.Windows.DX10.csproj @@ -88,6 +88,9 @@ + + "$(ProjectDir)../Tools/bin/sscg.exe" ../../shader/DX10/build.xml + compiling shader... "); + try + { + s.ByteCode = CompileShader(s.RenderSystem, source); + Console.WriteLine("{0} bytes compiled size", s.ByteCode.Length); + s.ShaderCompiled = true; + } + catch (Exception ex) + { + s.ShaderCompiled = false; + Console.WriteLine("--> error occured while compiling shader: {0}", ex.Message); + } + + Configuration.Shaders[i] = s; + } + + Console.WriteLine("finished generating shaders..."); + } + + private static Byte[] CompileShader(string RenderSystem, string sourceCode) + { + byte[] byteCode; + + switch (RenderSystem) + { + case "ANX.Framework.Windows.DX10": + byteCode = Effect_DX10.CompileFXShader(sourceCode); + break; + case "ANX.Framework.Windows.GL3": + byteCode = EffectGL3.CompileShader(sourceCode); + break; + default: + throw new NotImplementedException("compiling shaders for " + RenderSystem + " not yet implemented..."); + } + + return byteCode; + } + } +} diff --git a/Tools/StockShaderCodeGenerator/Configuration.cs b/Tools/StockShaderCodeGenerator/Configuration.cs new file mode 100644 index 00000000..d1addab7 --- /dev/null +++ b/Tools/StockShaderCodeGenerator/Configuration.cs @@ -0,0 +1,165 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Linq; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace StockShaderCodeGenerator +{ + public static class Configuration + { + private static string buildFileName; + private static bool configurationValid; + private static string licenseFile; + private static string target; + private static string outputNamespace; + public readonly static List Shaders = new List(); + + public static void LoadConfiguration(String file) + { + buildFileName = file; + + if (!System.IO.File.Exists(file)) + { + Console.WriteLine("Could not find build file..."); + return; + } + + XDocument doc = XDocument.Load(buildFileName); + if (doc.Root.Name.LocalName != "Build") + { + Console.WriteLine("Failed to load configuration because the build file has no Build-Node as the root element!"); + return; + } + else + { + if (doc.Root.HasAttributes) + { + licenseFile = doc.Root.Attribute("License").Value; + if (System.IO.File.Exists(licenseFile)) + { + Console.WriteLine("using license file '{0}' to include", licenseFile); + } + else + { + Console.WriteLine("license file '{0}' does not exist", licenseFile); + return; + } + + target = doc.Root.Attribute("Target").Value; + Console.WriteLine("writing output to '{0}'", target); + + outputNamespace = doc.Root.Attribute("Namespace").Value; + Console.WriteLine("using namespace '{0}'", outputNamespace); + } + + if (doc.Root.HasElements) + { + XElement[] shaderElements = doc.Root.Elements("Shader").ToArray(); + + if (shaderElements.Length > 0) + { + foreach (XElement shaderElement in shaderElements) + { + Shader shader = new Shader(); + shader.Type = shaderElement.Attribute("Type").Value; + shader.RenderSystem = shaderElement.Attribute("RenderSystem").Value; + shader.Source = shaderElement.Attribute("Source").Value; + + Shaders.Add(shader); + } + } + else + { + Console.WriteLine("no shader tags found in configuration file..."); + return; + } + } + } + + configurationValid = true; + } + + public static bool ConfigurationValid + { + get + { + return configurationValid; + } + } + + public static string Target + { + get + { + return target; + } + } + + public static string LicenseFile + { + get + { + return licenseFile; + } + } + + public static string Namespace + { + get + { + return outputNamespace; + } + } + } +} diff --git a/Tools/StockShaderCodeGenerator/Program.cs b/Tools/StockShaderCodeGenerator/Program.cs index 49bdc14f..1445d907 100644 --- a/Tools/StockShaderCodeGenerator/Program.cs +++ b/Tools/StockShaderCodeGenerator/Program.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Reflection; #endregion // Private Members @@ -59,8 +60,36 @@ namespace StockShaderCodeGenerator { static void Main(string[] args) { - Console.WriteLine(System.IO.Path.GetFullPath("/")); - Console.ReadLine(); + Console.WriteLine("ANX.Framework StockShaderCodeGenerator (sscg) Version " + Assembly.GetExecutingAssembly().GetName().Version); + + string buildFile; + + if (args.Length < 1) + { + Console.WriteLine("No command line arguments provided. Trying to load build.xml from current directory."); + + buildFile = "build.xml"; + } + else + { + buildFile = args[0]; + } + + Console.WriteLine("Creating configuration using '{0}' configuration file.", buildFile); + + Configuration.LoadConfiguration(buildFile); + + if (Configuration.ConfigurationValid) + { + Compiler.GenerateShaders(); + } + + CodeGenerator.Generate(); + +//#if DEBUG +// Console.WriteLine("Press enter to exit."); +// Console.ReadLine(); +//#endif } } } diff --git a/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs b/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs index 6bbf8cf9..0c56655e 100644 --- a/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs +++ b/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.7.1.*")] +[assembly: AssemblyFileVersion("0.7.1.0")] diff --git a/Samples/SampleContent/Effects/SpriteEffect.fx b/Tools/StockShaderCodeGenerator/Shader.cs similarity index 75% rename from Samples/SampleContent/Effects/SpriteEffect.fx rename to Tools/StockShaderCodeGenerator/Shader.cs index bb65c2f3..6d41e516 100644 --- a/Samples/SampleContent/Effects/SpriteEffect.fx +++ b/Tools/StockShaderCodeGenerator/Shader.cs @@ -1,3 +1,10 @@ +#region Using Statements +using System; + +#endregion // Using Statements + +#region License + // // This file is part of the ANX.Framework created by the "ANX.Framework developer group". // @@ -41,47 +48,16 @@ // extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a // particular purpose and non-infringement. -uniform extern float4x4 MatrixTransform; +#endregion // License -Texture2D Texture : register(t0); - sampler TextureSampler : register(s0); - -struct VertexShaderInput +namespace StockShaderCodeGenerator { - float4 pos : POSITION; - float4 col : COLOR; - float2 tex : TEXCOORD0; -}; - -struct PixelShaderInput -{ - float4 pos : SV_POSITION; - float4 col : COLOR; - float2 tex : TEXCOORD0; -}; - -PixelShaderInput SpriteVertexShader( VertexShaderInput input ) -{ - PixelShaderInput output = (PixelShaderInput)0; - - output.pos = mul(input.pos, MatrixTransform); - output.col = input.col; - output.tex = input.tex; - - return output; -} - -float4 SpritePixelShader( PixelShaderInput input ) : SV_Target -{ - return Texture.Sample(TextureSampler, input.tex) * input.col; -} - -technique10 SpriteTechnique -{ - pass SpriteColorPass - { - SetGeometryShader( 0 ); - SetVertexShader( CompileShader( vs_4_0, SpriteVertexShader() ) ); - SetPixelShader( CompileShader( ps_4_0, SpritePixelShader() ) ); - } + public struct Shader + { + public string Type; + public string Source; + public string RenderSystem; + public bool ShaderCompiled; + public byte[] ByteCode; + } } diff --git a/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj b/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj index 42fa0c91..7c638ba0 100644 --- a/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj +++ b/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj @@ -43,8 +43,26 @@ + + + + + + + + {5BE49183-2F6F-4527-AC90-D816911FCF90} + ANX.Framework.Windows.DX10 + + + {EB8258E0-6741-4DB9-B756-1EBDF67B1ED6} + ANX.Framework.Windows.GL3 + + + {6899F0C9-70B9-4EB0-9DD3-E598D4BE3E35} + ANX.Framework +