protected override Task <ResultStatus> DoCommandOverride(ICommandContext commandContext) { var compiler = GetOrCreateEffectCompiler(context); // Get main effect name (before the first dot) var isSdfx = ShaderMixinManager.Contains(effectName); var source = isSdfx ? new ShaderMixinGeneratorSource(effectName) : (ShaderSource) new ShaderClassSource(effectName); int permutationCount; lock (PermutationCount) { PermutationCount.TryGetValue(effectName, out permutationCount); permutationCount++; PermutationCount[effectName] = permutationCount; } commandContext.Logger.Verbose($"Trying permutation #{permutationCount} for effect [{effectName}]: \n{compilerParameters.ToStringPermutationsDetailed()}"); var compilerResults = compiler.Compile(source, compilerParameters); // Copy logs and if there are errors, exit directly compilerResults.CopyTo(commandContext.Logger); if (compilerResults.HasErrors) { return(Task.FromResult(ResultStatus.Failed)); } // Wait for result an check compilation status var completedTask = compilerResults.Bytecode.WaitForResult(); completedTask.CompilationLog.CopyTo(commandContext.Logger); if (completedTask.CompilationLog.HasErrors) { return(Task.FromResult(ResultStatus.Failed)); } // Register all dependencies var allSources = new HashSet <string>( completedTask.Bytecode.HashSources.Select(keyPair => keyPair.Key)); foreach (var className in allSources) { commandContext.RegisterInputDependency(new ObjectUrl(UrlType.Content, EffectCompilerBase.GetStoragePathFromShaderType(className))); } // Generate sourcecode if configured if (compilerParameters.ContainsKey(EffectSourceCodeKeys.Enable)) { var outputDirectory = UPath.Combine(package.RootDirectory, baseUrl); var fieldName = compilerParameters.Get(EffectSourceCodeKeys.FieldName); if (fieldName.StartsWith("binary")) { fieldName = fieldName.Substring("binary".Length); if (char.IsUpper(fieldName[0])) { fieldName = char.ToLower(fieldName[0]) + fieldName.Substring(1); } } var outputClassFile = effectName + "." + fieldName + "." + compilerParameters.EffectParameters.Platform + "." + compilerParameters.EffectParameters.Profile + ".cs"; var fullOutputClassFile = Path.Combine(outputDirectory.ToWindowsPath(), outputClassFile); commandContext.Logger.Verbose($"Writing shader bytecode to .cs source [{fullOutputClassFile}]."); using (var stream = new FileStream(fullOutputClassFile, FileMode.Create, FileAccess.Write, FileShare.Write)) EffectByteCodeToSourceCodeWriter.Write(effectName, compilerParameters, compilerResults.Bytecode.WaitForResult().Bytecode, new StreamWriter(stream, System.Text.Encoding.UTF8)); } return(Task.FromResult(ResultStatus.Successful)); }