public static void ShaderSetAutoDiscovery() { ToolChain toolChain = ToolChain.Get(ToolFeatures.ToCompiled); if (toolChain == null) { throw new RequiredToolFeatureMissingException("No tool chain supporting compilation was found!"); } Compilation compilation = TestUtil.GetCompilation(); LanguageBackend backend = toolChain.CreateBackend(compilation); ShaderGenerator sg = new ShaderGenerator(compilation, backend); ShaderGenerationResult generationResult = sg.GenerateShaders(); IReadOnlyList <GeneratedShaderSet> hlslSets = generationResult.GetOutput(backend); Assert.Equal(4, hlslSets.Count); GeneratedShaderSet set = hlslSets[0]; Assert.Equal("VertexAndFragment", set.Name); CompileResult result = toolChain.Compile(set.VertexShaderCode, Stage.Vertex, "VS"); Assert.False(result.HasError, result.ToString()); result = toolChain.Compile(set.FragmentShaderCode, Stage.Fragment, "FS"); Assert.False(result.HasError, result.ToString()); }
public void PartialFiles() { ToolChain toolChain = ToolChain.Get(ToolFeatures.ToCompiled); if (toolChain == null) { throw new RequiredToolFeatureMissingException("No tool chain supporting compilation was found!"); } Compilation compilation = TestUtil.GetCompilation(); LanguageBackend backend = toolChain.CreateBackend(compilation); ShaderGenerator sg = new ShaderGenerator(compilation, backend, "TestShaders.PartialVertex.VertexShaderFunc"); ShaderGenerationResult genResult = sg.GenerateShaders(); IReadOnlyList <GeneratedShaderSet> sets = genResult.GetOutput(backend); Assert.Equal(1, sets.Count); GeneratedShaderSet set = sets[0]; ShaderModel shaderModel = set.Model; string vsCode = set.VertexShaderCode; CompileResult result = toolChain.Compile(vsCode, Stage.Vertex, "VertexShaderFunc"); Assert.False(result.HasError, result.ToString()); }
public void AllSetsCompile() { Compilation compilation = TestUtil.GetCompilation(); // Get all available tool chains. LanguageBackend[] backends = TestUtil.GetAllBackends(compilation, ToolFeatures.ToCompiled); ShaderGenerator sg = new ShaderGenerator(compilation, backends); ShaderGenerationResult generationResult = sg.GenerateShaders(); string spacer1 = new string('=', 80); string spacer2 = new string('-', 80); bool failed = false; foreach (LanguageBackend backend in backends) { ToolChain toolChain = ToolChain.Get(backend); IReadOnlyList <GeneratedShaderSet> sets = generationResult.GetOutput(backend); _output.WriteLine(spacer1); _output.WriteLine($"Generated shader sets for {toolChain.Name} backend."); foreach (GeneratedShaderSet set in sets) { _output.WriteLine(string.Empty); _output.WriteLine(spacer2); _output.WriteLine(string.Empty); CompileResult result; if (set.VertexShaderCode != null) { result = toolChain.Compile(set.VertexShaderCode, Stage.Vertex, set.VertexFunction.Name); if (result.HasError) { _output.WriteLine($"Failed to compile Vertex Shader from set \"{set.Name}\"!"); _output.WriteLine(result.ToString()); failed = true; } else { _output.WriteLine($"Compiled Vertex Shader from set \"{set.Name}\"!"); } } if (set.FragmentFunction != null) { result = toolChain.Compile(set.FragmentShaderCode, Stage.Fragment, set.FragmentFunction.Name); if (result.HasError) { _output.WriteLine($"Failed to compile Fragment Shader from set \"{set.Name}\"!"); _output.WriteLine(result.ToString()); failed = true; } else { _output.WriteLine($"Compiled Fragment Shader from set \"{set.Name}\"!"); } } if (set.ComputeFunction != null) { // TODO The skipped shaders are not included in the auto discovered shaders, leaving this here for completeness. if (backend is GlslEs300Backend) { string fullname = set.ComputeFunction.DeclaringType + "." + set.ComputeFunction.Name + "_"; if (s_glslesSkippedShaders.Contains(fullname)) { continue; } } result = toolChain.Compile(set.ComputeShaderCode, Stage.Compute, set.ComputeFunction.Name); if (result.HasError) { _output.WriteLine($"Failed to compile Compute Shader from set \"{set.Name}\"!"); _output.WriteLine(result.ToString()); failed = true; } else { _output.WriteLine($"Compiled Compute Shader from set \"{set.Name}\"!"); } } } _output.WriteLine(string.Empty); } Assert.False(failed); }