Ejemplo n.º 1
0
        public StripShaderCompilerData(UnityEditor.Rendering.ShaderCompilerData shaderCompilerData, bool isStripped = false)
        {
            if (shaderKeywordSet == null)
            {
                shaderKeywordSet = new List <StripShaderKeyword>();
            }
            UnityEngine.Rendering.ShaderKeyword[] keywordSet = shaderCompilerData.shaderKeywordSet.GetShaderKeywords();
            for (int i = 0; i < keywordSet.Length; i++)
            {
                StripShaderKeyword shaderKeyword = new StripShaderKeyword(keywordSet[i]);
                shaderKeywordSet.Add(shaderKeyword);
            }
            Array array = Enum.GetValues(typeof(UnityEngine.Rendering.BuiltinShaderDefine));

            foreach (UnityEngine.Rendering.BuiltinShaderDefine v in array)
            {
                if (shaderCompilerData.platformKeywordSet.IsEnabled(v))
                {
                    StripBuiltinShaderDefine newdefine = StripTypeConvert.ConvertUnityTypeToStripType(v);
                    platformKeywordSet = platformKeywordSet | newdefine;
                }
            }
            shaderRequirements     = shaderCompilerData.shaderRequirements;
            graphicsTier           = shaderCompilerData.graphicsTier;
            shaderCompilerPlatform = shaderCompilerData.shaderCompilerPlatform;
            this.isStripped        = isStripped;
        }
Ejemplo n.º 2
0
 public SnippetComileDataTuple GetSnippetComileDataTuple(UnityEditor.Rendering.ShaderSnippetData snippet)
 {
     if (snippetComileDatas != null)
     {
         for (int i = 0; i < snippetComileDatas.Count; i++)
         {
             SnippetComileDataTuple t = snippetComileDatas[i];
             if (t != null)
             {
                 if (t.snippet.passName == snippet.passName && t.snippet.passType == StripTypeConvert.ConvertUnityTypeToStripType(snippet.passType) && t.snippet.shaderType == StripTypeConvert.ConvertUnityTypeToStripType(snippet.shaderType))
                 {
                     return(t);
                 }
             }
         }
     }
     return(null);
 }
