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"))); } }
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); }