Esempio n. 1
0
        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));
            }
        }
Esempio n. 6
0
        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());
        }
Esempio n. 7
0
        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();
            }
        }
Esempio n. 9
0
        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;
            }
        }
Esempio n. 10
0
 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));
        }