Ejemplo n.º 3
0
        public bool KeepVariantByConfigure(Shader shader, ShaderSnippetData snippet, ShaderCompilerData shaderVariant)
        {
            List <ShaderVariantsStripperFilter> filters = ShaderVariantsStripperConfigure.Configure.GetFilterList();

            if (shader.name == "LDJ/Standard")
            {
                Debug.Log("ss");
            }
            bool result = true;

            foreach (var filter in filters)
            {
                int filterresult = 0;
                //着色器名称
                if ((filter.mask & MatchLayer.Shader) == MatchLayer.Shader)
                {
                    // MatchLayer.Shader is allowed...
                    int ret = filter.shaderName == shader.name ? (int)(MatchLayer.Shader) : 0;
                    filterresult |= ret;
                }
                //着色器类型
                if ((filter.mask & MatchLayer.ShaderType) == MatchLayer.ShaderType)
                {
                    StripShaderType shaderType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.shaderType);
                    int             ret        = ((filter.shaderType & shaderType) == shaderType) ? (int)(MatchLayer.ShaderType) : 0;
                    filterresult |= ret;
                }
                //passType
                if ((filter.mask & MatchLayer.PassType) == MatchLayer.PassType)
                {
                    StripPassType passType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.passType);
                    int           ret      = ((filter.passType & passType) == passType) ? (int)(MatchLayer.PassType) : 0;
                    filterresult |= ret;
                }
                //shaderCompilerPlatform
                if ((filter.mask & MatchLayer.ShaderCompilerPlatform) == MatchLayer.ShaderCompilerPlatform)
                {
                    StripShaderCompilerPlatform shaderCompilerPlatform = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.shaderCompilerPlatform);
                    int ret = ((filter.shaderCompilerPlatform & shaderCompilerPlatform) == shaderCompilerPlatform) ? (int)(MatchLayer.ShaderCompilerPlatform) : 0;
                    filterresult |= ret;
                }
                //GraphicsTier
                if ((filter.mask & MatchLayer.GraphicsTier) == MatchLayer.GraphicsTier)
                {
                    StripGraphicsTier graphicsTier = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.graphicsTier);
                    int ret = ((filter.graphicsTier & graphicsTier) == graphicsTier) ? (int)(MatchLayer.GraphicsTier) : 0;
                    filterresult |= ret;
                }

                //builtinShaderDefine 黑名单有任意一种enable 就认为不通过
                if ((filter.mask & MatchLayer.BuiltinShaderDefine) == MatchLayer.BuiltinShaderDefine)
                {
                    UnityEngine.Rendering.BuiltinShaderDefine[] builtinShaderDefine = StripTypeConvert.ConvertStripTypeToUnityTypes(filter.builtinShaderDefine);
                    bool has = false;
                    for (int i = 0; i < builtinShaderDefine.Length; i++)
                    {
                        if (shaderVariant.platformKeywordSet.IsEnabled(builtinShaderDefine[i]))
                        {
                            has = true;
                            break;
                        }
                    }
                    int ret = has ? (int)(MatchLayer.BuiltinShaderDefine) : 0;
                    filterresult |= ret;
                }

                //ShaderRequirements
                if ((filter.mask & MatchLayer.ShaderRequirements) == MatchLayer.ShaderRequirements)
                {
                    int ret = (filter.shaderRequirements & shaderVariant.shaderRequirements) == filter.shaderRequirements ? (int)(MatchLayer.ShaderRequirements) : 0;
                    filterresult |= ret;
                }

                //Keywords
                if ((filter.mask & MatchLayer.Keywords) == MatchLayer.Keywords)
                {
                    //使用黑名单中的任意一个就剔除
                    bool ret = false;
                    foreach (var key in filter.keywords)
                    {
                        ShaderKeyword shaderKeyword = new ShaderKeyword(key);
                        ret = ret || shaderVariant.shaderKeywordSet.IsEnabled(shaderKeyword);
                        if (ret)
                        {
                            break;
                        }
                    }
                    int bitret = ret ? (int)(MatchLayer.Keywords) : 0;
                    filterresult |= bitret;
                }
                if (((int)filter.mask & filterresult) == (int)filter.mask)
                {
                    result = false;
                    break;
                }
                else
                {
                    continue;
                }
            }

            return(result);
        }
Ejemplo n.º 4
0
 public StripShaderSnippetData(UnityEditor.Rendering.ShaderSnippetData snippet)
 {
     shaderType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.shaderType);
     passType   = StripTypeConvert.ConvertUnityTypeToStripType(snippet.passType);
     passName   = snippet.passName;
 }
