示例#1
0
 public StaticAnalysisEntry(
     Object asset,
     string assetAlias,
     string assetCategory,
     ShaderProgramFilter filter,
     string filterName,
     string filterCategory,
     string testName,
     BuildTarget buildTarget,
     float timeout
     )
 {
     errorString      = null;
     this.asset       = asset;
     this.filter      = filter;
     this.buildTarget = buildTarget;
     this.timeout     = timeout;
     this.testName    = new TestName(
         string.IsNullOrEmpty(assetAlias) ? asset.ToString() : assetAlias,
         assetCategory,
         filterName,
         filterCategory,
         testName
         );
 }
示例#2
0
 public StaticAnalysisEntry(string error)
 {
     errorString = error;
     asset       = null;
     filter      = null;
     testName    = default;
     buildTarget = 0;
     timeout     = 0;
 }
示例#3
0
    public static IEnumerable <StaticAnalysisEntry> GetStaticAnalysisEntries(BuildTarget buildTarget)
    {
        var resource = PerformanceTestSettings.GetStaticAnalysisAsset() as EditorShaderStaticAnalysisAsset;

        if (resource == null)
        {
            yield break;
        }

        foreach (var definition in resource.processAssetDefinitions)
        {
            // Skip when not included in this build target
            if (definition.includeInTargets != null && Array.IndexOf(definition.includeInTargets, buildTarget) == -1)
            {
                continue;
            }

            if (definition.asset == null || definition.asset.Equals(null))
            {
                yield return(new StaticAnalysisEntry("Missing asset in definition."));

                continue;
            }

            var assetType = definition.asset.GetType();

            if (assetType != typeof(Material) &&
                assetType != typeof(Shader) &&
                assetType != typeof(ComputeShader))
            {
                yield return(new StaticAnalysisEntry($"Invalid asset type {assetType}"));

                continue;
            }

            if (!definition.filter.Resolve(resource.filters, out var filter, out var errorMessage))
            {
                yield return(new StaticAnalysisEntry($"Invalid filter ({errorMessage})"));

                continue;
            }

            var programFilter = ShaderProgramFilter.Parse(filter.passNameFilter, filter.keywordFilter);
            yield return(new StaticAnalysisEntry(definition.asset,
                                                 definition.assetAlias,
                                                 definition.assetCategory,
                                                 programFilter,
                                                 filter.name,
                                                 filter.category,
                                                 definition.testName,
                                                 buildTarget,
                                                 resource.staticAnalysisTimeout));
        }
    }
 IAsyncJob BuildMaterialReport()
 {
     m_ShaderFilter = ShaderProgramFilter.Parse(m_ShaderPassFilter, m_KeywordFilter);
     return(EditorShaderTools.GenerateBuildReportAsync(ShaderAnalysis.ShaderAnalysisReport.New(m_Material, m_CurrentPlatform, m_ShaderFilter, m_BuildReportFeature, m_LogCompilerArguments)));
 }
示例#5
0
        public static IEnumerator BuildDefinesFromMultiCompiles(List <HashSet <string> > multicompiles, List <HashSet <string> > defines, ShaderProgramFilter filter)
        {
            if (multicompiles.Count == 0)
            {
                defines.Add(new HashSet <string>());
                yield break;
            }

            var mc = new string[multicompiles.Count][];

            for (var i = 0; i < mc.Length; i++)
            {
                mc[i] = new string[multicompiles[i].Count];
                multicompiles[i].CopyTo(mc[i]);
            }

            // current multicompile index
            var indices = new int[multicompiles.Count];

            while (true)
            {
                // Add an entry with current indices
                var entry = new HashSet <string>();

                for (var i = 0; i < indices.Length; i++)
                {
                    var token = mc[i][indices[i]];
                    if (token == "_")
                    {
                        continue;
                    }
                    entry.Add(token);
                }

                var success = false;
                if (filter != null && filter.includedKeywords.Count != 0)
                {
                    foreach (var keywordSet in filter.includedKeywords)
                    {
                        if (keywordSet.IsSubsetOf(entry))
                        {
                            success = true;
                            break;
                        }
                    }
                }
                else
                {
                    success = true;
                }

                if (success)
                {
                    defines.Add(entry);
                    yield return(defines.Count);
                }

                var incrementIndex = indices.Length - 1;
                while (true)
                {
                    // increment last index
                    ++indices[incrementIndex];
                    if (indices[incrementIndex] >= multicompiles[incrementIndex].Count)
                    {
                        // We have done all multicompiles at this index
                        // So increment previous indices
                        indices[incrementIndex] = 0;
                        --incrementIndex;
                    }
                    else
                    {
                        break;
                    }

                    // Loop complete
                    if (incrementIndex < 0)
                    {
                        break;
                    }
                }

                // Loop complete
                if (incrementIndex < 0)
                {
                    break;
                }
            }
        }