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")));
            }
        }
Esempio n. 2
0
        void AddShader(Shader shader, string assetPath, int id, Action <ProjectIssue> onIssueFound)
        {
            // set initial state (-1: info not available)
            var variantCount = s_ShaderVariantData.Count > 0 ? 0 : -1;

#if UNITY_2018_2_OR_NEWER
            // add variants first
            if (s_ShaderVariantData.ContainsKey(shader))
            {
                var variants = s_ShaderVariantData[shader];
                variantCount = variants.Count;

                AddVariants(shader, assetPath, id++, variants, onIssueFound);
            }
#endif

            var shaderName     = shader.name;
            var shaderHasError = false;

#if UNITY_2019_4_OR_NEWER
            shaderHasError = ShaderUtil.ShaderHasError(shader);
#endif

            if (shaderHasError)
            {
                shaderName = Path.GetFileNameWithoutExtension(assetPath) + ": Parse Error";

                var issueWithError = new ProjectIssue(k_ParseErrorDescriptor, shaderName, IssueCategory.Shaders, new Location(assetPath));
                issueWithError.SetCustomProperties((int)ShaderProperty.Num, k_NotAvailable);

                onIssueFound(issueWithError);

                return;
            }

            var descriptor = new ProblemDescriptor
                             (
                id++,
                shaderName
                             );

/*
 *          var usedBySceneOnly = false;
 *          if (m_GetShaderVariantCountMethod != null)
 *          {
 *              var value = (ulong)m_GetShaderVariantCountMethod.Invoke(null, new object[] { shader, usedBySceneOnly});
 *              variantCount = value.ToString();
 *          }
 */
            var passCount              = -1;
            var globalKeywords         = ShaderUtilProxy.GetShaderGlobalKeywords(shader);
            var localKeywords          = ShaderUtilProxy.GetShaderLocalKeywords(shader);
            var hasInstancing          = ShaderUtilProxy.HasInstancing(shader);
            var subShaderIndex         = ShaderUtilProxy.GetShaderActiveSubshaderIndex(shader);
            var isSrpBatcherCompatible = ShaderUtilProxy.GetSRPBatcherCompatibilityCode(shader, subShaderIndex) == 0;

#if UNITY_2019_1_OR_NEWER
            passCount = shader.passCount;
#endif
            var issue = new ProjectIssue(descriptor, shaderName, IssueCategory.Shaders, new Location(assetPath));
            issue.SetCustomProperties(new string[(int)ShaderProperty.Num]
            {
                variantCount == -1 ? k_NotAvailable : variantCount.ToString(),
                passCount == -1 ? k_NotAvailable : passCount.ToString(),
                (globalKeywords == null || localKeywords == null) ? k_NotAvailable : (globalKeywords.Length + localKeywords.Length).ToString(),
                shader.renderQueue.ToString(),
                hasInstancing.ToString(),
                isSrpBatcherCompatible.ToString()
            });
            onIssueFound(issue);
        }