public void ShaderVariantsAreReported() { var issues = BuildAndAnalyze(); Assert.True(ShadersAuditor.BuildDataAvailable()); var keywords = issues.Select(i => i.GetCustomProperty((int)ShaderVariantProperty.Keywords)); Assert.True(keywords.Any(key => key.Equals(s_KeywordName))); var variants = issues.Where(i => i.description.Equals("Custom/MyTestShader")).ToArray(); var shaderCompilerPlatforms = variants.Select(v => v.GetCustomProperty((int)ShaderVariantProperty.Platform)).Distinct(); var numShaderCompilerPlatforms = shaderCompilerPlatforms.Count(); Assert.AreEqual(5 * numShaderCompilerPlatforms, variants.Length); foreach (var plat in shaderCompilerPlatforms) { var variantsForPlatform = variants.Where(v => v.GetCustomProperty((int)ShaderVariantProperty.Platform).Equals(plat)).ToArray(); Assert.AreEqual((int)ShaderVariantProperty.Num, variantsForPlatform[0].GetNumCustomProperties()); // "#pragma multi_compile __ KEYWORD_A KEYWORD_B" should produce 3 variants for each graphics API Assert.True(variantsForPlatform.Any(v => v.GetCustomProperty((int)ShaderVariantProperty.Keywords).Equals(ShadersAuditor.k_NoKeywords))); Assert.True(variantsForPlatform.Any(v => v.GetCustomProperty((int)ShaderVariantProperty.Keywords).Equals("KEYWORD_A"))); Assert.True(variantsForPlatform.Any(v => v.GetCustomProperty((int)ShaderVariantProperty.Keywords).Equals("KEYWORD_B"))); } }
public void ShaderIsReported() { ShadersAuditor.ClearBuildData(); var issues = Utility.Analyze(IssueCategory.Shaders); var shaderIssue = issues.FirstOrDefault(i => i.description.Equals(k_ShaderName)); Assert.NotNull(shaderIssue); // check descriptor Assert.True(shaderIssue.descriptor.area.Equals(Area.Info.ToString())); // check custom property Assert.AreEqual((int)ShaderProperty.Num, shaderIssue.GetNumCustomProperties()); Assert.True(shaderIssue.GetCustomProperty(ShaderProperty.NumVariants).Equals(ShadersAuditor.k_NotAvailable), "Num Variants: " + shaderIssue.GetCustomProperty(ShaderProperty.NumVariants)); #if UNITY_2019_1_OR_NEWER Assert.AreEqual(2, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumPasses), "NumPasses was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumPasses)); Assert.AreEqual(2, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumKeywords), "NumKeywords was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumKeywords)); #else Assert.AreEqual(0, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumPasses), "NumPasses was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumPasses)); Assert.AreEqual(0, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumKeywords), "NumKeywords was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumKeywords)); #endif Assert.AreEqual(2000, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.RenderQueue), "RenderQueue was : " + shaderIssue.GetCustomProperty(ShaderProperty.RenderQueue)); Assert.False(shaderIssue.GetCustomPropertyAsBool(ShaderProperty.Instancing), "Instancing is supported but it should not be."); Assert.False(shaderIssue.GetCustomPropertyAsBool(ShaderProperty.SrpBatcher), "SRP Batcher is supported but it should not be."); }
public void ShaderVariantsAreReported() { var issues = Utility.AnalyzeBuild().GetIssues(IssueCategory.ShaderVariants); Assert.True(ShadersAuditor.BuildDataAvailable()); var keywords = issues.Select(i => i.GetCustomProperty(ShaderVariantProperty.Keywords)); Assert.True(keywords.Any(key => key.Equals(s_KeywordName))); var variants = issues.Where(i => i.description.Equals(k_ShaderName)).ToArray(); Assert.Positive(variants.Length); var shaderCompilerPlatforms = variants.Select(v => v.GetCustomProperty(ShaderVariantProperty.Platform)).Distinct(); var compilerPlatformNames = ShaderUtilProxy.GetCompilerPlatformNames(); foreach (var plat in shaderCompilerPlatforms) { Assert.Contains(plat, compilerPlatformNames); var variantsForPlatform = variants.Where(v => v.GetCustomProperty(ShaderVariantProperty.Platform).Equals(plat)).ToArray(); Assert.AreEqual((int)ShaderVariantProperty.Num, variantsForPlatform[0].GetNumCustomProperties()); // "#pragma multi_compile __ KEYWORD_A KEYWORD_B" should produce 3 variants for each graphics API Assert.True(variantsForPlatform.Any(v => v.GetCustomProperty(ShaderVariantProperty.Keywords).Equals(ShadersAuditor.k_NoKeywords))); Assert.True(variantsForPlatform.Any(v => v.GetCustomProperty(ShaderVariantProperty.Keywords).Equals("KEYWORD_A"))); Assert.True(variantsForPlatform.Any(v => v.GetCustomProperty(ShaderVariantProperty.Keywords).Equals("KEYWORD_B"))); Assert.True(variantsForPlatform.All(v => v.GetCustomProperty(ShaderVariantProperty.Compiled).Equals(ShadersAuditor.k_NoRuntimeData))); // check descriptor Assert.True(variantsForPlatform.All(v => v.descriptor.area.Equals("Info"))); } }
public void ShaderVariantsRequireBuild() { ShadersAuditor.ClearBuildData(); var issues = Utility.Analyze(IssueCategory.ShaderVariants); Assert.Zero(issues.Length); Assert.False(ShadersAuditor.BuildDataAvailable()); }
public void UnusedVariantsAreReported() { EditorSceneManager.SaveScene(SceneManager.GetActiveScene(), "Assets/UntitledScene.unity"); var buildPath = FileUtil.GetUniqueTempPathInProject(); Directory.CreateDirectory(buildPath); ShadersAuditor.ClearBuildData(); // clear previously built variants, if any var buildReport = BuildPipeline.BuildPlayer(new BuildPlayerOptions { scenes = new string[] {}, locationPathName = Path.Combine(buildPath, "test"), target = EditorUserBuildSettings.activeBuildTarget, targetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget), options = BuildOptions.Development }); Assert.True(buildReport.summary.result == BuildResult.Succeeded); Directory.Delete(buildPath, true); AssetDatabase.DeleteAsset("Assets/UntitledScene.unity"); var allVariants = Utility.Analyze(IssueCategory.ShaderVariants); ShadersAuditor.ClearBuildData(); // cleanup var variants = allVariants.Where(i => i.description.Equals(k_ShaderName) && i.category == IssueCategory.ShaderVariants).ToArray(); Assert.Positive(variants.Length); var result = ShadersAuditor.ParsePlayerLog(m_PlayerLogResource.relativePath, variants); Assert.That(result, Is.EqualTo(ParseLogResult.Success), "No compiled shader variants found in player log."); var shaderCompilerPlatforms = variants.Select(v => v.GetCustomProperty(ShaderVariantProperty.Platform)).Distinct().ToArray(); var numShaderCompilerPlatforms = shaderCompilerPlatforms.Count(); Assert.AreEqual(5 * numShaderCompilerPlatforms, variants.Length, "Compiler Platforms: " + string.Join(", ", shaderCompilerPlatforms)); var unusedVariants = variants.Where(i => !i.GetCustomPropertyAsBool(ShaderVariantProperty.Compiled)).ToArray(); foreach (var plat in shaderCompilerPlatforms) { var unusedVariantsForPlatform = unusedVariants.Where(v => v.GetCustomProperty(ShaderVariantProperty.Platform).Equals(plat)).ToArray(); Assert.AreEqual(2, unusedVariantsForPlatform.Length); Assert.True(unusedVariantsForPlatform[0].GetCustomProperty(ShaderVariantProperty.PassName).Equals("MyTestShader/Pass")); Assert.True(unusedVariantsForPlatform[0].GetCustomProperty(ShaderVariantProperty.Keywords).Equals("KEYWORD_B")); #if UNITY_2019_1_OR_NEWER Assert.True(unusedVariantsForPlatform[1].GetCustomProperty(ShaderVariantProperty.PassName).Equals("Pass 1")); #else Assert.True(unusedVariantsForPlatform[1].GetCustomProperty(ShaderVariantProperty.PassName).Equals(string.Empty)); #endif Assert.True(unusedVariantsForPlatform[1].GetCustomProperty(ShaderVariantProperty.Keywords).Equals(ShadersAuditor.k_NoKeywords)); } }
public void ShaderVariantsRequireBuild() { ShadersAuditor.CleanupBuildData(); var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ShaderVariants); Assert.Zero(issues.Length); Assert.False(ShadersAuditor.BuildDataAvailable()); }
public void ShaderVariantsRequireBuild() { ShadersAuditor.CleanupBuildData(); var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ShaderVariants); Assert.Positive(issues.Length); Assert.True(issues.First().description.Equals("Build the project to view the Shader Variants")); }
public override void OnGUI() { var buildAvailable = ShadersAuditor.BuildDataAvailable(); EditorGUILayout.BeginVertical(GUI.skin.box); var helpStyle = new GUIStyle(EditorStyles.textField); helpStyle.wordWrap = true; EditorGUILayout.LabelField(buildAvailable ? k_PlayerLogInfo : k_BuildRequiredInfo, helpStyle); EditorGUI.BeginChangeCheck(); var lastEnabled = GUI.enabled; GUI.enabled = buildAvailable; m_FlatView = EditorGUILayout.ToggleLeft("Flat View", m_FlatView, GUILayout.Width(160)); m_HideCompiledVariants = EditorGUILayout.ToggleLeft("Hide Compiled Variants", m_HideCompiledVariants, GUILayout.Width(160)); GUI.enabled = lastEnabled; if (EditorGUI.EndChangeCheck()) { m_AnalysisView.SetFlatView(m_FlatView); m_AnalysisView.Refresh(); } EditorGUILayout.EndVertical(); if (buildAvailable) { var evt = Event.current; switch (evt.type) { case EventType.DragExited: break; case EventType.DragUpdated: var valid = 1 == DragAndDrop.paths.Count(path => Path.HasExtension(path) && Path.GetExtension(path).Equals(".log")); DragAndDrop.visualMode = valid ? DragAndDropVisualMode.Generic : DragAndDropVisualMode.Rejected; evt.Use(); break; case EventType.DragPerform: DragAndDrop.AcceptDrag(); HandleDragAndDrop(); evt.Use(); break; } base.OnGUI(); } }
void ParsePlayerLog(string logFilename) { if (string.IsNullOrEmpty(logFilename)) { return; } const string dialogTitle = "Shader Variants"; var variants = GetIssues().Where(i => i.category == IssueCategory.ShaderVariants).ToArray(); var result = ShadersAuditor.ParsePlayerLog(logFilename, variants, new ProgressBarDisplay()); switch (result) { case ParseLogResult.Success: EditorUtility.DisplayDialog(dialogTitle, k_PlayerLogProcessed, "Ok"); Refresh(); break; case ParseLogResult.NoCompiledVariants: if (GraphicsSettingsProxy.logShaderCompilationSupported) { if (GraphicsSettingsProxy.logWhenShaderIsCompiled) { EditorUtility.DisplayDialog(dialogTitle, k_NoCompiledVariantWarning, "Ok"); } else { GraphicsSettingsProxy.logWhenShaderIsCompiled = EditorUtility.DisplayDialog(dialogTitle, k_NoCompiledVariantWarningLogDisabled, "Yes", "No"); } } break; case ParseLogResult.ReadError: EditorUtility.DisplayDialog(dialogTitle, k_PlayerLogReadError, "Ok"); break; } }
public void SetShadersAuditor(ShadersAuditor shadersAuditor) { m_ShadersAuditor = shadersAuditor; }
public void PlayerLogDoesNotContainShaderCompilationLog() { var result = ShadersAuditor.ParsePlayerLog(m_PlayerLogWithNoCompilationResource.relativePath, new ProjectIssue[0]); Assert.That(result, Is.EqualTo(ParseLogResult.NoCompiledVariants)); }