4 using System.Collections.Generic;
7 using SiliconStudio.Core.Diagnostics;
8 using SiliconStudio.Core.Storage;
9 using SiliconStudio.Paradox.Effects;
11 namespace SiliconStudio.
Paradox.Shaders.Compiler
18 private readonly Dictionary<string, List<CompilerResults>> earlyCompilerCache =
new Dictionary<string, List<CompilerResults>>();
29 var usedParameters =
new List<ShaderMixinParameters>();
31 string effectName = null;
33 if (shaderMixinGeneratorSource != null)
35 effectName = shaderMixinGeneratorSource.Name;
39 if (modifiedShaders == null || modifiedShaders.Count == 0)
42 var foundCompilerResults = GetShaderFromParameters(effectName, compilerParameters);
43 if (foundCompilerResults != null)
46 earlyCompilerResults.Module = string.Format(
"EffectCompile [{0}]", effectName);
47 earlyCompilerResults.MainBytecode = foundCompilerResults.MainBytecode;
48 earlyCompilerResults.MainUsedParameters = foundCompilerResults.MainUsedParameters;
49 foreach (var foundBytecode
in foundCompilerResults.Bytecodes)
51 earlyCompilerResults.Bytecodes.Add(foundBytecode.Key, foundBytecode.Value);
54 foreach (var foundUsedParameters
in foundCompilerResults.UsedParameters)
56 earlyCompilerResults.UsedParameters.Add(foundUsedParameters.Key, foundUsedParameters.Value);
58 return earlyCompilerResults;
61 mixinTree = ShaderMixinManager.Generate(effectName, compilerParameters, out mainUsedParameters, out usedParameters);
65 effectName =
"Effect";
70 if (shaderClassSource != null)
72 shaderMixinSource =
new ShaderMixinSource();
73 shaderMixinSource.Mixins.Add(shaderClassSource);
76 if (shaderMixinSource != null)
82 throw new ArgumentException(
"Unsupported ShaderSource type [{0}]. Supporting only ShaderMixinSource/pdxfx, ShaderClassSource",
"shaderSource");
87 mainUsedParameters.Set(CompilerParameters.GraphicsPlatformKey, compilerParameters.Platform);
88 mainUsedParameters.Set(CompilerParameters.GraphicsProfileKey, compilerParameters.Profile);
89 mainUsedParameters.Set(CompilerParameters.DebugKey, compilerParameters.Debug);
91 foreach (var parameters
in usedParameters)
93 parameters.Set(CompilerParameters.GraphicsPlatformKey, compilerParameters.Platform);
94 parameters.Set(CompilerParameters.GraphicsProfileKey, compilerParameters.Profile);
95 parameters.Set(CompilerParameters.DebugKey, compilerParameters.Debug);
100 compilerResults.Module = string.Format(
"EffectCompile [{0}]", effectName);
101 var wasCompiled = Compile(
string.Empty, effectName, mixinTree, mainUsedParameters, usedParameters, modifiedShaders, recentlyModifiedShaders, compilerResults);
103 if (wasCompiled && shaderMixinGeneratorSource != null)
105 lock (earlyCompilerCache)
107 List<CompilerResults> effectCompilerResults;
108 if (!earlyCompilerCache.TryGetValue(effectName, out effectCompilerResults))
110 effectCompilerResults =
new List<CompilerResults>();
111 earlyCompilerCache.Add(effectName, effectCompilerResults);
115 effectCompilerResults.Add(compilerResults);
119 return compilerResults;
136 if (mixinTree.
Mixin == null)
return false;
138 var cp = compilerParameters.FirstOrDefault(x => x.Name == fullEffectName);
139 var bytecode = Compile(mixinTree.
Mixin, fullEffectName, cp ?? mainCompilerParameters, modifiedShaders, recentlyModifiedShaders, compilerResults);
141 var wasCompiled =
false;
142 if (bytecode != null)
144 if (effectName ==
string.Empty)
146 compilerResults.MainBytecode = bytecode;
147 compilerResults.MainUsedParameters = mainCompilerParameters;
149 compilerResults.Bytecodes.Add(effectName, bytecode);
150 compilerResults.UsedParameters.Add(effectName, cp);
155 foreach (var childTree
in mixinTree.Children)
157 var childEffectName = effectName == string.Empty ? childTree.Key : effectName +
"." + childTree.Key;
158 var fullChildEffectName = fullEffectName == string.Empty ? childTree.Key : fullEffectName +
"." + childTree.Key;
159 wasCompiled |= Compile(childEffectName, fullChildEffectName, childTree.Value, mainCompilerParameters, compilerParameters, modifiedShaders, recentlyModifiedShaders, compilerResults);
185 lock (earlyCompilerCache)
187 List<CompilerResults> effectCompilerResults;
188 if (!earlyCompilerCache.TryGetValue(effectName, out effectCompilerResults))
194 foreach (var compiledResults
in effectCompilerResults)
196 if (compiledResults.MainUsedParameters != null && parameters.
Contains(compiledResults.MainUsedParameters))
197 return compiledResults;
ShaderMixinSource Mixin
Gets or sets the mixin.
A shader source that is linked to a pdxfx effect.
Parameters used for mixin.
A mixin performing a combination of ShaderClassSource and other mixins.
A logger that stores messages locally useful for internal log scenarios.
Contains a tree of ShaderMixinSource.
Base class for implementations of IEffectCompiler, providing some helper functions.
Parameters used for compilation.
CompilerResults Compile(ShaderSource shaderSource, CompilerParameters compilerParameters, HashSet< string > modifiedShaders, HashSet< string > recentlyModifiedShaders)
Compiles the specified shader source.
bool Contains(ParameterCollection parameters)
Tests if the values in parameters are contained into this instance. It will automatically handle defa...
virtual bool Compile(string effectName, string fullEffectName, ShaderMixinSourceTree mixinTree, ShaderMixinParameters mainCompilerParameters, List< ShaderMixinParameters > compilerParameters, HashSet< string > modifiedShaders, HashSet< string > recentlyModifiedShaders, CompilerResults compilerResults)
Compile the effect and its children.
CompilerResults GetShaderFromParameters(string effectName, CompilerParameters parameters)
Get the shader from the database based on the parameters used for its compilation.
Contains a compiled shader with bytecode for each stage.
Main interface used to compile a shader.
A shader class used for mixin.