Ejemplo n.º 5
0
        public bool KeepVariantByWhitelist(Shader shader, ShaderSnippetData snippet, ShaderCompilerData shaderVariant)
        {
            List <ShaderVariantsStripperFilter> filters = ShaderVariantsStripperConfigure.Configure.GetFilterList();
            bool result = false;

            foreach (var filter in filters)
            {
                int filterresult = 0;
                //着色器名称
                if ((filter.mask & MatchLayer.Shader) == MatchLayer.Shader)
                {
                    int ret = filter.shaderName == shader.name ? (int)(MatchLayer.Shader) : 0;
                    //须要匹配名称 当前过滤条件的名称不符 跳过
                    if (ret == 0)
                    {
                        continue;
                    }
                    filterresult |= ret;
                }
                //着色器类型
                if ((filter.mask & MatchLayer.ShaderType) == MatchLayer.ShaderType)
                {
                    StripShaderType shaderType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.shaderType);
                    int             ret        = ((filter.shaderType & shaderType) == shaderType) ? (int)(MatchLayer.ShaderType) : 0;
                    filterresult |= ret;
                }
                //passType
                if ((filter.mask & MatchLayer.PassType) == MatchLayer.PassType)
                {
                    StripPassType passType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.passType);
                    int           ret      = ((filter.passType & passType) == passType) ? (int)(MatchLayer.PassType) : 0;
                    filterresult |= ret;
                }
                //shaderCompilerPlatform
                if ((filter.mask & MatchLayer.ShaderCompilerPlatform) == MatchLayer.ShaderCompilerPlatform)
                {
                    StripShaderCompilerPlatform shaderCompilerPlatform = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.shaderCompilerPlatform);
                    int ret = ((filter.shaderCompilerPlatform & shaderCompilerPlatform) == shaderCompilerPlatform) ? (int)(MatchLayer.ShaderCompilerPlatform) : 0;
                    filterresult |= ret;
                }
                //GraphicsTier
                if ((filter.mask & MatchLayer.GraphicsTier) == MatchLayer.GraphicsTier)
                {
                    StripGraphicsTier graphicsTier = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.graphicsTier);
                    int ret = ((filter.graphicsTier & graphicsTier) == graphicsTier) ? (int)(MatchLayer.GraphicsTier) : 0;
                    filterresult |= ret;
                }

                //builtinShaderDefine
                if ((filter.mask & MatchLayer.BuiltinShaderDefine) == MatchLayer.BuiltinShaderDefine)
                {
                    //所有enable的key 有一个不在列表里的 就认为不通过
                    UnityEngine.Rendering.BuiltinShaderDefine[]      builtinShaderDefine = StripTypeConvert.ConvertStripTypeToUnityTypes(filter.builtinShaderDefine);
                    List <UnityEngine.Rendering.BuiltinShaderDefine> enableList          = new List <UnityEngine.Rendering.BuiltinShaderDefine>(builtinShaderDefine);
                    bool  through = true;
                    Array array   = Enum.GetValues(typeof(UnityEngine.Rendering.BuiltinShaderDefine));
                    foreach (UnityEngine.Rendering.BuiltinShaderDefine v in array)
                    {
                        if (shaderVariant.platformKeywordSet.IsEnabled(v))
                        {
                            if (!enableList.Contains(v))
                            {
                                through = false;
                                break;
                            }
                        }
                    }
                    int ret = through ? (int)(MatchLayer.BuiltinShaderDefine) : 0;
                    filterresult |= ret;
                }

                //ShaderRequirements
                if ((filter.mask & MatchLayer.ShaderRequirements) == MatchLayer.ShaderRequirements)
                {
                    int ret = (filter.shaderRequirements & shaderVariant.shaderRequirements) == filter.shaderRequirements ? (int)(MatchLayer.ShaderRequirements) : 0;
                    filterresult |= ret;
                }

                //Keywords
                if ((filter.mask & MatchLayer.Keywords) == MatchLayer.Keywords)
                {
                    bool ret = true;
                    //当前变体用到的key
                    ShaderKeyword[] allkeys = shaderVariant.shaderKeywordSet.GetShaderKeywords();
                    foreach (ShaderKeyword akey in allkeys)
                    {
                        bool enable = shaderVariant.shaderKeywordSet.IsEnabled(akey);
                        if (enable)
                        {
                            string keyWordName = akey.GetKeywordName();
#if UNITY_2018_3_OR_NEWER
                            keyWordName = akey.GetKeywordName();
#else
                            keyWordName = akey.GetName();
#endif
                            bool include = filter.keywords.Contains(keyWordName);
                            ret = ret && include;
                            //使用了过滤名单以外的自定义key 跳出for 剔除变体
                            if (ret == false)
                            {
                                break;
                            }
                        }
                        else
                        {
                            continue;
                        }
                    }
                    int bitret = ret ? (int)(MatchLayer.Keywords) : 0;
                    filterresult |= bitret;
                }

                //有一个通过就是保留的
                if (((int)filter.mask & filterresult) == (int)filter.mask)
                {
                    result = true;
                    break;
                }
            }

            return(result);
        }