From 84f61cbb969e544eacb1570a9b12394acd760be6 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Tue, 27 Jul 2021 12:39:28 +0200 Subject: [PATCH 01/35] updated ShaderVariantTool with stripping numbers from C++ (read from Editor Log) --- .../ShaderVariantTool/ShaderVariantTool.cs | 557 ++++++++++-------- .../ShaderVariantTool.cs.meta | 2 +- .../ShaderVariantTool_BuildProcess.cs | 312 ++++++++++ ...=> ShaderVariantTool_BuildProcess.cs.meta} | 2 +- .../ShaderVariantTool_ComputePreprocess.cs | 111 ---- .../ShaderVariantTool_ComputeProcess.cs | 110 ++++ ... ShaderVariantTool_ComputeProcess.cs.meta} | 2 +- .../ShaderVariantTool_Helper.cs | 56 ++ ....meta => ShaderVariantTool_Helper.cs.meta} | 2 +- .../ShaderVariantTool_ShaderPreprocess.cs | 201 ------- .../ShaderVariantTool_ShaderProcess.cs | 109 ++++ ...> ShaderVariantTool_ShaderProcess.cs.meta} | 2 +- .../StrippingExample_ComputeShader.cs | 120 ---- .../StrippingExample_Shader.cs | 120 ---- 14 files changed, 898 insertions(+), 808 deletions(-) create mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs rename Assets/Editor/ShaderVariantTool/{StrippingExample_ComputeShader.cs.meta => ShaderVariantTool_BuildProcess.cs.meta} (83%) delete mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputePreprocess.cs create mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs rename Assets/Editor/ShaderVariantTool/{ShaderVariantTool_ComputePreprocess.cs.meta => ShaderVariantTool_ComputeProcess.cs.meta} (83%) create mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs rename Assets/Editor/ShaderVariantTool/{StrippingExample_Shader.cs.meta => ShaderVariantTool_Helper.cs.meta} (83%) delete mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderPreprocess.cs create mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs rename Assets/Editor/ShaderVariantTool/{ShaderVariantTool_ShaderPreprocess.cs.meta => ShaderVariantTool_ShaderProcess.cs.meta} (83%) delete mode 100644 Assets/Editor/ShaderVariantTool/StrippingExample_ComputeShader.cs delete mode 100644 Assets/Editor/ShaderVariantTool/StrippingExample_Shader.cs diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs index e64f6db..ec818fc 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs @@ -3,299 +3,354 @@ using System.Linq; using System.Collections.Generic; -public class ShaderVariantTool : EditorWindow +namespace GfxQA.ShaderVariantTool { - Vector2 scrollPosition; + public class ShaderVariantTool : EditorWindow + { + Vector2 scrollPosition; + + public static string folderPath = ""; + public static string savedFile = ""; + + //ColumnSetup + Color columnColor1 = new Color(0.3f,0.3f,0.3f,1); + Color columnColor2 = new Color(0.28f,0.28f,0.28f,1); + float[] widthScale = new float[] + { + 0, //we don't show shader name + + 0.9f, + 1.8f, + 1.2f, - public static string folderPath = ""; - public static string savedFile = ""; + 1.2f, + + 0.6f, + 0.8f, - //ColumnSetup - Color columnColor1 = new Color(0.3f,0.3f,0.3f,1); - Color columnColor2 = new Color(0.28f,0.28f,0.28f,1); - float[] widthScale = new float[] - { - 0, //we don't show shader name + 2.1f, + 1f, + 0.5f, + 0.5f, + 0.5f, - 0.9f, - 1.8f, - 1.2f, + 0.4f, + }; - 1.2f, + [MenuItem("Window/ShaderVariantTool")] + public static void ShowWindow () + { + var window = EditorWindow.GetWindow (typeof(ShaderVariantTool)); + window.name = "ShaderVariantTool"; + window.titleContent = new GUIContent("ShaderVariantTool"); + } - 0.6f, - 0.8f, - - 2.1f, - 1f, - 0.5f, - 0.5f, - 0.5f, + // public void Awake() + // { + // } - 0.4f, - }; + // public void OnDestroy() + // { + // } - [MenuItem("Window/ShaderVariantTool")] - public static void ShowWindow () - { - var window = EditorWindow.GetWindow (typeof(ShaderVariantTool)); - } + void OnGUI () + { + Color originalBackgroundColor = GUI.backgroundColor; - // public void Awake() - // { - // } + //Width for the columns & style + float currentSize = this.position.width; + float widthForEach = currentSize / (SVL.columns.Length-1+currentSize*0.0002f); + GUIStyle background = new GUIStyle + { + normal = + { + background = Texture2D.whiteTexture, + textColor = Color.white + } + }; - // public void OnDestroy() - // { - // } + //Title + GUI.color = Color.cyan; + GUILayout.Label ("Build the player and see the variants list here.", EditorStyles.wordWrappedLabel); + ShaderVariantTool_BuildPreprocess.deletePlayerCacheBeforeBuild = GUILayout.Toggle(ShaderVariantTool_BuildPreprocess.deletePlayerCacheBeforeBuild,"Delete PlayerCache Before Build"); + GUILayout.Space(10); + GUI.color = Color.white; - void OnGUI () - { - Color originalBackgroundColor = GUI.backgroundColor; + if(savedFile != "") + { + GUI.color = Color.green; - //Title - GUI.color = Color.cyan; - GUILayout.Label ("Build the player and see the variants list here.", EditorStyles.wordWrappedLabel); - GUI.color = Color.white; + GUILayout.Label ( "Build Time: " + SVL.buildTimeString, EditorStyles.wordWrappedLabel ); - if(savedFile != "") - { - GUI.color = Color.green; + GUILayout.Space(5); - //Result - GUILayout.Label ( "Build Time : " + SVL.buildTime.ToString("0.000") + " seconds", EditorStyles.wordWrappedLabel ); - GUILayout.Label ( "Shader Count : " + SVL.shaderlist.Count, EditorStyles.wordWrappedLabel ); - GUILayout.Label ( "Total Variant Count : " + SVL.variantTotalCount, EditorStyles.wordWrappedLabel ); - //GUILayout.Label ( "Total Data Count : " + SVL.compiledTotalCount, EditorStyles.wordWrappedLabel ); + //Result - Shader + GUI.color = Color.white; + GUILayout.Label ( "Shader" , EditorStyles.boldLabel ); + GUILayout.Label ( "Shader Count: " + SVL.normalShaderCount, EditorStyles.wordWrappedLabel ); + GUILayout.Label ( "Shader Variant Count before Stripping: " + SVL.variantBeforeStrippingCount, EditorStyles.wordWrappedLabel ); + GUILayout.Label ( "Shader Variant Count in Build: " + SVL.variantFromShader+ + " (cached:" + SVL.variantInCache + " compiled:" + SVL.variantCompiledCount +")", EditorStyles.wordWrappedLabel ); - //Saved file path - GUILayout.Label ( "Saved: "+savedFile, EditorStyles.wordWrappedLabel); + GUILayout.Space(5); - //Show folder button - GUI.color = Color.white; - if (GUILayout.Button ("Show in explorer",GUILayout.Width(200))) - { - System.Diagnostics.Process.Start("explorer.exe", "/select,"+savedFile.Replace(@"/", @"\")); // explorer doesn't like front slashes - } - } - GUI.color = Color.white; - GUILayout.Space(15); - - //Width for the columns & style - float currentSize = this.position.width; - float widthForEach = currentSize / (SVL.columns.Length-1+currentSize*0.0002f); - GUIStyle background = new GUIStyle - { - normal = - { - background = Texture2D.whiteTexture, - textColor = Color.white - } - }; + //Result - ComputeShader + GUI.color = Color.white; + GUILayout.Label ( "ComputeShader" , EditorStyles.boldLabel ); + GUILayout.Label ( "ComputeShader Count: " + SVL.computeShaderCount, EditorStyles.wordWrappedLabel ); + GUILayout.Label ( "ComputeShader Variant Count in Build: " + SVL.variantFromCompute, EditorStyles.wordWrappedLabel ); - //Column Titles - EditorGUILayout.BeginHorizontal(); - for(int i=1;i0 && SVL.rowData.Count > 0) - { - for(int k=1; k < SVL.rowData.Count; k++) //first row is title so start with 1 + //Column Titles + EditorGUILayout.BeginHorizontal(); + for(int i=1;i o.name == shaderName ); - CompiledShader currentShader = SVL.shaderlist[shaderIndex]; - - if(shaderName != SVL.rowData[k-1][0]) //show title + int al = i%2; + GUI.backgroundColor = al ==0 ? columnColor1 :columnColor2; + GUILayoutOption[] columnLayoutOption = new GUILayoutOption[] { - GUI.backgroundColor = originalBackgroundColor; - currentShader.guiEnabled = EditorGUILayout.Foldout( currentShader.guiEnabled, shaderName + " (" + currentShader.noOfVariantsForThisShader + ")" ); - SVL.shaderlist[shaderIndex] = currentShader; - } + GUILayout.Width(Mathf.RoundToInt(widthForEach*widthScale[i])), + GUILayout.Height(55) + }; + EditorGUILayout.LabelField (SVL.columns[i].Replace(" ","\n"),background,columnLayoutOption); + } + EditorGUILayout.EndHorizontal(); + + //Reset color + GUI.backgroundColor = originalBackgroundColor; + GUI.color = Color.white; - //Show the shader variants - if( currentShader.guiEnabled ) + //Scroll Start + scrollPosition = GUILayout.BeginScrollView(scrollPosition,GUILayout.Width(0),GUILayout.Height(0)); + + //Display result + if(SVL.shaderlist.Count >0 && SVL.rowData.Count > 0) + { + for(int k=1; k < SVL.rowData.Count; k++) //first row is title so start with 1 { - EditorGUILayout.BeginHorizontal(); - for(int i=1;i o.name == shaderName ); + CompiledShader currentShader = SVL.shaderlist[shaderIndex]; + + if(shaderName != SVL.rowData[k-1][0]) //show title { - string t = SVL.rowData[k][i]; - - int al = i%2; - GUI.backgroundColor = al ==0 ? columnColor1 :columnColor2; - if(t == "True") background.normal.textColor = Color.green; - else if(t == "False") background.normal.textColor = Color.red; - else if(t.Contains("[Global]")) background.normal.textColor = Color.cyan; - else if(t.Contains("[Local]")) background.normal.textColor = Color.yellow; - else background.normal.textColor = Color.white; + GUI.backgroundColor = originalBackgroundColor; + currentShader.guiEnabled = EditorGUILayout.Foldout( currentShader.guiEnabled, shaderName + " (" + currentShader.noOfVariantsForThisShader + ")" ); + SVL.shaderlist[shaderIndex] = currentShader; + } - EditorGUILayout.LabelField (t,background,GUILayout.Width(widthForEach*widthScale[i])); + //Show the shader variants + if( currentShader.guiEnabled ) + { + EditorGUILayout.BeginHorizontal(); + for(int i=1;i variantlist = new List(); - public static List shaderlist = new List(); - public static List rowData = new List(); - public static string[] columns = new string[] - { - "Shader", - "PassType", - "PassName", - "ShaderType", - "KernelName", - "GfxTier", - "Platform", - "Keyword Name", - "Keyword Type", - "Keyword Index", - "Keyword Valid", - "Keyword Enabled", - "Compiled Count" - }; - public static void ResetBuildList() + //Scroll End + GUILayout.FlexibleSpace(); + GUILayout.EndScrollView(); + EditorGUILayout.Separator(); + } + } + //=================================================================================================== + public static class SVL { - if(!buildProcessStarted) + //build process indicators + public static string buildProcessIDTitleStart = "ShaderVariantTool_Start:"; + public static string buildProcessIDTitleEnd = "ShaderVariantTool_End:"; + public static string buildProcessID = ""; //For recognising position in EditorLog + public static bool buildProcessStarted = false; + + //the big total + public static double buildTime = 0; + public static string buildTimeString = ""; + public static int compiledTotalCount = 0; //The number of data that the tool processed + public static int variantTotalCount = 0; //shader variant count + compute variant count + + //shader variant + public static int variantBeforeStrippingCount = 0; + public static int variantCompiledCount = 0; + public static int variantInCache = 0; + public static int normalShaderCount = 0; + public static int variantFromShader = 0; + + //compute shader variant + public static int variantFromCompute = 0; + public static int computeShaderCount = 0; + + //data + public static List variantlist = new List(); + public static List shaderlist = new List(); + public static List rowData = new List(); + public static string[] columns = new string[] { - SVL.shaderlist.Clear(); - SVL.variantlist.Clear(); - SVL.compiledTotalCount = 0; - SVL.variantTotalCount = 0; + "Shader", + "PassType", + "PassName", + "ShaderType", + "KernelName", + "GfxTier", + "Platform", + "Keyword Name", + "Keyword Type", + "Keyword Index", + "Keyword Valid", + "Keyword Enabled", + "Compiled Count" + }; - buildProcessStarted = true; + public static void ResetBuildList() + { + if(!buildProcessStarted) + { + shaderlist.Clear(); + variantlist.Clear(); + buildTime = 0; + buildTimeString = ""; + compiledTotalCount = 0; + variantTotalCount = 0; + variantBeforeStrippingCount = 0; + variantCompiledCount = 0; + variantInCache = 0; + variantFromCompute = 0; + variantFromShader = 0; + computeShaderCount = 0; + normalShaderCount = 0; + + //For reading EditorLog, we can extract the contents + buildProcessID = System.DateTime.Now.ToString("yyyyMMdd_hh-mm-ss"); + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, buildProcessIDTitleStart+buildProcessID); + + buildProcessStarted = true; + } } - } - public static void Sorting() - { - //sort the list according to shader name - variantlist = variantlist.OrderBy(o=>o.shaderName).ThenBy(o=>o.shaderType).ThenBy(o=>o.shaderKeywordIndex).ToList(); + public static void Sorting() + { + //sort the list according to shader name + variantlist = variantlist.OrderBy(o=>o.shaderName).ThenBy(o=>o.shaderType).ThenBy(o=>o.shaderKeywordIndex).ToList(); - //Unique item and duplicate counts - Dictionary uniqueSet = new Dictionary(); + //Unique item and duplicate counts + Dictionary uniqueSet = new Dictionary(); - //count duplicates - for(int i=0; i ShaderVariantTool."); + } + + //Calculate shader count by type + SVL.normalShaderCount = SVL.shaderlist.Count - SVL.computeShaderCount; + SVL.variantFromShader = SVL.variantTotalCount - SVL.variantFromCompute; + + //Reading EditorLog + ReadShaderCompileInfo(); + + //Calculate build time + SVL.buildTime = EditorApplication.timeSinceStartup - SVL.buildTime; + SVL.buildTimeString = Helper.TimeFormatString(SVL.buildTime); + + //Sort the results and make row data + SVL.Sorting(); + + //Prepare CSV string + List outputRows = new List(); + + //Get Unity & branch version + string version_changeset = Convert.ToString(InternalEditorUtility.GetUnityRevision(), 16); + string version_branch = InternalEditorUtility.GetUnityBuildBranch(); + string unity_version = Application.unityVersion +" "+ version_branch+" ("+version_changeset+")"; + + //Get Graphics API list + var gfxAPIsList = PlayerSettings.GetGraphicsAPIs(report.summary.platform); + string gfxAPIs = ""; + for(int i=0; i 0) + { + currentLine = sr.ReadLine(); + while (!currentLine.Contains("finished in ")) + { + currentLine = sr.ReadLine(); + } + } + + //compilation time and compiled variant count (time is faster if there are cached variants) + string compileTime = "0.00"; + string compiledVariants = "0"; + string localCache = "0"; + string remoteCache = "0"; + if(remainingVariantInt > 0) + { + compileTime = Helper.ExtractString(currentLine, "finished in " , " seconds. " ); + compiledVariants = Helper.ExtractString(currentLine, ", compiled " , " variants" ); + localCache = Helper.ExtractString(currentLine, "Local cache hits " , ", remote" ); + remoteCache = Helper.ExtractString(currentLine, "remote cache hits " , ", compiled" ); + + //Changes for the latest PR + localCache = Helper.ExtractString(localCache, "" , "(" ); + localCache = localCache.Replace(" ",""); + remoteCache = Helper.ExtractString(remoteCache, "" , "(" ); + remoteCache = remoteCache.Replace(" ",""); + } + int compiledVariantsInt = int.Parse(compiledVariants); + int localCacheInt = int.Parse(localCache); + int remoteCacheInt = int.Parse(remoteCache); + float strippingTimeFloat = float.Parse(strippingTime); + float compileTimeFloat = float.Parse(compileTime); + + //---------- Add to ShaderList ------------// + int listID = SVL.shaderlist.IndexOf(SVL.shaderlist.Find(x => x.name.Equals(shaderName))); + CompiledShader temp = SVL.shaderlist[listID]; + temp.editorLog_originalVariantCount += totalVariantInt; + temp.editorLog_compiledVariantCount += compiledVariantsInt; + temp.editorLog_totalProcessTime += strippingTimeFloat+compileTimeFloat; + temp.editorLog_remainingVariantCount += remainingVariantInt; + temp.editorLog_variantInCacheCount += localCacheInt+remoteCacheInt; + SVL.shaderlist[listID] = temp; + //---------- For total countinvariantInCacheg ------------// + SVL.variantBeforeStrippingCount += totalVariantInt; + SVL.variantCompiledCount += compiledVariantsInt; + SVL.variantInCache += localCacheInt+remoteCacheInt; + variantCountinBuild += remainingVariantInt; //for making sure no bug + + //Debug + // if(shaderName == "Universal Render Pipeline/Lit") + // { + // string debugText = shaderName +"-"+ passName +"-"+ programName + "\n"; + // debugText += totalVariant +"-"+ remainingVariant +"-time-"+ strippingTime + "\n"; + // debugText += compileTime +"-"+ compiledVariants + "\n"; + // DebugLog(debugText); + // } + } + } + } + } + + //Bug check - in case my codes in OnProcessShader VS reading EditorLog counts different result + if( SVL.variantFromShader != variantCountinBuild) + { + Debug.LogError("ShaderVariantTool error. "+ + "Tool counted there are "+SVL.variantFromShader+" shader variants in build, "+ + "but Editor Log counted "+variantCountinBuild+". Please contact @mingwai on slack."); + } + if( SVL.variantInCache + SVL.variantCompiledCount != variantCountinBuild) + { + Debug.LogError("ShaderVariantTool error. "+ + "The sum of "+SVL.variantInCache+" variants in cache + "+ + SVL.variantCompiledCount+" variants compiled is not equal to the accumulated sum "+ + variantCountinBuild+" variants. Please contact @mingwai on slack."); + } + } + } +} \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/StrippingExample_ComputeShader.cs.meta b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs.meta similarity index 83% rename from Assets/Editor/ShaderVariantTool/StrippingExample_ComputeShader.cs.meta rename to Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs.meta index 3fcaed5..0629987 100644 --- a/Assets/Editor/ShaderVariantTool/StrippingExample_ComputeShader.cs.meta +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ad676cf801f055d42aed65efe0cbbf79 +guid: 171bb6f9bb873ae4fb544c4d7110a245 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputePreprocess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputePreprocess.cs deleted file mode 100644 index 92ef89c..0000000 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputePreprocess.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using UnityEditor; -using UnityEditor.Build; -using UnityEditor.Build.Reporting; -using UnityEditor.Rendering; -using UnityEngine; -using UnityEngine.Rendering; - -class ShaderVariantTool_ComputePreprocess : IPreprocessComputeShaders -{ - public ShaderVariantTool_ComputePreprocess() - { - //Debug.Log("ShaderVariantTool_ComputePreprocess starts now.."); - SVL.ResetBuildList(); - } - - public int callbackOrder { get { return 10; } } - - public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList data) - { - int newVariantsForThisShader = 0; - - //The real variant count - newVariantsForThisShader+=data.Count; - - //Go through all the variants - for (int i = 0; i < data.Count; ++i) - { - ShaderKeyword[] sk = data[i].shaderKeywordSet.GetShaderKeywords(); - - //The default variant - if(sk.Length==0) - { - CompiledShaderVariant scv_default = new CompiledShaderVariant(); - //scv.id = id; - scv_default.shaderName = shader.name; - scv_default.kernelName = kernelName; - scv_default.passName = "--"; - scv_default.passType = "--"; - scv_default.shaderType = "--"; - scv_default.graphicsTier = "--"; - scv_default.shaderCompilerPlatform = "--"; - scv_default.shaderKeywordName = "No Keyword / All Off"; - scv_default.shaderKeywordType = "--"; - scv_default.shaderKeywordIndex = "-1"; - scv_default.isShaderKeywordValid = "--"; - scv_default.isShaderKeywordEnabled = "--"; - SVL.variantlist.Add(scv_default); - SVL.compiledTotalCount++; - } - - for (int k = 0; k < sk.Length; ++k) - { - CompiledShaderVariant scv = new CompiledShaderVariant(); - - //scv.id = id; - scv.shaderName = shader.name; - scv.kernelName = kernelName; - scv.passName = "--"; - scv.passType = "--"; - scv.shaderType = "--"; - - scv.graphicsTier = data[i].graphicsTier.ToString(); - scv.shaderCompilerPlatform = data[i].shaderCompilerPlatform.ToString(); - //scv.shaderRequirements = ""+data[i].shaderRequirements; - //scv.platformKeywordName = ""+data[i].platformKeywordSet.ToString(); - //scv.isplatformKeywordEnabled = ""+data[i].platformKeywordSet.IsEnabled(BuiltinShaderDefine.SHADER_API_DESKTOP); - - bool isLocal = ShaderKeyword.IsKeywordLocal(sk[k]); - scv.shaderKeywordName = ( isLocal? "[Local] " : "[Global] " ) + ShaderKeyword.GetKeywordName(shader,sk[k]); //sk[k].GetKeywordName(); - scv.shaderKeywordType = ShaderKeyword.GetKeywordType(shader,sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); - scv.shaderKeywordIndex = sk[k].index.ToString(); - scv.isShaderKeywordValid = sk[k].IsValid().ToString(); - scv.isShaderKeywordEnabled = data[i].shaderKeywordSet.IsEnabled(sk[k]).ToString(); - - SVL.variantlist.Add(scv); - SVL.compiledTotalCount++; - - //Just to verify API is correct - string globalShaderKeywordName = ShaderKeyword.GetGlobalKeywordName(sk[k]); - if( !isLocal && globalShaderKeywordName != ShaderKeyword.GetKeywordName(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordName() and ShaderKeyword.GetKeywordName() is wrong"); - ShaderKeywordType globalShaderKeywordType = ShaderKeyword.GetGlobalKeywordType(sk[k]); - if( !isLocal && globalShaderKeywordType != ShaderKeyword.GetKeywordType(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordType() and ShaderKeyword.GetKeywordType() is wrong"); - } - } - - //Add to shader list - int compiledShaderId = SVL.shaderlist.FindIndex( o=> o.name == shader.name ); - if( compiledShaderId == -1 ) - { - CompiledShader newCompiledShader = new CompiledShader(); - newCompiledShader.name = shader.name; - newCompiledShader.guiEnabled = false; - newCompiledShader.noOfVariantsForThisShader = 0; - SVL.shaderlist.Add(newCompiledShader); - compiledShaderId=SVL.shaderlist.Count-1; - } - - //Add variant count to shader - CompiledShader compiledShader = SVL.shaderlist[compiledShaderId]; - compiledShader.noOfVariantsForThisShader += newVariantsForThisShader; - SVL.shaderlist[compiledShaderId] = compiledShader; - - //Add to total count - SVL.variantTotalCount+=newVariantsForThisShader; - } -} \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs new file mode 100644 index 0000000..bbc569e --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; +using UnityEditor.Build; +using UnityEditor.Rendering; +using UnityEngine; +using UnityEngine.Rendering; + +namespace GfxQA.ShaderVariantTool +{ + class ShaderVariantTool_ComputePreprocess : IPreprocessComputeShaders + { + public ShaderVariantTool_ComputePreprocess() + { + SVL.ResetBuildList(); + } + + public int callbackOrder { get { return 10; } } + + public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList data) + { + int newVariantsForThisShader = 0; + + //The real variant count + newVariantsForThisShader+=data.Count; + + //Go through all the variants + for (int i = 0; i < data.Count; ++i) + { + ShaderKeyword[] sk = data[i].shaderKeywordSet.GetShaderKeywords(); + + //The default variant + if(sk.Length==0) + { + CompiledShaderVariant scv_default = new CompiledShaderVariant(); + //scv.id = id; + scv_default.shaderName = shader.name; + scv_default.kernelName = kernelName; + scv_default.passName = "--"; + scv_default.passType = "--"; + scv_default.shaderType = "--"; + scv_default.graphicsTier = "--"; + scv_default.shaderCompilerPlatform = "--"; + scv_default.shaderKeywordName = "No Keyword / All Off"; + scv_default.shaderKeywordType = "--"; + scv_default.shaderKeywordIndex = "-1"; + scv_default.isShaderKeywordValid = "--"; + scv_default.isShaderKeywordEnabled = "--"; + SVL.variantlist.Add(scv_default); + SVL.compiledTotalCount++; + } + + for (int k = 0; k < sk.Length; ++k) + { + CompiledShaderVariant scv = new CompiledShaderVariant(); + + //scv.id = id; + scv.shaderName = shader.name; + scv.kernelName = kernelName; + scv.passName = "--"; + scv.passType = "--"; + scv.shaderType = "--"; + + scv.graphicsTier = data[i].graphicsTier.ToString(); + scv.shaderCompilerPlatform = data[i].shaderCompilerPlatform.ToString(); + //scv.shaderRequirements = ""+data[i].shaderRequirements; + //scv.platformKeywordName = ""+data[i].platformKeywordSet.ToString(); + //scv.isplatformKeywordEnabled = ""+data[i].platformKeywordSet.IsEnabled(BuiltinShaderDefine.SHADER_API_DESKTOP); + + bool isLocal = ShaderKeyword.IsKeywordLocal(sk[k]); + LocalKeyword lkey = new LocalKeyword(shader,sk[k].name); + scv.shaderKeywordName = ( isLocal? "[Local] " : "[Global] " ) + sk[k].name; //sk[k].GetKeywordName(); + scv.shaderKeywordType = isLocal? "--" : ShaderKeyword.GetGlobalKeywordType(sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); + scv.shaderKeywordIndex = sk[k].index.ToString(); + scv.isShaderKeywordValid = sk[k].IsValid().ToString(); + scv.isShaderKeywordEnabled = data[i].shaderKeywordSet.IsEnabled(sk[k]).ToString(); + + SVL.variantlist.Add(scv); + SVL.compiledTotalCount++; + + //Just to verify API is correct + //string globalShaderKeywordName = ShaderKeyword.GetGlobalKeywordName(sk[k]); + //if( !isLocal && globalShaderKeywordName != ShaderKeyword.GetKeywordName(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordName() and ShaderKeyword.GetKeywordName() is wrong"); + // ShaderKeywordType globalShaderKeywordType = ShaderKeyword.GetGlobalKeywordType(sk[k]); + //if( !isLocal && globalShaderKeywordType != ShaderKeyword.GetKeywordType(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordType() and ShaderKeyword.GetKeywordType() is wrong"); + } + } + + //Add to shader list + int compiledShaderId = SVL.shaderlist.FindIndex( o=> o.name == shader.name ); + if( compiledShaderId == -1 ) + { + CompiledShader newCompiledShader = new CompiledShader(); + newCompiledShader.name = shader.name; + newCompiledShader.guiEnabled = false; + newCompiledShader.noOfVariantsForThisShader = 0; + SVL.shaderlist.Add(newCompiledShader); + SVL.computeShaderCount++; + compiledShaderId=SVL.shaderlist.Count-1; + } + + //Add variant count to shader + CompiledShader compiledShader = SVL.shaderlist[compiledShaderId]; + compiledShader.noOfVariantsForThisShader += newVariantsForThisShader; + SVL.shaderlist[compiledShaderId] = compiledShader; + + //Add to total count + SVL.variantTotalCount+=newVariantsForThisShader; + SVL.variantFromCompute+=newVariantsForThisShader; + } + } +} \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputePreprocess.cs.meta b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs.meta similarity index 83% rename from Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputePreprocess.cs.meta rename to Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs.meta index 8325fe1..1cff742 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputePreprocess.cs.meta +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 937781451af9258439d4bf6a4bc25a5c +guid: 8fa435c07a42a0d43b00c3e22266e704 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs new file mode 100644 index 0000000..9163396 --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs @@ -0,0 +1,56 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace GfxQA.ShaderVariantTool +{ + public static class Helper + { + public static string TimeFormatString (double timeInSeconds) + { + float t = (float)timeInSeconds; + + float hour = t / 3600f; + hour = Mathf.Floor(hour); + t -= hour*3600f; + + float minute = t / 60f; + minute = Mathf.Floor(minute); + t -= minute*60f; + + float second = t; + + string timeString = ""; + + if(hour > 0) timeString += hour + "hr "; + if(minute > 0) timeString += minute + "m "; + timeString += second.ToString("0.0") + "s"; + + return timeString; + } + + public static string ExtractString(string line, string from, string to) + { + int pFrom = 0; + if(from != "") + { + int index = line.IndexOf(from); + if(index >= 0) pFrom = index + from.Length; + } + + int pTo = line.Length; + if(to != "") + { + int index = line.LastIndexOf(to); + if(index >= 0) pTo = index; + } + + return line.Substring(pFrom, pTo - pFrom); + } + + public static void DebugLog(string msg) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, msg); + } + } +} \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/StrippingExample_Shader.cs.meta b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs.meta similarity index 83% rename from Assets/Editor/ShaderVariantTool/StrippingExample_Shader.cs.meta rename to Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs.meta index 1b59610..3f6d98c 100644 --- a/Assets/Editor/ShaderVariantTool/StrippingExample_Shader.cs.meta +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1524d39ccbcca6549b18d0dc494d7b28 +guid: 293d6b684a0eef0419f5fc4fa73244d5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderPreprocess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderPreprocess.cs deleted file mode 100644 index e9f6ba2..0000000 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderPreprocess.cs +++ /dev/null @@ -1,201 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using UnityEditor; -using UnityEditor.Build; -using UnityEditor.Build.Reporting; -using UnityEditor.Rendering; -using UnityEditorInternal; -using UnityEngine; -using UnityEngine.Rendering; - -class ShaderVariantTool_ShaderPreprocess : IPreprocessShaders -{ - public ShaderVariantTool_ShaderPreprocess() - { - SVL.ResetBuildList(); - } - - public int callbackOrder { get { return 10; } } - - public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList data) - { - int newVariantsForThisShader = 0; - - //The real variant count - newVariantsForThisShader+=data.Count; - - //Go through all the variants - for (int i = 0; i < data.Count; ++i) - { - ShaderKeyword[] sk = data[i].shaderKeywordSet.GetShaderKeywords(); - - //The default variant - if(sk.Length==0) - { - CompiledShaderVariant scv_default = new CompiledShaderVariant(); - //scv.id = id; - scv_default.shaderName = shader.name; - scv_default.passName = snippet.passName; - scv_default.passType = snippet.passType.ToString(); - scv_default.shaderType = snippet.shaderType.ToString(); - scv_default.kernelName = "--"; - scv_default.graphicsTier = "--"; - scv_default.shaderCompilerPlatform = "--"; - scv_default.shaderKeywordName = "No Keyword / All Off"; - scv_default.shaderKeywordType = "--"; - scv_default.shaderKeywordIndex = "-1"; - scv_default.isShaderKeywordValid = "--"; - scv_default.isShaderKeywordEnabled = "--"; - SVL.variantlist.Add(scv_default); - SVL.compiledTotalCount++; - } - - for (int k = 0; k < sk.Length; ++k) - { - CompiledShaderVariant scv = new CompiledShaderVariant(); - - //scv.id = id; - scv.shaderName = shader.name; - scv.passName = snippet.passName; - scv.passType = snippet.passType.ToString(); - scv.shaderType = snippet.shaderType.ToString(); - scv.kernelName = "--"; - - scv.graphicsTier = data[i].graphicsTier.ToString(); - scv.shaderCompilerPlatform = data[i].shaderCompilerPlatform.ToString(); - //scv.shaderRequirements = ""+data[i].shaderRequirements; - //scv.platformKeywordName = ""+data[i].platformKeywordSet.ToString(); - //scv.isplatformKeywordEnabled = ""+data[i].platformKeywordSet.IsEnabled(BuiltinShaderDefine.SHADER_API_DESKTOP); - - bool isLocal = ShaderKeyword.IsKeywordLocal(sk[k]); - scv.shaderKeywordName = ( isLocal? "[Local] " : "[Global] " ) + ShaderKeyword.GetKeywordName(shader,sk[k]); //sk[k].GetKeywordName(); - scv.shaderKeywordType = ShaderKeyword.GetKeywordType(shader,sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); - scv.shaderKeywordIndex = sk[k].index.ToString(); - scv.isShaderKeywordValid = sk[k].IsValid().ToString(); - scv.isShaderKeywordEnabled = data[i].shaderKeywordSet.IsEnabled(sk[k]).ToString(); - - SVL.variantlist.Add(scv); - SVL.compiledTotalCount++; - - //Just to verify API is correct - string globalShaderKeywordName = ShaderKeyword.GetGlobalKeywordName(sk[k]); - if( !isLocal && globalShaderKeywordName != ShaderKeyword.GetKeywordName(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordName() and ShaderKeyword.GetKeywordName() is wrong"); - ShaderKeywordType globalShaderKeywordType = ShaderKeyword.GetGlobalKeywordType(sk[k]); - if( !isLocal && globalShaderKeywordType != ShaderKeyword.GetKeywordType(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordType() and ShaderKeyword.GetKeywordType() is wrong"); - } - } - - //Add to shader list - int compiledShaderId = SVL.shaderlist.FindIndex( o=> o.name == shader.name ); - if( compiledShaderId == -1 ) - { - CompiledShader newCompiledShader = new CompiledShader(); - newCompiledShader.name = shader.name; - newCompiledShader.guiEnabled = false; - newCompiledShader.noOfVariantsForThisShader = 0; - SVL.shaderlist.Add(newCompiledShader); - compiledShaderId=SVL.shaderlist.Count-1; - } - - //Add variant count to shader - CompiledShader compiledShader = SVL.shaderlist[compiledShaderId]; - compiledShader.noOfVariantsForThisShader += newVariantsForThisShader; - SVL.shaderlist[compiledShaderId] = compiledShader; - - //Add to total count - SVL.variantTotalCount+=newVariantsForThisShader; - } -} - -class ShaderVariantTool_BuildPreprocess : IPreprocessBuildWithReport -{ - public int callbackOrder { get { return 10; } } - public void OnPreprocessBuild(BuildReport report) - { - //Debug.Log("ShaderVariantTool_BuildPreprocess starts now.."); - SVL.ResetBuildList(); - SVL.buildTime = EditorApplication.timeSinceStartup; - } -} - -class ShaderVariantTool_BuildPostprocess : IPostprocessBuildWithReport -{ - public int callbackOrder { get { return 10; } } - - public void OnPostprocessBuild(BuildReport report) - { - //Calculate build time - SVL.buildTime = EditorApplication.timeSinceStartup - SVL.buildTime; - - //Sort the results and make row data - SVL.Sorting(); - - //Prepare CSV string - List outputRows = new List(); - - //Get Unity & branch version - string version_changeset = Convert.ToString(InternalEditorUtility.GetUnityRevision(), 16); - string version_branch = InternalEditorUtility.GetUnityBuildBranch(); - string unity_version = Application.unityVersion +" "+ version_branch+" ("+version_changeset+")"; - - //Get Graphics API list - var gfxAPIsList = PlayerSettings.GetGraphicsAPIs(report.summary.platform); - string gfxAPIs = ""; - for(int i=0; i data) + { + + int newVariantsForThisShader = 0; + + //The real variant count + newVariantsForThisShader+=data.Count; + + //Go through all the variants + for (int i = 0; i < data.Count; ++i) + { + ShaderKeyword[] sk = data[i].shaderKeywordSet.GetShaderKeywords(); + + //The default variant + if(sk.Length==0) + { + CompiledShaderVariant scv_default = new CompiledShaderVariant(); + //scv.id = id; + scv_default.shaderName = shader.name; + scv_default.passName = snippet.passName; + scv_default.passType = snippet.passType.ToString(); + scv_default.shaderType = snippet.shaderType.ToString(); + scv_default.kernelName = "--"; + scv_default.graphicsTier = "--"; + scv_default.shaderCompilerPlatform = "--"; + scv_default.shaderKeywordName = "No Keyword / All Off"; + scv_default.shaderKeywordType = "--"; + scv_default.shaderKeywordIndex = "-1"; + scv_default.isShaderKeywordValid = "--"; + scv_default.isShaderKeywordEnabled = "--"; + SVL.variantlist.Add(scv_default); + SVL.compiledTotalCount++; + } + + for (int k = 0; k < sk.Length; ++k) + { + CompiledShaderVariant scv = new CompiledShaderVariant(); + + //scv.id = id; + scv.shaderName = shader.name; + scv.passName = snippet.passName; + scv.passType = snippet.passType.ToString(); + scv.shaderType = snippet.shaderType.ToString(); + scv.kernelName = "--"; + + scv.graphicsTier = data[i].graphicsTier.ToString(); + scv.shaderCompilerPlatform = data[i].shaderCompilerPlatform.ToString(); + //scv.shaderRequirements = ""+data[i].shaderRequirements; + //scv.platformKeywordName = ""+data[i].platformKeywordSet.ToString(); + //scv.isplatformKeywordEnabled = ""+data[i].platformKeywordSet.IsEnabled(BuiltinShaderDefine.SHADER_API_DESKTOP); + + bool isLocal = ShaderKeyword.IsKeywordLocal(sk[k]); + LocalKeyword lkey = new LocalKeyword(shader,sk[k].name); + scv.shaderKeywordName = ( isLocal? "[Local] " : "[Global] " ) + sk[k].name; //sk[k].GetKeywordName(); + scv.shaderKeywordType = isLocal? "--" : ShaderKeyword.GetGlobalKeywordType(sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); + scv.shaderKeywordIndex = sk[k].index.ToString(); + scv.isShaderKeywordValid = sk[k].IsValid().ToString(); + scv.isShaderKeywordEnabled = data[i].shaderKeywordSet.IsEnabled(sk[k]).ToString(); + + SVL.variantlist.Add(scv); + SVL.compiledTotalCount++; + + //Just to verify API is correct + //string globalShaderKeywordName = ShaderKeyword.GetGlobalKeywordName(sk[k]); + //if( !isLocal && globalShaderKeywordName != ShaderKeyword.GetKeywordName(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordName() and ShaderKeyword.GetKeywordName() is wrong"); + //ShaderKeywordType globalShaderKeywordType = ShaderKeyword.GetGlobalKeywordType(sk[k]); + //if( !isLocal && globalShaderKeywordType != ShaderKeyword.GetKeywordType(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordType() and ShaderKeyword.GetKeywordType() is wrong"); + } + } + + //Add to shader list + int compiledShaderId = SVL.shaderlist.FindIndex( o=> o.name == shader.name ); + if( compiledShaderId == -1 ) + { + CompiledShader newCompiledShader = new CompiledShader(); + newCompiledShader.name = shader.name; + newCompiledShader.guiEnabled = false; + newCompiledShader.noOfVariantsForThisShader = 0; + SVL.shaderlist.Add(newCompiledShader); + compiledShaderId=SVL.shaderlist.Count-1; + } + + //Add variant count to shader + CompiledShader compiledShader = SVL.shaderlist[compiledShaderId]; + compiledShader.noOfVariantsForThisShader += newVariantsForThisShader; + SVL.shaderlist[compiledShaderId] = compiledShader; + + //Add to total count + SVL.variantTotalCount+=newVariantsForThisShader; + } + } +} \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderPreprocess.cs.meta b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs.meta similarity index 83% rename from Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderPreprocess.cs.meta rename to Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs.meta index 175ba9c..9014ccc 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderPreprocess.cs.meta +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4dc752aea56c0fa4c916a268239c0e37 +guid: fdea0328180d5c842997838d906ffd14 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Editor/ShaderVariantTool/StrippingExample_ComputeShader.cs b/Assets/Editor/ShaderVariantTool/StrippingExample_ComputeShader.cs deleted file mode 100644 index f0c73eb..0000000 --- a/Assets/Editor/ShaderVariantTool/StrippingExample_ComputeShader.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEditor.Build; -using UnityEditor.Rendering; -using UnityEngine; -using UnityEngine.Rendering; - -class StrippingExample_ComputeShader : IPreprocessComputeShaders -{ - private int m_TotalShaderVariantsInputCount = 0; - private int m_TotalShaderVariantsOutputCount = 0; - - public StrippingExample_ComputeShader() - { - } - - public int callbackOrder { get { return 0; } } - - // Strip entire shader - public bool StripComputeShader(ComputeShader shader) - { - if ( - shader.name == "EXAMPLE/Hidden/VideoDecode" || - shader.name == "EXAMPLE/BoatAttack/PackedPBR" - ) - return true; - return false; - } - - // Strip entire kernel - public bool StripComputeKernel(string kernelName) - { - if ( - kernelName == "EXAMPLE/CoC Temporal Filter" || - kernelName == "EXAMPLE2" - ) - return true; - return false; - } - - // Strip specific keywords - // shaderKeywordSet.IsEnabled always return false for local keywords - // public bool StripComputeVariant(ShaderCompilerData data) - // { - // if ( - // data.shaderKeywordSet.IsEnabled(new ShaderKeyword("EXAMPLE_UNITY_COLORSPACE_GAMMA")) || - // data.shaderKeywordSet.IsEnabled(new ShaderKeyword("EXAMPLE_DISTORT")) - // ) - // return true; - // return false; - // } - - // Strip specific keywords by name - public bool StripComputeVariant(string variantText) - { - if ( - variantText.Contains("_xxxGOKEY1") || - variantText.Contains("_xxxLOKEY2") - ) - return true; - return false; - } - - public bool StripLogic(ComputeShader shader, string kernelName, string variantText) - { - if (StripComputeShader(shader)) - return true; - - if (StripComputeKernel(kernelName)) - return true; - - if (shader.name.IndexOf("xxxCompute_ShaderVariant") >= 0) - if (StripComputeVariant(variantText)) - return true; - - return false; - } - - public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList data) - { - int initDataCount = data.Count; - - for (int i = 0; i < data.Count; ++i) - { - //Get a string of keywords - string variantText = ""; - foreach(ShaderKeyword s in data[i].shaderKeywordSet.GetShaderKeywords()) - { - variantText += " " +ShaderKeyword.GetKeywordName(shader,s); - } - - if ( StripLogic(shader, kernelName, variantText) ) - { - Debug.Log(CText("Stripped compute shader variant: "+shader.name + "(" + kernelName + ") Variant:" + variantText )); - - //Strip the variant - data.RemoveAt(i); - --i; - } - } - - m_TotalShaderVariantsInputCount += initDataCount; - m_TotalShaderVariantsOutputCount += data.Count; - - - //For summary stripping result - //float percentageCurrent = (float)data.Count / (float)initDataCount * 100f; - //float percentageTotal = (float)m_TotalShaderVariantsOutputCount / (float)m_TotalShaderVariantsInputCount * 100f; - //string result = "STRIPPING RESULT: " + shader.name + "(" + snippet.shaderType.ToString() + ") - Remaining shader variants = " + data.Count + " / " + initDataCount + " = " + percentageCurrent + "% - Total = " + m_TotalShaderVariantsOutputCount + " / " + m_TotalShaderVariantsInputCount + " = " + percentageTotal + "%"; - - //if( percentageCurrent > 90f) Debug.Log(RText(result)); - //else if( percentageCurrent > 50f) Debug.Log(YText(result)); - //else Debug.Log(GText(result)); - } - - private string GText(string text) { return "" + text + ""; } - private string YText(string text) { return "" + text + ""; } - private string RText(string text) { return "" + text + ""; } - private string CText(string text) { return "" + text + ""; } -} \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/StrippingExample_Shader.cs b/Assets/Editor/ShaderVariantTool/StrippingExample_Shader.cs deleted file mode 100644 index 19bd158..0000000 --- a/Assets/Editor/ShaderVariantTool/StrippingExample_Shader.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEditor.Build; -using UnityEditor.Rendering; -using UnityEngine; -using UnityEngine.Rendering; - -class StrippingExample_Shader : IPreprocessShaders -{ - private int m_TotalShaderVariantsInputCount = 0; - private int m_TotalShaderVariantsOutputCount = 0; - - public StrippingExample_Shader() - { - - } - - public int callbackOrder { get { return 0; } } - - // Strip entire shader - public bool StripEntireShader(Shader shader) - { - if ( - shader.name == "EXAMPLE/Hidden/VideoDecode" || - shader.name == "EXAMPLE/BoatAttack/PackedPBR" - ) - return true; - return false; - } - - // Strip entire pass - public bool StripEntirePass(ShaderSnippetData snippet) - { - if ( - snippet.passName == "EXAMPLE/CoC Temporal Filter" - //snippet.passType == PassType.Meta - ) - return true; - return false; - } - - // Strip specific keywords - // shaderKeywordSet.IsEnabled always return false for local keywords - // public bool StripVariant(ShaderCompilerData data) - // { - // if ( - // data.shaderKeywordSet.IsEnabled(new ShaderKeyword("EXAMPLE_UNITY_COLORSPACE_GAMMA")) || - // data.shaderKeywordSet.IsEnabled(new ShaderKeyword("EXAMPLE_DISTORT")) - // ) - // return true; - // return false; - // } - - // Strip specific keywords by name - public bool StripVariant(string variantText) - { - if ( - variantText.Contains("_xxxGOKEY2") || - variantText.Contains("_xxxLOKEY1") - ) - return true; - return false; - } - - public bool StripLogic(Shader shader, ShaderSnippetData snippet, string variantText) - { - if (StripEntireShader(shader)) - return true; - - if (StripEntirePass(snippet)) - return true; - - if (shader.name.IndexOf("xxxGraphicsGeneral_FTP/Shader_Keyword_Global_MultiCompile") >= 0) - if (StripVariant(variantText)) - return true; - - return false; - } - - public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList data) - { - int initDataCount = data.Count; - - for (int i = 0; i < data.Count; ++i) - { - //Get a string of keywords - string variantText = ""; - foreach(ShaderKeyword s in data[i].shaderKeywordSet.GetShaderKeywords()) - { - variantText += " " +ShaderKeyword.GetKeywordName(shader,s); - } - - if ( StripLogic(shader, snippet, variantText) ) - { - Debug.Log(CText("Stripped variant: "+shader.name + "(" + snippet.shaderType.ToString() + ") Variant:" + variantText )); - - //Strip the variant - data.RemoveAt(i); - --i; - } - } - - m_TotalShaderVariantsInputCount += initDataCount; - m_TotalShaderVariantsOutputCount += data.Count; - - //For summary stripping result - //float percentageCurrent = (float)data.Count / (float)initDataCount * 100f; - //float percentageTotal = (float)m_TotalShaderVariantsOutputCount / (float)m_TotalShaderVariantsInputCount * 100f; - //string result = "STRIPPING RESULT: " + shader.name + "(" + snippet.shaderType.ToString() + ") - Remaining shader variants = " + data.Count + " / " + initDataCount + " = " + percentageCurrent + "% - Total = " + m_TotalShaderVariantsOutputCount + " / " + m_TotalShaderVariantsInputCount + " = " + percentageTotal + "%"; - - //if( percentageCurrent > 90f) Debug.Log(RText(result)); - //else if( percentageCurrent > 50f) Debug.Log(YText(result)); - //else Debug.Log(GText(result)); - } - - private string GText(string text) { return "" + text + ""; } - private string YText(string text) { return "" + text + ""; } - private string RText(string text) { return "" + text + ""; } - private string CText(string text) { return "" + text + ""; } -} \ No newline at end of file From c8ca1afdef75065229ac33bd1ba1983e70ea45b8 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Tue, 7 Sep 2021 17:17:27 +0200 Subject: [PATCH 02/35] add move objects to ground (cherry picked from commit 2abd4a6620e9fd644ffb26b7a1e775b7ad0c797e) --- Assets/Editor/PlaceObjectsTool.cs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Assets/Editor/PlaceObjectsTool.cs b/Assets/Editor/PlaceObjectsTool.cs index 200a49d..c3be3df 100644 --- a/Assets/Editor/PlaceObjectsTool.cs +++ b/Assets/Editor/PlaceObjectsTool.cs @@ -144,6 +144,13 @@ void OnGUI () EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); + //Place Objects to Ground + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button ("Move Objects to Ground")) MoveObjectToGround(); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); + //Copy paste object transform copyFromTrans = (Transform)EditorGUILayout.ObjectField("Copy transform from",copyFromTrans, typeof(Transform), true); EditorGUILayout.BeginHorizontal(); @@ -360,6 +367,25 @@ private Vector3 RandomV3(Vector3 rmin, Vector3 rmax) return v; } + void MoveObjectToGround() + { + SetSelectionObjects(); + + //Prevent error + if(objs == null) return; + + for (int i = 0; i < objs.Length; i++) + { + Vector3 pos = objs[i].transform.position; + Vector3 sca = objs[i].transform.localScale; + + pos.y = sca.y * 0.5f; + + Undo.RecordObject(objs[i].transform, "MoveObjectToGround"); + objs[i].transform.position = pos; + } + } + void AlignObjects() { SetSelectionObjects(); From 67f6c7641527b6d5f72e0239caa397accff0cc23 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Wed, 15 Sep 2021 00:55:49 +0200 Subject: [PATCH 03/35] update Readme for 2021.2 --- Assets/Editor/ShaderVariantTool/README.md | 22 ++++--------------- Assets/Editor/ShaderVariantTool/README01.jpg | Bin 108262 -> 78264 bytes 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/Assets/Editor/ShaderVariantTool/README.md b/Assets/Editor/ShaderVariantTool/README.md index 59ff9ad..30c0c90 100644 --- a/Assets/Editor/ShaderVariantTool/README.md +++ b/Assets/Editor/ShaderVariantTool/README.md @@ -1,29 +1,15 @@ # ShaderVariantTool -This tool lists out all shader variants that are being included in player build. \ +This tool lists out all shader keywords and variant counts that are being included in player build. \ i.e. If a shader keyword is being stripped, you won't see the keyword on the list. \ \ -2020.2+ +Unity 2021.2+ only \ +If you need older Unity versions please check out to branches ### How to use: -1. Add the scripts to an Editor folder: \ -ShaderVariantTool.cs \ -ShaderVariantTool_ComputePreprocess.cs \ -ShaderVariantTool_ShaderPreprocess.cs +1. Add the scripts to an Editor folder \ 2. Make a player build 3. Top > Windows > ShaderVariantTool \ \ ![](README01.jpg) - - -# ShaderStripping Example scripts - -### How to use: -1. Add the scripts to an Editor folder: \ -StrippingExample_Shader.cs \ -StrippingExample_ComputeShader.cs -2. Edit the scripts so that you can define what you want to strip -3. Make a player build -4. You can use ShaderVariantTool to verify if those variants are stripped - diff --git a/Assets/Editor/ShaderVariantTool/README01.jpg b/Assets/Editor/ShaderVariantTool/README01.jpg index 665977490309f9dc798b4b861789852587e9586f..67b3242d750c5fd084261a2c4f7f1c5134aef7d2 100644 GIT binary patch literal 78264 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 literal 108262 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 From bb36a876b33cde446a50e3b3178028e967be5cbe Mon Sep 17 00:00:00 2001 From: mingwai Date: Fri, 24 Sep 2021 14:25:46 +0200 Subject: [PATCH 04/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c91e54..577576d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SimpleTools Some tools I made for making my daily work easier. \ -Unity version : 2020.2+ on master. For older versions pleaase see branches. +Unity version : 2021.2+ on master. For older versions pleaase see branches. ## Editor From 9776e563671938f8a58504f0679f6088a6cac795 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Thu, 16 Dec 2021 17:48:35 +0100 Subject: [PATCH 05/35] upgrade to 2022.1 --- Assets/Editor/ShaderVariantTool/README.md | 5 +++-- .../ShaderVariantTool/ShaderVariantTool_BuildProcess.cs | 6 +++++- .../ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs | 3 ++- .../ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs | 3 ++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Assets/Editor/ShaderVariantTool/README.md b/Assets/Editor/ShaderVariantTool/README.md index 30c0c90..a290743 100644 --- a/Assets/Editor/ShaderVariantTool/README.md +++ b/Assets/Editor/ShaderVariantTool/README.md @@ -3,8 +3,9 @@ This tool lists out all shader keywords and variant counts that are being includ i.e. If a shader keyword is being stripped, you won't see the keyword on the list. \ \ -Unity 2021.2+ only \ -If you need older Unity versions please check out to branches +Unity 2022.1.0a14+ \ +If you need older Unity versions please check out to branches \ + ### How to use: 1. Add the scripts to an Editor folder \ diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs index 5687272..06b9693 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs @@ -221,6 +221,10 @@ private void ReadShaderCompileInfo() //total variant currentLine = sr.ReadLine(); + if (currentLine.Contains("prepared") && !currentLine.Contains("variants, prepared")) + { + currentLine = sr.ReadLine(); + } string totalVariant = Helper.ExtractString(currentLine, "" , " variants," ); totalVariant = totalVariant.Replace(" ",""); int totalVariantInt = int.Parse(totalVariant); @@ -235,7 +239,7 @@ private void ReadShaderCompileInfo() if(remainingVariantInt > 0) { currentLine = sr.ReadLine(); - while (!currentLine.Contains("finished in ")) + while (!currentLine.Contains("finished in ") || currentLine.Contains("variants ready")) { currentLine = sr.ReadLine(); } diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs index bbc569e..c94383e 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs @@ -67,7 +67,8 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis bool isLocal = ShaderKeyword.IsKeywordLocal(sk[k]); LocalKeyword lkey = new LocalKeyword(shader,sk[k].name); - scv.shaderKeywordName = ( isLocal? "[Local] " : "[Global] " ) + sk[k].name; //sk[k].GetKeywordName(); + bool isDynamic = lkey.isDynamic; + scv.shaderKeywordName = ( isLocal? "[Local]" : "[Global]" ) + ( isDynamic? "[Dynamic] " : " " ) + sk[k].name; //sk[k].GetKeywordName(); scv.shaderKeywordType = isLocal? "--" : ShaderKeyword.GetGlobalKeywordType(sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); scv.shaderKeywordIndex = sk[k].index.ToString(); scv.isShaderKeywordValid = sk[k].IsValid().ToString(); diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs index e52a503..0d086ac 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs @@ -68,7 +68,8 @@ public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList Date: Wed, 4 May 2022 16:07:49 +0200 Subject: [PATCH 06/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 577576d..554194e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SimpleTools Some tools I made for making my daily work easier. \ -Unity version : 2021.2+ on master. For older versions pleaase see branches. +Unity version : 2022.1+ on master. For older versions pleaase see branches. ## Editor From 385f1d54af15f65b830b18df0b0074526c59b3bd Mon Sep 17 00:00:00 2001 From: Ming Wai Chan Date: Tue, 10 May 2022 16:29:50 +0200 Subject: [PATCH 07/35] update for 2022.1.0f1. Add buildTarget and platform keywords (SHADER_API ones) and remove columns of keyword index, valid & enabled because they are not that useful. But instead, will print an error/warning if a keyword is not valid / not enabled. Also fixed on Mac, added Log reader for previous build info. --- .../ShaderVariantTool/ShaderVariantTool.cs | 48 ++-- .../ShaderVariantTool_BuildProcess.cs | 229 ++++++++++++------ .../ShaderVariantTool_ComputeProcess.cs | 23 +- .../ShaderVariantTool_Helper.cs | 43 +++- .../ShaderVariantTool_LogReader.cs | 136 +++++++++++ .../ShaderVariantTool_ShaderProcess.cs | 25 +- 6 files changed, 389 insertions(+), 115 deletions(-) create mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs index ec818fc..89bb6f1 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs @@ -21,18 +21,21 @@ public class ShaderVariantTool : EditorWindow 0.9f, 1.8f, - 1.2f, + 1f, - 1.2f, + 1.5f, 0.6f, + 0.8f, + 0.5f, + 0.8f, 2.1f, - 1f, - 0.5f, - 0.5f, 0.5f, + //0.5f, + //0.5f, + //0.5f, 0.4f, }; @@ -210,6 +213,10 @@ public static class SVL //compute shader variant public static int variantFromCompute = 0; public static int computeShaderCount = 0; + + //invalid or disabled keywords for final error logging + public static string invalidKey = ""; + public static string disabledKey = ""; //data public static List variantlist = new List(); @@ -223,12 +230,15 @@ public static class SVL "ShaderType", "KernelName", "GfxTier", - "Platform", + "Build Target", + "Compiler Platform", + //"Require", + "Platform Keywords", "Keyword Name", "Keyword Type", - "Keyword Index", - "Keyword Valid", - "Keyword Enabled", + //"Keyword Index", + //"Keyword Valid", + //"Keyword Enabled", "Compiled Count" }; @@ -261,7 +271,7 @@ public static void ResetBuildList() public static void Sorting() { //sort the list according to shader name - variantlist = variantlist.OrderBy(o=>o.shaderName).ThenBy(o=>o.shaderType).ThenBy(o=>o.shaderKeywordIndex).ToList(); + variantlist = variantlist.OrderBy(o=>o.shaderName).ThenBy(o=>o.shaderType).ThenBy(o=>o.shaderKeywordName).ToList(); //Unique item and duplicate counts Dictionary uniqueSet = new Dictionary(); @@ -298,12 +308,15 @@ public static void Sorting() variantlist[k].shaderType, variantlist[k].kernelName, variantlist[k].graphicsTier, + variantlist[k].buildTarget, variantlist[k].shaderCompilerPlatform, + //variantlist[k].shaderRequirements, + variantlist[k].platformKeywords, variantlist[k].shaderKeywordName, variantlist[k].shaderKeywordType, - variantlist[k].shaderKeywordIndex, - variantlist[k].isShaderKeywordValid, - variantlist[k].isShaderKeywordEnabled, + //variantlist[k].shaderKeywordIndex, + //variantlist[k].isShaderKeywordValid, + //variantlist[k].isShaderKeywordEnabled, uniqueSet[variantlist[k]].ToString()}); } @@ -338,19 +351,20 @@ public struct CompiledShaderVariant //data public string graphicsTier; + public string buildTarget; public string shaderCompilerPlatform; //public string shaderRequirements; //data - PlatformKeywordSet - //public string platformKeywordName; + public string platformKeywords; //public string isplatformKeywordEnabled; //from PlatformKeywordSet //data - ShaderKeywordSet public string shaderKeywordName; //ShaderKeyword.GetKeywordName public string shaderKeywordType; //ShaderKeyword.GetKeywordType - public string shaderKeywordIndex; //ShaderKeyword.index - public string isShaderKeywordValid; //from ShaderKeyword.IsValid() - public string isShaderKeywordEnabled; //from ShaderKeywordSet + //public string shaderKeywordIndex; //ShaderKeyword.index + //public string isShaderKeywordValid; //from ShaderKeyword.IsValid() + //public string isShaderKeywordEnabled; //from ShaderKeywordSet }; } diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs index 06b9693..a31ec67 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs @@ -53,7 +53,7 @@ public void OnPostprocessBuild(BuildReport report) //Because of the new incremental build changes, Development build won't trigger OnShaderProcess - 1338940 if(SVL.shaderlist.Count == 0) { - Debug.LogError("No shader or variant are logged. Please turn ON Delete PlayerCache Before Build checkbox in Window > ShaderVariantTool."); + Debug.LogError("No shader or variant are logged. Please go to Window > ShaderVariantTool > turn ON Delete PlayerCache Before Build checkbox."); } //Calculate shader count by type @@ -61,7 +61,8 @@ public void OnPostprocessBuild(BuildReport report) SVL.variantFromShader = SVL.variantTotalCount - SVL.variantFromCompute; //Reading EditorLog - ReadShaderCompileInfo(); + string editorLogPath = Helper.GetEditorLogPath(); + ReadShaderCompileInfo(SVL.buildProcessIDTitleStart+SVL.buildProcessID, editorLogPath, false); //Calculate build time SVL.buildTime = EditorApplication.timeSinceStartup - SVL.buildTime; @@ -109,10 +110,33 @@ public void OnPostprocessBuild(BuildReport report) //outputRows.Add( new string[] { "ComputeShaders ----------------------------------" } ); outputRows.Add( new string[] { "ComputeShader Count" , SVL.computeShaderCount.ToString() } ); outputRows.Add( new string[] { "ComputeShader Variant Count in Build" , SVL.variantFromCompute.ToString() } ); - - //outputRows.Add( new string[] { "Total Data Count" , ""+SVL.compiledTotalCount } ); outputRows.Add( new string[] { "" } ); + //Write Shader Result from Editor Log + outputRows = AddEditorLogShaderInfo(outputRows, SVL.shaderlist); + outputRows.Add( new string[] { "" } ); + + //Write Each variant Result + for(int i = 0; i < SVL.rowData.Count; i++) + { + outputRows.Add( SVL.rowData[i] ); + } + + //Save File + string fileName = "ShaderVariants_"+DateTime.Now.ToString("yyyyMMdd_hh-mm-ss"); + ShaderVariantTool.savedFile = SaveCSVFile(outputRows, fileName); + + //CleanUp + outputRows.Clear(); + + //Let user know the tool has successfully done it's job + Debug.Log("Build is done and ShaderVariantTool has done gathering data. Find the details on Windows > ShaderVariantTool, or look at the generated CSV report at: "+ShaderVariantTool.savedFile); + + SVL.buildProcessStarted = false; + } + + public static List AddEditorLogShaderInfo(List outputRows, List shaderlist) + { //Write Shader Result outputRows.Add( new string[] { @@ -123,27 +147,25 @@ public void OnPostprocessBuild(BuildReport report) "Variant Count in Build", "Stripping+Compilation Time" } ); - for(int i = 0; i < SVL.shaderlist.Count; i++) + for(int i = 0; i outputRows, string fileName) + { //Prepare CSV string int length = outputRows.Count; string delimiter = ","; @@ -153,39 +175,30 @@ public void OnPostprocessBuild(BuildReport report) //Write to CSV file ShaderVariantTool.folderPath = Application.dataPath.Replace("/Assets","/"); - ShaderVariantTool.savedFile = ShaderVariantTool.folderPath+"ShaderVariants_"+DateTime.Now.ToString("yyyyMMdd_hh-mm-ss")+".csv"; - StreamWriter outStream = System.IO.File.CreateText(ShaderVariantTool.savedFile); + string savedFile = ShaderVariantTool.folderPath+fileName+".csv"; + StreamWriter outStream = System.IO.File.CreateText(savedFile); outStream.WriteLine(sb); outStream.Close(); //CleanUp outputRows.Clear(); - SVL.buildProcessStarted = false; + return savedFile; } - //[MenuItem("ShaderVariantTool/Debug/TestEditorLog")] - private void ReadShaderCompileInfo() + public static List ReadShaderCompileInfo(string startTimeStamp, string editorLogPath, bool isLogReader) { //For making sure there is no bug int variantCountinBuild = 0; - //Decide EditorLog path - string editorLogPath = ""; - switch(Application.platform) - { - case RuntimePlatform.WindowsEditor: editorLogPath=Environment.GetEnvironmentVariable("AppData").Replace("Roaming","")+"Local\\Unity\\Editor\\Editor.log"; break; - case RuntimePlatform.OSXEditor: editorLogPath=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Library")+"/Logs/Unity/Editor.log"; break; - case RuntimePlatform.LinuxEditor: editorLogPath="~/.config/unity3d/Editor.log"; break; - } - //Read EditorLog - string fromtext = SVL.buildProcessIDTitleStart+SVL.buildProcessID; - string totext = SVL.buildProcessIDTitleEnd+SVL.buildProcessID; + string fromtext = startTimeStamp; + string totext = startTimeStamp.Replace(SVL.buildProcessIDTitleStart,SVL.buildProcessIDTitleEnd); string currentLine = ""; bool startFound = false; bool endFound = false; FileStream fs = new FileStream(editorLogPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + List compiledShaderInfoFromEditorLog = new List(); using (StreamReader sr = new StreamReader(fs)) { while (!startFound) @@ -219,22 +232,25 @@ private void ReadShaderCompileInfo() string programName = Helper.ExtractString(currentLine, passName+"\" (",""); programName = programName.Replace("\"","").Replace(")",""); - //total variant + //skip the line bla bla bla prepared currentLine = sr.ReadLine(); - if (currentLine.Contains("prepared") && !currentLine.Contains("variants, prepared")) + while(!currentLine.Contains("variants left after stripping, ")) { currentLine = sr.ReadLine(); } - string totalVariant = Helper.ExtractString(currentLine, "" , " variants," ); - totalVariant = totalVariant.Replace(" ",""); - int totalVariantInt = int.Parse(totalVariant); //remaining variant & stripping time - currentLine = sr.ReadLine(); - string strippingTime = Helper.ExtractString(currentLine, "finished in " , " seconds. " ); - string remainingVariant = Helper.ExtractString(currentLine, " seconds. " , " variants left" ); + string remainingVariant = Helper.ExtractString(currentLine, "" , " / " ); int remainingVariantInt = int.Parse(remainingVariant); + //total variant + string totalVariant = Helper.ExtractString(currentLine, "/ " , " variants" ); + totalVariant = totalVariant.Replace(" ",""); + int totalVariantInt = int.Parse(totalVariant); + + //stripping time + string strippingTime = Helper.ExtractString(currentLine, "variants left after stripping, processed in " , " seconds" ); + //jump to line of compilation time if(remainingVariantInt > 0) { @@ -246,44 +262,69 @@ private void ReadShaderCompileInfo() } //compilation time and compiled variant count (time is faster if there are cached variants) + string remainingText = currentLine; + string startString = ""; + string endString = ""; string compileTime = "0.00"; string compiledVariants = "0"; string localCache = "0"; string remoteCache = "0"; if(remainingVariantInt > 0) { - compileTime = Helper.ExtractString(currentLine, "finished in " , " seconds. " ); - compiledVariants = Helper.ExtractString(currentLine, ", compiled " , " variants" ); - localCache = Helper.ExtractString(currentLine, "Local cache hits " , ", remote" ); - remoteCache = Helper.ExtractString(currentLine, "remote cache hits " , ", compiled" ); - - //Changes for the latest PR - localCache = Helper.ExtractString(localCache, "" , "(" ); + //Compile time + startString = "finished in "; + endString = " seconds. "; + compileTime = Helper.ExtractString(remainingText,startString,endString,false); + compileTime = compileTime.Replace(" ",""); + remainingText = Helper.GetRemainingString(remainingText,endString); + + //Local cache hit + startString = "Local cache hits "; + endString = " ("; + localCache = Helper.ExtractString(remainingText,startString,endString,false); localCache = localCache.Replace(" ",""); - remoteCache = Helper.ExtractString(remoteCache, "" , "(" ); + remainingText = Helper.GetRemainingString(remainingText,endString); + + //Remote cache hit + startString = "remote cache hits "; + endString = " ("; + remoteCache = Helper.ExtractString(remainingText,startString,endString,false); remoteCache = remoteCache.Replace(" ",""); + remainingText = Helper.GetRemainingString(remainingText,endString); + + //Compiled variants + startString = "), compiled "; + endString = " variants ("; + compiledVariants = Helper.ExtractString(remainingText,startString,endString,false); + compiledVariants = compiledVariants.Replace(" ",""); + remainingText = Helper.GetRemainingString(remainingText,endString); } int compiledVariantsInt = int.Parse(compiledVariants); int localCacheInt = int.Parse(localCache); int remoteCacheInt = int.Parse(remoteCache); float strippingTimeFloat = float.Parse(strippingTime); float compileTimeFloat = float.Parse(compileTime); - - //---------- Add to ShaderList ------------// - int listID = SVL.shaderlist.IndexOf(SVL.shaderlist.Find(x => x.name.Equals(shaderName))); - CompiledShader temp = SVL.shaderlist[listID]; - temp.editorLog_originalVariantCount += totalVariantInt; - temp.editorLog_compiledVariantCount += compiledVariantsInt; - temp.editorLog_totalProcessTime += strippingTimeFloat+compileTimeFloat; - temp.editorLog_remainingVariantCount += remainingVariantInt; - temp.editorLog_variantInCacheCount += localCacheInt+remoteCacheInt; - SVL.shaderlist[listID] = temp; - //---------- For total countinvariantInCacheg ------------// - SVL.variantBeforeStrippingCount += totalVariantInt; - SVL.variantCompiledCount += compiledVariantsInt; - SVL.variantInCache += localCacheInt+remoteCacheInt; - variantCountinBuild += remainingVariantInt; //for making sure no bug - + //---------- Temp object info ------------// + CompiledShader temp = new CompiledShader(); + temp.name = shaderName; + temp.editorLog_originalVariantCount = totalVariantInt; + temp.editorLog_compiledVariantCount = compiledVariantsInt; + temp.editorLog_totalProcessTime = strippingTimeFloat+compileTimeFloat; + temp.editorLog_remainingVariantCount = remainingVariantInt; + temp.editorLog_variantInCacheCount = localCacheInt+remoteCacheInt; + //---------- Add to temp list ------------// + int templistID = compiledShaderInfoFromEditorLog.IndexOf(compiledShaderInfoFromEditorLog.Find(x => x.name.Equals(temp.name))); + if(templistID == -1) + { + //Add a new shader record + compiledShaderInfoFromEditorLog.Add(temp); + } + else + { + //Add to existing shader record + compiledShaderInfoFromEditorLog[templistID] = AccumulateToCompiledShader(temp,compiledShaderInfoFromEditorLog[templistID]); + } + //Debug // if(shaderName == "Universal Render Pipeline/Lit") // { @@ -297,20 +338,52 @@ private void ReadShaderCompileInfo() } } - //Bug check - in case my codes in OnProcessShader VS reading EditorLog counts different result - if( SVL.variantFromShader != variantCountinBuild) + if(!isLogReader) { - Debug.LogError("ShaderVariantTool error. "+ - "Tool counted there are "+SVL.variantFromShader+" shader variants in build, "+ - "but Editor Log counted "+variantCountinBuild+". Please contact @mingwai on slack."); - } - if( SVL.variantInCache + SVL.variantCompiledCount != variantCountinBuild) - { - Debug.LogError("ShaderVariantTool error. "+ - "The sum of "+SVL.variantInCache+" variants in cache + "+ - SVL.variantCompiledCount+" variants compiled is not equal to the accumulated sum "+ - variantCountinBuild+" variants. Please contact @mingwai on slack."); + for(int i=0; i x.name.Equals(compiledShaderInfoFromEditorLog[i].name))); + SVL.shaderlist[listID] = AccumulateToCompiledShader(compiledShaderInfoFromEditorLog[i],SVL.shaderlist[listID]); + //---------- For total countinvariantInCacheg ------------// + SVL.variantBeforeStrippingCount += compiledShaderInfoFromEditorLog[i].editorLog_originalVariantCount; + SVL.variantCompiledCount += compiledShaderInfoFromEditorLog[i].editorLog_compiledVariantCount; + SVL.variantInCache += compiledShaderInfoFromEditorLog[i].editorLog_variantInCacheCount; + variantCountinBuild += compiledShaderInfoFromEditorLog[i].editorLog_remainingVariantCount; //for making sure no bug + } + + //Bug check - in case my codes in OnProcessShader VS reading EditorLog counts different result + if( SVL.variantFromShader != variantCountinBuild) + { + Debug.LogError("ShaderVariantTool error. "+ + "Tool counted there are "+SVL.variantFromShader+" shader variants in build, "+ + "but Editor Log counted "+variantCountinBuild+". Please contact @mingwai on slack."); + } + int variantCacheAndCompiledSum = SVL.variantInCache + SVL.variantCompiledCount; + if( variantCacheAndCompiledSum != variantCountinBuild) + { + Debug.LogError("ShaderVariantTool error. "+ + "The sum of shader variants in EditorLog ("+variantCacheAndCompiledSum+" = "+SVL.variantInCache+" in cache + "+ + SVL.variantCompiledCount+" compiled) is not equal to the sum of shader variants collected by ShaderVariantTool ("+ + variantCountinBuild+"). Please contact @mingwai on slack. This could be related to exisiting known issue: Case 1389276"); + } + + //Print invalid / disabled keyword error + if(SVL.invalidKey != "") Debug.LogError("Some shader keywords are invalid: "+SVL.invalidKey); + if(SVL.disabledKey != "") Debug.LogWarning("Some shader keywords are disabled but they are not being stripped: "+SVL.disabledKey); } + + return compiledShaderInfoFromEditorLog; + } + + private static CompiledShader AccumulateToCompiledShader(CompiledShader src, CompiledShader dst) + { + dst.editorLog_originalVariantCount += src.editorLog_originalVariantCount; + dst.editorLog_compiledVariantCount += src.editorLog_compiledVariantCount; + dst.editorLog_totalProcessTime += src.editorLog_totalProcessTime; + dst.editorLog_remainingVariantCount += src.editorLog_remainingVariantCount; + dst.editorLog_variantInCacheCount += src.editorLog_variantInCacheCount; + + return dst; } } } \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs index c94383e..6d55f6a 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs @@ -38,12 +38,12 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis scv_default.passType = "--"; scv_default.shaderType = "--"; scv_default.graphicsTier = "--"; + scv_default.buildTarget = "--"; scv_default.shaderCompilerPlatform = "--"; + //scv_default.shaderRequirements = "--"; + scv_default.platformKeywords = "--"; scv_default.shaderKeywordName = "No Keyword / All Off"; scv_default.shaderKeywordType = "--"; - scv_default.shaderKeywordIndex = "-1"; - scv_default.isShaderKeywordValid = "--"; - scv_default.isShaderKeywordEnabled = "--"; SVL.variantlist.Add(scv_default); SVL.compiledTotalCount++; } @@ -60,19 +60,24 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis scv.shaderType = "--"; scv.graphicsTier = data[i].graphicsTier.ToString(); + scv.buildTarget = data[i].buildTarget.ToString(); scv.shaderCompilerPlatform = data[i].shaderCompilerPlatform.ToString(); - //scv.shaderRequirements = ""+data[i].shaderRequirements; - //scv.platformKeywordName = ""+data[i].platformKeywordSet.ToString(); - //scv.isplatformKeywordEnabled = ""+data[i].platformKeywordSet.IsEnabled(BuiltinShaderDefine.SHADER_API_DESKTOP); + //scv.shaderRequirements = data[i].shaderRequirements.ToString().Replace(",","\n"); + scv.platformKeywords =Helper.GetPlatformKeywordList(data[i].platformKeywordSet); bool isLocal = ShaderKeyword.IsKeywordLocal(sk[k]); LocalKeyword lkey = new LocalKeyword(shader,sk[k].name); bool isDynamic = lkey.isDynamic; scv.shaderKeywordName = ( isLocal? "[Local]" : "[Global]" ) + ( isDynamic? "[Dynamic] " : " " ) + sk[k].name; //sk[k].GetKeywordName(); scv.shaderKeywordType = isLocal? "--" : ShaderKeyword.GetGlobalKeywordType(sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); - scv.shaderKeywordIndex = sk[k].index.ToString(); - scv.isShaderKeywordValid = sk[k].IsValid().ToString(); - scv.isShaderKeywordEnabled = data[i].shaderKeywordSet.IsEnabled(sk[k]).ToString(); + if( !sk[k].IsValid() ) + { + SVL.invalidKey += "\n"+"Shader "+scv.shaderName+" Keyword "+scv.shaderKeywordName+" is invalid."; + } + if( !data[i].shaderKeywordSet.IsEnabled(sk[k]) ) + { + SVL.disabledKey += "\n"+"Shader "+scv.shaderName+" Keyword "+scv.shaderKeywordName+" is not enabled. You can create a custom shader stripping script to strip it."; + } SVL.variantlist.Add(scv); SVL.compiledTotalCount++; diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs index 9163396..4ee2832 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs @@ -1,6 +1,9 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.Rendering; +using System; +using System.IO; namespace GfxQA.ShaderVariantTool { @@ -29,7 +32,13 @@ public static string TimeFormatString (double timeInSeconds) return timeString; } - public static string ExtractString(string line, string from, string to) + public static string GetRemainingString(string line, string from) + { + int index = line.IndexOf(from) + from.Length; + return line.Substring( index , line.Length - index); + } + + public static string ExtractString(string line, string from, string to, bool takeLastIndexOfTo = true) { int pFrom = 0; if(from != "") @@ -42,6 +51,11 @@ public static string ExtractString(string line, string from, string to) if(to != "") { int index = line.LastIndexOf(to); + if(!takeLastIndexOfTo) + { + index = line.IndexOf(to); + } + if(index >= 0) pTo = index; } @@ -52,5 +66,32 @@ public static void DebugLog(string msg) { Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, msg); } + + public static string GetPlatformKeywordList(PlatformKeywordSet pks) + { + string enabledPKeys = ""; + foreach(BuiltinShaderDefine sd in System.Enum.GetValues(typeof(BuiltinShaderDefine))) + { + //Only pay attention to SHADER_API_MOBILE, SHADER_API_DESKTOP and SHADER_API_GLES30 + if( sd.ToString().Contains("SHADER_API") && pks.IsEnabled(sd) ) + { + if(enabledPKeys != "") enabledPKeys += " "; + enabledPKeys += sd.ToString(); + } + } + return enabledPKeys; + } + + public static string GetEditorLogPath() + { + string editorLogPath = ""; + switch(Application.platform) + { + case RuntimePlatform.WindowsEditor: editorLogPath=Environment.GetEnvironmentVariable("AppData").Replace("Roaming","")+"Local\\Unity\\Editor\\Editor.log"; break; + case RuntimePlatform.OSXEditor: editorLogPath=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Library")+"/Logs/Unity/Editor.log"; break; + case RuntimePlatform.LinuxEditor: editorLogPath="~/.config/unity3d/Editor.log"; break; + } + return editorLogPath; + } } } \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs new file mode 100644 index 0000000..4e2b0e5 --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs @@ -0,0 +1,136 @@ +using UnityEditor; +using UnityEngine; +using System.IO; +using System.Linq; +using System.Collections.Generic; + +namespace GfxQA.ShaderVariantTool +{ + public class ShaderVariantTool_LogReader : EditorWindow + { + private List timeStamps; + private int selectedTimeStamp = 0; + private string editorLogPath = ""; + private string savedFile = ""; + + [MenuItem("Window/ShaderVariantTool_LogReader")] + public static void ShowWindow () + { + var window = EditorWindow.GetWindow (typeof(ShaderVariantTool_LogReader)); + window.name = "ShaderVariantTool LogReader"; + window.titleContent = new GUIContent("ShaderVariantTool LogReader"); + } + + public void Awake() + { + editorLogPath = Helper.GetEditorLogPath(); + } + + private void UpdateTimeStampList() + { + timeStamps = new List(); + FileStream fs = new FileStream(editorLogPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + using (StreamReader sr = new StreamReader(fs)) + { + string line; + while ((line = sr.ReadLine()) != null) + { + if(line.Contains(SVL.buildProcessIDTitleStart)) + { + timeStamps.Add(line); + } + } + } + } + + // public void OnDestroy() + // { + // } + + void OnGUI () + { + Color originalBackgroundColor = GUI.backgroundColor; + + //Width for the columns & style + float currentSize = this.position.width; + float widthForEach = currentSize / (SVL.columns.Length-1+currentSize*0.0002f); + GUIStyle background = new GUIStyle + { + normal = + { + background = Texture2D.whiteTexture, + textColor = Color.white + } + }; + + //Title + GUI.color = Color.cyan; + GUILayout.Label ("This log reader is for reading previous builds, which only reads information about variant count before/after stripping per shader. \n"+"Therefore detailed shader keywords and compute shader information is not available. So please only use this if the original ShaderVariantTool doesn't work.", EditorStyles.wordWrappedLabel); + GUILayout.Space(10); + GUI.color = Color.white; + + //Editor.Log path textbox + editorLogPath = GUILayout.TextField(editorLogPath); + + //TimeStamp select: drop down and a button to update drop down + if(timeStamps== null) UpdateTimeStampList(); + selectedTimeStamp = EditorGUILayout.Popup("Select timestamp", selectedTimeStamp, timeStamps.ToArray()); + if (GUILayout.Button ("Update TimeStampList",GUILayout.Width(200))) + { + UpdateTimeStampList(); + } + + //Read log and save the CSV file + if (GUILayout.Button ("Read log",GUILayout.Width(200))) + { + //ReadLog + List slist = ShaderVariantTool_BuildPostprocess.ReadShaderCompileInfo(timeStamps[selectedTimeStamp],editorLogPath,true); + + //Prepare CSV string + List outputRows = new List(); + + //Overview + int total_shaderCount = slist.Count; + int total_variantBeforeStripping = 0; + int total_variantInBuild = 0; + int total_variantInCache = 0; + int total_variantCompiled = 0; + for(int i=0; i Date: Mon, 23 May 2022 16:04:13 +0200 Subject: [PATCH 08/35] adding a tool to tell which scenes contain objects that are using a specific script --- Assets/Editor/ScenesThatContainThis.cs | 109 +++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 Assets/Editor/ScenesThatContainThis.cs diff --git a/Assets/Editor/ScenesThatContainThis.cs b/Assets/Editor/ScenesThatContainThis.cs new file mode 100644 index 0000000..e11bc0d --- /dev/null +++ b/Assets/Editor/ScenesThatContainThis.cs @@ -0,0 +1,109 @@ +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using System.Collections.Generic; +using System; +using Object = UnityEngine.Object; +using System.Linq; +using UnityEditor.SceneManagement; + +public class ScenesThatContainThis : EditorWindow +{ + private string msg = ""; + private MonoScript searchType; + private Dictionary result = new Dictionary(); + + [MenuItem("Window/ScenesThatContainThis")] + public static void ShowWindow () + { + EditorWindow.GetWindow (typeof(ScenesThatContainThis)); + } + + public void Update() + { + Repaint(); + } + + void OnGUI () + { + GUIStyle labelStyle = new GUIStyle(GUI.skin.label); + labelStyle.wordWrap = true; + labelStyle.richText = true; + + GUIStyle buttonStyle = new GUIStyle(GUI.skin.button); + buttonStyle.wordWrap = true; + buttonStyle.richText = true; + buttonStyle.alignment = TextAnchor.MiddleLeft; + + GUI.color = Color.cyan; + GUILayout.Label ("Scenes that contain objects that are using this script:", EditorStyles.boldLabel); + + searchType = (MonoScript)EditorGUILayout.ObjectField("Assign a script",searchType, typeof(MonoScript), false); + + GUI.color = Color.white; + GUILayout.Space(15); + + //Button + if (GUILayout.Button ("Let's check") && searchType != null) DoJob(); + + GUILayout.Space(15); + + //Result + GUILayout.Label (msg, labelStyle); + if(result.Count>0) + { + GUILayout.Label (msg, labelStyle); + + for( int i=0; i"+objcount + " objects"+"",buttonStyle)) + { + OpenScene(scenepath); + } + } + } + + GUILayout.Space(15); + } + + void DoJob() + { + GUI.color = Color.white; + msg = "Search for : "+searchType.GetClass().ToString()+""+"\n"; + + //Get all the scenes in project + var scenesGUIDs = AssetDatabase.FindAssets("t:Scene",new[] {"Assets/"}); + msg += "Search in : "+scenesGUIDs.Length+" scenes"+"\n"; + + if(result == null) result = new Dictionary(); + result.Clear(); + for(int i=0; i 0) + { + result.Add(scenePath,subsceneObjs.Length); + } + } + + msg += "Result : "+result.Count+" scenes"+"\n"; + msg +="\n"; + } + + private void OpenScene(string path) + { + EditorSceneManager.OpenScene(path, OpenSceneMode.Single); + Scene currentScene = EditorSceneManager.GetSceneAt(0); + EditorSceneManager.SetActiveScene(currentScene); + } +} \ No newline at end of file From 769ae536e4b96a2d9222cedcda46d15ca44affa7 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Mon, 23 May 2022 16:14:33 +0200 Subject: [PATCH 09/35] remove redundant line --- Assets/Editor/ScenesThatContainThis.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Assets/Editor/ScenesThatContainThis.cs b/Assets/Editor/ScenesThatContainThis.cs index e11bc0d..2795d39 100644 --- a/Assets/Editor/ScenesThatContainThis.cs +++ b/Assets/Editor/ScenesThatContainThis.cs @@ -52,8 +52,6 @@ void OnGUI () GUILayout.Label (msg, labelStyle); if(result.Count>0) { - GUILayout.Label (msg, labelStyle); - for( int i=0; i Date: Mon, 23 May 2022 16:41:18 +0200 Subject: [PATCH 10/35] add remove button --- Assets/Editor/ScenesThatContainThis.cs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Assets/Editor/ScenesThatContainThis.cs b/Assets/Editor/ScenesThatContainThis.cs index 2795d39..8bbb8eb 100644 --- a/Assets/Editor/ScenesThatContainThis.cs +++ b/Assets/Editor/ScenesThatContainThis.cs @@ -62,6 +62,9 @@ void OnGUI () OpenScene(scenepath); } } + GUI.color = Color.cyan; + if (GUILayout.Button ("Remove component from all the scenes")) RemoveComponent(); + GUI.color = Color.white; } GUILayout.Space(15); @@ -98,6 +101,29 @@ void DoJob() msg +="\n"; } + void RemoveComponent() + { + for( int i=0; i Date: Mon, 8 Aug 2022 13:48:35 +0200 Subject: [PATCH 11/35] 2022.2 update --- .../Read_Compiled_Shader_Tool/README.md | 11 + .../ReadCompiledShaderTool.cs | 479 ++++++++++++++++++ Assets/Editor/ShaderVariantTool/README.md | 15 +- .../ShaderVariantTool_BuildProcess.cs | 26 +- README.md | 2 +- 5 files changed, 524 insertions(+), 9 deletions(-) create mode 100644 Assets/Editor/Read_Compiled_Shader_Tool/README.md create mode 100644 Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/README.md b/Assets/Editor/Read_Compiled_Shader_Tool/README.md new file mode 100644 index 0000000..437ab38 --- /dev/null +++ b/Assets/Editor/Read_Compiled_Shader_Tool/README.md @@ -0,0 +1,11 @@ +# Read Compiled Shader Tool +Unity 2022.2+\ +This tool reads compiled shader code (D3D only!) and put counts and summary numbers on the tool. +\ + +### How to use: +1. Add the scripts to an Editor folder +2. Top > Windows > ReadCompiledShaderTool +3. See steps on the tool. +\ +\ diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs new file mode 100644 index 0000000..39a8085 --- /dev/null +++ b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs @@ -0,0 +1,479 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.IO; +using System.Text; + +namespace GfxQA.ReadCompiledShaderTool +{ + public class ReadCompiledShaderTool : EditorWindow + { + //C:\Users\MingWaiChan\Documents\UnityProjects\_CDS\dots\Projects\HybridURPSamples\Assets\_ShaderMathCount\Compiled-Unlit-NewUnlitShader.shader + public string path = "C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader"; + + //Variant Data + private List sList = new List(); + struct VariantCompileStat + { + public int subshaderID; + public int passID; + public string passName; + public string variant; + + public int countMath; + public int countTmpReg; + public int countBranches; + public int countTextures; + } + + //For menu selection + private int selectedSubShaderPass = 0; + private List pList = new List(); + private List pListMenu = new List(); + struct SubShaderPass + { + public int subshaderID; + public int passID; + public string passName; + public string summary; + } + + [MenuItem("Window/ReadCompiledShaderTool")] + public static void ShowWindow () + { + var window = EditorWindow.GetWindow (typeof(ReadCompiledShaderTool)); + window.name = "ReadCompiledShaderTool"; + window.titleContent = new GUIContent("ReadCompiledShaderTool"); + } + + public void Awake() + { + + } + + void OnGUI () + { + Color originalBackgroundColor = GUI.backgroundColor; + + //Title + GUI.color = Color.cyan; + GUILayout.Label ( + "How to use: \n"+ + "1. Select a shader, on Inspector, click on the little triangle next to Compile and Show Code \n"+ + "2. Select only D3D on the list \n"+ + "3. If you want all the variants (i.e. even unused ones), untick Skip unused shader_features \n"+ + "4. Click Compile and Show Code. It will take awhile depends on how big your shader is \n"+ + "5. After the compiled shader code is opened, save the file to somewhere, copy the path of the file \n"+ + " e.g. C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader \n"+ + "6. Paste the path into box below" + ); + GUILayout.Space(10); + GUI.color = Color.white; + + //path + path = GUILayout.TextField(path); + + //read data + if (path != "" && GUILayout.Button ("Read data",GUILayout.Width(200))) + { + ReadCompiledD3DShader(path); + } + + GUILayout.Space(20); + + //Subshader Pass selection + if(pList.Count>0) + { + selectedSubShaderPass = EditorGUILayout.Popup("Select Subshader / Pass", selectedSubShaderPass, pListMenu.ToArray()); + GUILayout.Space(10); + ShowData(); + } + + //End Window + GUILayout.FlexibleSpace(); + EditorGUILayout.Separator(); + } + + public void ShowData() + { + SubShaderPass selected = pList[selectedSubShaderPass]; + + //Results Sum + int r_countVariant_sum = 0; + int r_countMath_sum = 0; + int r_countTmpReg_sum = 0; + int r_countBranches_sum = 0; + int r_countTextures_sum = 0; + + //Results Avg + int r_countMath_avg = 0; + int r_countTmpReg_avg = 0; + int r_countBranches_avg = 0; + int r_countTextures_avg = 0; + + //Results Max + int r_countMath_max = 0; + int r_countTmpReg_max = 0; + int r_countBranches_max = 0; + int r_countTextures_max = 0; + + //The king sList IDs + int countMath_king = 0; + int countTmpReg_king = 0; + int countBranches_king = 0; + int countTextures_king = 0; + + for(int i=0; i sList[countMath_king].countMath ) countMath_king = i; + if( sList[i].countTmpReg > sList[countTmpReg_king].countTmpReg ) countTmpReg_king = i; + if( sList[i].countBranches > sList[countBranches_king].countBranches ) countBranches_king = i; + if( sList[i].countTextures > sList[countTextures_king].countTextures ) countTextures_king = i; + } + } + + if(r_countVariant_sum > 0) + { + //Avg + r_countMath_avg = r_countMath_sum / r_countVariant_sum; + r_countTmpReg_avg = r_countTmpReg_sum / r_countVariant_sum; + r_countBranches_avg = r_countBranches_sum / r_countVariant_sum; + r_countTextures_avg = r_countTextures_sum / r_countVariant_sum; + + //Max + r_countMath_max = sList[countMath_king].countMath; + r_countTmpReg_max = sList[countTmpReg_king].countTmpReg; + r_countBranches_max = sList[countBranches_king].countBranches; + r_countTextures_max = sList[countTextures_king].countTextures; + } + + //Width for the columns & style + float currentSize = this.position.width; + float[] columnWidth = new float[] + { + 0.5f, + 0.3f, + 0.3f, + 0.3f, + 2f + }; + float widthForEach = currentSize / columnWidth.Length; + GUILayoutOption[] columnLayoutOption = new GUILayoutOption[columnWidth.Length]; + for(int i=0; i summary > Pass, so this ID is offset by 1. + //Offset compensates in ShowData() + int pListID = pList.Count-1; + var temp = pList[pListID]; + temp.summary += summary; + pList[pListID] = temp; + } + } + } + } + + //Add options to Subshader/Pass menu list + foreach(SubShaderPass pData in pList) + { + if(pData.passID == -1) + { + //Subshader + pListMenu.Add("Subshader: "+pData.subshaderID); + } + else + { + //Pass + pListMenu.Add("Subshader: "+pData.subshaderID+" > Pass: "+pData.passName); + } + } + } + + //==========HELPER=========== + public static string ExtractString(string line, string from, string to, bool takeLastIndexOfTo = true) + { + int pFrom = 0; + if(from != "") + { + int index = line.IndexOf(from); + if(index >= 0) pFrom = index + from.Length; + } + + int pTo = line.Length; + if(to != "") + { + int index = line.LastIndexOf(to); + if(!takeLastIndexOfTo) + { + index = line.IndexOf(to); + } + + if(index >= 0) pTo = index; + } + + return line.Substring(pFrom, pTo - pFrom); + } + } +} + + + diff --git a/Assets/Editor/ShaderVariantTool/README.md b/Assets/Editor/ShaderVariantTool/README.md index a290743..a866b8d 100644 --- a/Assets/Editor/ShaderVariantTool/README.md +++ b/Assets/Editor/ShaderVariantTool/README.md @@ -3,14 +3,21 @@ This tool lists out all shader keywords and variant counts that are being includ i.e. If a shader keyword is being stripped, you won't see the keyword on the list. \ \ -Unity 2022.1.0a14+ \ -If you need older Unity versions please check out to branches \ - +Unity 2022.2+ ### How to use: -1. Add the scripts to an Editor folder \ +1. Add the scripts to an Editor folder 2. Make a player build 3. Top > Windows > ShaderVariantTool +Note: The tool also generates a .csv file under the project root folder. \ +It contains more information and it's useful for keeping a record. \ \ ![](README01.jpg) + +### FAQ: +1. What is Compiled Count? + - Each entry on the tool = each keyword in a shader snippet after stripping. + - The last column "Complied Count" = how many variants in that snippet contain this keyword. +2. Shouldn't the tool show all the keywords in every individual variant? + - In most of my use case, I care more about what keywords are being included (i.e. not stripped) in the build, instead of individual variant, which the keyword list for each variant could be too many/long to look at. diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs index a31ec67..c09395b 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs @@ -190,6 +190,7 @@ public static List ReadShaderCompileInfo(string startTimeStamp, { //For making sure there is no bug int variantCountinBuild = 0; + int skippedVariantsTotalCount = 0; //Read EditorLog string fromtext = startTimeStamp; @@ -269,6 +270,7 @@ public static List ReadShaderCompileInfo(string startTimeStamp, string compiledVariants = "0"; string localCache = "0"; string remoteCache = "0"; + string skippedVariants = "0"; if(remainingVariantInt > 0) { //Compile time @@ -298,10 +300,19 @@ public static List ReadShaderCompileInfo(string startTimeStamp, compiledVariants = Helper.ExtractString(remainingText,startString,endString,false); compiledVariants = compiledVariants.Replace(" ",""); remainingText = Helper.GetRemainingString(remainingText,endString); + + //Skipped variants + startString = " skipped "; + endString = " variants"; + skippedVariants = Helper.ExtractString(remainingText,startString,endString,false); + skippedVariants = skippedVariants.Replace(" ",""); + remainingText = Helper.GetRemainingString(remainingText,endString); } int compiledVariantsInt = int.Parse(compiledVariants); int localCacheInt = int.Parse(localCache); int remoteCacheInt = int.Parse(remoteCache); + int skippedVariantsInt = int.Parse(skippedVariants); + skippedVariantsTotalCount += skippedVariantsInt; float strippingTimeFloat = float.Parse(strippingTime); float compileTimeFloat = float.Parse(compileTime); //---------- Temp object info ------------// @@ -324,7 +335,15 @@ public static List ReadShaderCompileInfo(string startTimeStamp, //Add to existing shader record compiledShaderInfoFromEditorLog[templistID] = AccumulateToCompiledShader(temp,compiledShaderInfoFromEditorLog[templistID]); } - + + //Bug checking + if(remainingVariantInt != compiledVariantsInt + temp.editorLog_variantInCacheCount + skippedVariantsInt) + { + string debugText = "Shader: "+shaderName +" Pass: "+ passName +" Program: "+ programName + "\n"; + debugText += "Remaining "+remainingVariantInt +" != compiled "+compiledVariantsInt+" + cache "+ temp.editorLog_variantInCacheCount + "\n"; + debugText += "This is a bug. Please contact @mingwai on slack and provide Editor.log"; + Debug.LogError(debugText); + } //Debug // if(shaderName == "Universal Render Pipeline/Lit") // { @@ -358,12 +377,11 @@ public static List ReadShaderCompileInfo(string startTimeStamp, "Tool counted there are "+SVL.variantFromShader+" shader variants in build, "+ "but Editor Log counted "+variantCountinBuild+". Please contact @mingwai on slack."); } - int variantCacheAndCompiledSum = SVL.variantInCache + SVL.variantCompiledCount; + int variantCacheAndCompiledSum = SVL.variantInCache + SVL.variantCompiledCount + skippedVariantsTotalCount; if( variantCacheAndCompiledSum != variantCountinBuild) { Debug.LogError("ShaderVariantTool error. "+ - "The sum of shader variants in EditorLog ("+variantCacheAndCompiledSum+" = "+SVL.variantInCache+" in cache + "+ - SVL.variantCompiledCount+" compiled) is not equal to the sum of shader variants collected by ShaderVariantTool ("+ + "The sum of shader variants in EditorLog ("+variantCacheAndCompiledSum+") is not equal to the sum of shader variants collected by ShaderVariantTool ("+ variantCountinBuild+"). Please contact @mingwai on slack. This could be related to exisiting known issue: Case 1389276"); } diff --git a/README.md b/README.md index 554194e..a702492 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SimpleTools Some tools I made for making my daily work easier. \ -Unity version : 2022.1+ on master. For older versions pleaase see branches. +Unity version : 2022.2+ on master. For older versions pleaase see branches. ## Editor From dff557a7beed27b89dd6f25d14e029f81ed7ef5d Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Mon, 15 Aug 2022 12:57:51 +0200 Subject: [PATCH 12/35] add dynamic branch variant count. remove IsKeywordLocal checks as keywords are always start from local space --- .../ShaderVariantTool/ShaderVariantTool.cs | 10 ++++++++-- .../ShaderVariantTool_BuildProcess.cs | 8 +++++++- .../ShaderVariantTool_ComputeProcess.cs | 16 +++++++++++++--- .../ShaderVariantTool_ShaderProcess.cs | 16 +++++++++++++--- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs index 89bb6f1..ee07c8b 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs @@ -94,6 +94,7 @@ void OnGUI () GUILayout.Label ( "Shader Variant Count before Stripping: " + SVL.variantBeforeStrippingCount, EditorStyles.wordWrappedLabel ); GUILayout.Label ( "Shader Variant Count in Build: " + SVL.variantFromShader+ " (cached:" + SVL.variantInCache + " compiled:" + SVL.variantCompiledCount +")", EditorStyles.wordWrappedLabel ); + GUILayout.Label ( "Shader Dynamic Branch variant count: " + SVL.shaderDynamicVariant ); GUILayout.Space(5); @@ -102,6 +103,7 @@ void OnGUI () GUILayout.Label ( "ComputeShader" , EditorStyles.boldLabel ); GUILayout.Label ( "ComputeShader Count: " + SVL.computeShaderCount, EditorStyles.wordWrappedLabel ); GUILayout.Label ( "ComputeShader Variant Count in Build: " + SVL.variantFromCompute, EditorStyles.wordWrappedLabel ); + GUILayout.Label ( "ComputeShader Dynamic Branch variant count: " + SVL.computeDynamicVariant ); GUILayout.Space(10); @@ -170,8 +172,7 @@ void OnGUI () GUI.backgroundColor = al ==0 ? columnColor1 :columnColor2; if(t == "True") background.normal.textColor = Color.green; else if(t == "False") background.normal.textColor = Color.red; - else if(t.Contains("[Global]")) background.normal.textColor = Color.cyan; - else if(t.Contains("[Local]")) background.normal.textColor = Color.yellow; + else if(t.Contains("[Dynamic]")) background.normal.textColor = Color.cyan; else background.normal.textColor = Color.white; EditorGUILayout.LabelField (t,background,GUILayout.Width(widthForEach*widthScale[i])); @@ -209,10 +210,12 @@ public static class SVL public static int variantInCache = 0; public static int normalShaderCount = 0; public static int variantFromShader = 0; + public static int shaderDynamicVariant = 0; //This will always hit shadercache == will not compile //compute shader variant public static int variantFromCompute = 0; public static int computeShaderCount = 0; + public static int computeDynamicVariant = 0; //This will always hit shadercache == will not compile //invalid or disabled keywords for final error logging public static string invalidKey = ""; @@ -259,6 +262,8 @@ public static void ResetBuildList() variantFromShader = 0; computeShaderCount = 0; normalShaderCount = 0; + shaderDynamicVariant = 0; + computeDynamicVariant = 0; //For reading EditorLog, we can extract the contents buildProcessID = System.DateTime.Now.ToString("yyyyMMdd_hh-mm-ss"); @@ -330,6 +335,7 @@ public struct CompiledShader public string name; public bool guiEnabled; public int noOfVariantsForThisShader; + public int dynamicVariantForThisShader; public int editorLog_originalVariantCount; public int editorLog_remainingVariantCount; public int editorLog_compiledVariantCount; diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs index c09395b..0f1f9b7 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_BuildProcess.cs @@ -105,11 +105,13 @@ public void OnPostprocessBuild(BuildReport report) outputRows.Add( new string[] { "Shader Variant Count before Stripping" , SVL.variantBeforeStrippingCount.ToString() } ); outputRows.Add( new string[] { "Shader Variant Count in Build" , SVL.variantFromShader+ " (cached:" + SVL.variantInCache + " compiled:" + SVL.variantCompiledCount +")" } ); + outputRows.Add( new string[] { "Shader Dynamic Branch variant count:" , SVL.shaderDynamicVariant.ToString() } ); //Write Overview - Compute //outputRows.Add( new string[] { "ComputeShaders ----------------------------------" } ); outputRows.Add( new string[] { "ComputeShader Count" , SVL.computeShaderCount.ToString() } ); outputRows.Add( new string[] { "ComputeShader Variant Count in Build" , SVL.variantFromCompute.ToString() } ); + outputRows.Add( new string[] { "ComputeShader Dynamic Branch variant count:" , SVL.computeDynamicVariant.ToString() } ); outputRows.Add( new string[] { "" } ); //Write Shader Result from Editor Log @@ -143,6 +145,7 @@ public static List AddEditorLogShaderInfo(List outputRows, L "Shader", "Variant Count before Stripping", "Variant in Cache", + "Dynamic branch variants", "Compiled Variant Count", "Variant Count in Build", "Stripping+Compilation Time" @@ -154,6 +157,7 @@ public static List AddEditorLogShaderInfo(List outputRows, L shaderlist[i].name, shaderlist[i].editorLog_originalVariantCount.ToString(), shaderlist[i].editorLog_variantInCacheCount.ToString(), + shaderlist[i].dynamicVariantForThisShader.ToString(), shaderlist[i].editorLog_compiledVariantCount.ToString(), shaderlist[i].noOfVariantsForThisShader.ToString(), //shaderlist[i].editorLog_renamingVariantCount.ToString(), @@ -323,6 +327,7 @@ public static List ReadShaderCompileInfo(string startTimeStamp, temp.editorLog_totalProcessTime = strippingTimeFloat+compileTimeFloat; temp.editorLog_remainingVariantCount = remainingVariantInt; temp.editorLog_variantInCacheCount = localCacheInt+remoteCacheInt; + temp.dynamicVariantForThisShader = 0; //---------- Add to temp list ------------// int templistID = compiledShaderInfoFromEditorLog.IndexOf(compiledShaderInfoFromEditorLog.Find(x => x.name.Equals(temp.name))); if(templistID == -1) @@ -363,7 +368,7 @@ public static List ReadShaderCompileInfo(string startTimeStamp, { int listID = SVL.shaderlist.IndexOf(SVL.shaderlist.Find(x => x.name.Equals(compiledShaderInfoFromEditorLog[i].name))); SVL.shaderlist[listID] = AccumulateToCompiledShader(compiledShaderInfoFromEditorLog[i],SVL.shaderlist[listID]); - //---------- For total countinvariantInCacheg ------------// + //---------- For total countinvariantInCache ------------// SVL.variantBeforeStrippingCount += compiledShaderInfoFromEditorLog[i].editorLog_originalVariantCount; SVL.variantCompiledCount += compiledShaderInfoFromEditorLog[i].editorLog_compiledVariantCount; SVL.variantInCache += compiledShaderInfoFromEditorLog[i].editorLog_variantInCacheCount; @@ -400,6 +405,7 @@ private static CompiledShader AccumulateToCompiledShader(CompiledShader src, Com dst.editorLog_totalProcessTime += src.editorLog_totalProcessTime; dst.editorLog_remainingVariantCount += src.editorLog_remainingVariantCount; dst.editorLog_variantInCacheCount += src.editorLog_variantInCacheCount; + dst.dynamicVariantForThisShader += src.dynamicVariantForThisShader; return dst; } diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs index 6d55f6a..3b164dc 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs @@ -18,6 +18,7 @@ public ShaderVariantTool_ComputePreprocess() public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList data) { int newVariantsForThisShader = 0; + int dynamicVariantForThisShader = 0; //The real variant count newVariantsForThisShader+=data.Count; @@ -26,6 +27,7 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis for (int i = 0; i < data.Count; ++i) { ShaderKeyword[] sk = data[i].shaderKeywordSet.GetShaderKeywords(); + bool variantIsDynamic = false; //The default variant if(sk.Length==0) @@ -65,11 +67,11 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis //scv.shaderRequirements = data[i].shaderRequirements.ToString().Replace(",","\n"); scv.platformKeywords =Helper.GetPlatformKeywordList(data[i].platformKeywordSet); - bool isLocal = ShaderKeyword.IsKeywordLocal(sk[k]); LocalKeyword lkey = new LocalKeyword(shader,sk[k].name); bool isDynamic = lkey.isDynamic; - scv.shaderKeywordName = ( isLocal? "[Local]" : "[Global]" ) + ( isDynamic? "[Dynamic] " : " " ) + sk[k].name; //sk[k].GetKeywordName(); - scv.shaderKeywordType = isLocal? "--" : ShaderKeyword.GetGlobalKeywordType(sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); + if(isDynamic) variantIsDynamic = true; + scv.shaderKeywordName = ( isDynamic? "[Dynamic] " : " " ) + sk[k].name; //sk[k].GetKeywordName(); + scv.shaderKeywordType = ShaderKeyword.GetGlobalKeywordType(sk[k]).ToString(); //""+sk[k].GetKeywordType().ToString(); if( !sk[k].IsValid() ) { SVL.invalidKey += "\n"+"Shader "+scv.shaderName+" Keyword "+scv.shaderKeywordName+" is invalid."; @@ -88,6 +90,11 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis // ShaderKeywordType globalShaderKeywordType = ShaderKeyword.GetGlobalKeywordType(sk[k]); //if( !isLocal && globalShaderKeywordType != ShaderKeyword.GetKeywordType(shader,sk[k]) ) Debug.LogError("Bug. ShaderKeyword.GetGlobalKeywordType() and ShaderKeyword.GetKeywordType() is wrong"); } + + if(variantIsDynamic) + { + dynamicVariantForThisShader++; + } } //Add to shader list @@ -98,6 +105,7 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis newCompiledShader.name = shader.name; newCompiledShader.guiEnabled = false; newCompiledShader.noOfVariantsForThisShader = 0; + newCompiledShader.dynamicVariantForThisShader = 0; SVL.shaderlist.Add(newCompiledShader); SVL.computeShaderCount++; compiledShaderId=SVL.shaderlist.Count-1; @@ -106,11 +114,13 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis //Add variant count to shader CompiledShader compiledShader = SVL.shaderlist[compiledShaderId]; compiledShader.noOfVariantsForThisShader += newVariantsForThisShader; + compiledShader.dynamicVariantForThisShader += dynamicVariantForThisShader; SVL.shaderlist[compiledShaderId] = compiledShader; //Add to total count SVL.variantTotalCount+=newVariantsForThisShader; SVL.variantFromCompute+=newVariantsForThisShader; + SVL.computeDynamicVariant+=dynamicVariantForThisShader; } } } \ No newline at end of file diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs index 5aec96c..f670151 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ShaderProcess.cs @@ -19,6 +19,7 @@ public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList Date: Tue, 4 Oct 2022 16:42:13 +0200 Subject: [PATCH 13/35] adding shader stripping sample script --- Assets/Editor/StrippingExample_Shader.cs | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Assets/Editor/StrippingExample_Shader.cs diff --git a/Assets/Editor/StrippingExample_Shader.cs b/Assets/Editor/StrippingExample_Shader.cs new file mode 100644 index 0000000..bc561c6 --- /dev/null +++ b/Assets/Editor/StrippingExample_Shader.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using UnityEditor.Build; +using UnityEditor.Rendering; +using UnityEngine; +using UnityEngine.Rendering; + +class StrippingExample_Shader : IPreprocessShaders +{ + public StrippingExample_Shader() + { + + } + + public int callbackOrder { get { return 0; } } + public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList data) + { + for (int i = 0; i < data.Count; ++i) + { + //Get a string of keywords + string variantText = ""; + foreach(ShaderKeyword s in data[i].shaderKeywordSet.GetShaderKeywords()) + { + variantText += " " +s.name; + } + + bool wantToStrip = false; + + //Only stripping specific shader's specific keyword + if( + shader.name == "Test/MyShader" && variantText.Contains("_USELESSKEYWORD") + ) + { + wantToStrip = true; + } + + if ( wantToStrip ) + { + //Strip the variant + data.RemoveAt(i); + --i; + } + } + } +} \ No newline at end of file From 6216610e8097471de4d759c3503b264628c05545 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Fri, 21 Oct 2022 16:10:10 +0200 Subject: [PATCH 14/35] update read compiled shader tool to take a shader file directly --- .../ReadCompiledShaderTool.cs | 79 +++++++++++++++---- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs index 39a8085..32e12cc 100644 --- a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs +++ b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs @@ -3,14 +3,16 @@ using UnityEngine; using UnityEditor; using System.IO; +using System.Reflection; +using UnityEditor.Rendering; using System.Text; namespace GfxQA.ReadCompiledShaderTool { public class ReadCompiledShaderTool : EditorWindow { - //C:\Users\MingWaiChan\Documents\UnityProjects\_CDS\dots\Projects\HybridURPSamples\Assets\_ShaderMathCount\Compiled-Unlit-NewUnlitShader.shader - public string path = "C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader"; + public string path = "";//"C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader"; + public Shader shader; //Variant Data private List sList = new List(); @@ -57,29 +59,49 @@ void OnGUI () Color originalBackgroundColor = GUI.backgroundColor; //Title - GUI.color = Color.cyan; + GUI.color = Color.yellow; GUILayout.Label ( - "How to use: \n"+ - "1. Select a shader, on Inspector, click on the little triangle next to Compile and Show Code \n"+ - "2. Select only D3D on the list \n"+ - "3. If you want all the variants (i.e. even unused ones), untick Skip unused shader_features \n"+ - "4. Click Compile and Show Code. It will take awhile depends on how big your shader is \n"+ - "5. After the compiled shader code is opened, save the file to somewhere, copy the path of the file \n"+ - " e.g. C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader \n"+ - "6. Paste the path into box below" + //"How to use: \n"+ + // "1. Select a shader, on Inspector, click on the little triangle next to Compile and Show Code \n"+ + // "2. Select only D3D on the list \n"+ + // "3. If you want all the variants (i.e. even unused ones), untick Skip unused shader_features \n"+ + // "4. Click Compile and Show Code. It will take awhile depends on how big your shader is \n"+ + // "5. After the compiled shader code is opened, save the file to somewhere, copy the path of the file \n"+ + // " e.g. C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader \n"+ + // "6. Paste the path into box below" + "This only works for showing D3D compiler math numbers. \n" ); - GUILayout.Space(10); + //GUILayout.Space(10); GUI.color = Color.white; //path - path = GUILayout.TextField(path); - - //read data - if (path != "" && GUILayout.Button ("Read data",GUILayout.Width(200))) + //path = GUILayout.TextField(path); + + //shader file + shader = (Shader)EditorGUILayout.ObjectField(shader, typeof(Shader), true); + if (shader != null && GUILayout.Button ("Compile shader",GUILayout.Width(200))) { - ReadCompiledD3DShader(path); + CompileShader(); } + //open compiled shader file + if (path != "" ) + { + GUI.color = Color.green; + GUILayout.Label ("Compiled: "+path); + GUI.color = Color.white; + if(GUILayout.Button ("Open Compiled shader File",GUILayout.Width(200))) + { + Application.OpenURL (path); + } + } + + //read data + // if (path != "" && GUILayout.Button ("Read data",GUILayout.Width(200))) + // { + // ReadCompiledD3DShader(path); + // } + GUILayout.Space(20); //Subshader Pass selection @@ -95,6 +117,29 @@ void OnGUI () EditorGUILayout.Separator(); } + private void CompileShader() + { + // Editor/Mono/ShaderUtil.bindings.cs + // extern internal static void OpenCompiledShader(Shader shader, int mode, int externPlatformsMask, bool includeAllVariants, bool preprocessOnly, bool stripLineDirectives); + // extern internal static void CompileShaderForTargetCompilerPlatform(Shader shader, ShaderCompilerPlatform platform); + + // const bool INCLUDE_ALL_VARIANTS = false; + // System.Type t = typeof(ShaderUtil); + // MethodInfo dynMethod = t.GetMethod("OpenCompiledShader", BindingFlags.NonPublic | BindingFlags.Static); + // int defaultMask = (1 << System.Enum.GetNames(typeof(UnityEditor.Rendering.ShaderCompilerPlatform)).Length - 1); + // dynMethod.Invoke(null, new object[] { shader, 1, defaultMask, INCLUDE_ALL_VARIANTS, false, true}); + + System.Type t = typeof(ShaderUtil); + MethodInfo dynMethod = t.GetMethod("CompileShaderForTargetCompilerPlatform", BindingFlags.NonPublic | BindingFlags.Static); + dynMethod.Invoke(null, new object[] { shader, ShaderCompilerPlatform.D3D}); + + //Compiled shader file stored in project Temp folder, with name e.g. Compiled-Unlit-NewUnlitShader.shader + path = Application.dataPath.Replace("Assets","Temp")+"/Compiled-"+shader.name.Replace("/","-").Replace(" ","")+".shader"; + Debug.Log("Compiled Shader : "+path); + + ReadCompiledD3DShader(path); + } + public void ShowData() { SubShaderPass selected = pList[selectedSubShaderPass]; From 02c8b207976236a62f3ea91492912676b6da11d5 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Fri, 21 Oct 2022 16:30:38 +0200 Subject: [PATCH 15/35] fix read compile shader tool --- .../ReadCompiledShaderTool.cs | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs index 32e12cc..1472d16 100644 --- a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs +++ b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs @@ -49,7 +49,7 @@ public static void ShowWindow () window.titleContent = new GUIContent("ReadCompiledShaderTool"); } - public void Awake() + void Awake() { } @@ -81,6 +81,8 @@ void OnGUI () shader = (Shader)EditorGUILayout.ObjectField(shader, typeof(Shader), true); if (shader != null && GUILayout.Button ("Compile shader",GUILayout.Width(200))) { + path = ""; + CleanUpData(); CompileShader(); } @@ -88,7 +90,7 @@ void OnGUI () if (path != "" ) { GUI.color = Color.green; - GUILayout.Label ("Compiled: "+path); + GUILayout.Label ("Compiled: "+path , EditorStyles.wordWrappedLabel); GUI.color = Color.white; if(GUILayout.Button ("Open Compiled shader File",GUILayout.Width(200))) { @@ -123,24 +125,25 @@ private void CompileShader() // extern internal static void OpenCompiledShader(Shader shader, int mode, int externPlatformsMask, bool includeAllVariants, bool preprocessOnly, bool stripLineDirectives); // extern internal static void CompileShaderForTargetCompilerPlatform(Shader shader, ShaderCompilerPlatform platform); - // const bool INCLUDE_ALL_VARIANTS = false; - // System.Type t = typeof(ShaderUtil); - // MethodInfo dynMethod = t.GetMethod("OpenCompiledShader", BindingFlags.NonPublic | BindingFlags.Static); - // int defaultMask = (1 << System.Enum.GetNames(typeof(UnityEditor.Rendering.ShaderCompilerPlatform)).Length - 1); - // dynMethod.Invoke(null, new object[] { shader, 1, defaultMask, INCLUDE_ALL_VARIANTS, false, true}); - + const bool INCLUDE_ALL_VARIANTS = false; System.Type t = typeof(ShaderUtil); - MethodInfo dynMethod = t.GetMethod("CompileShaderForTargetCompilerPlatform", BindingFlags.NonPublic | BindingFlags.Static); - dynMethod.Invoke(null, new object[] { shader, ShaderCompilerPlatform.D3D}); + MethodInfo dynMethod = t.GetMethod("OpenCompiledShader", BindingFlags.NonPublic | BindingFlags.Static); + int defaultMask = (1 << System.Enum.GetNames(typeof(UnityEditor.Rendering.ShaderCompilerPlatform)).Length - 1); + dynMethod.Invoke(null, new object[] { shader, 1, defaultMask, INCLUDE_ALL_VARIANTS, false, true}); + + //This does not generate the compiled file + // System.Type t = typeof(ShaderUtil); + // MethodInfo dynMethod = t.GetMethod("CompileShaderForTargetCompilerPlatform", BindingFlags.NonPublic | BindingFlags.Static); + // dynMethod.Invoke(null, new object[] { shader, ShaderCompilerPlatform.D3D}); //Compiled shader file stored in project Temp folder, with name e.g. Compiled-Unlit-NewUnlitShader.shader - path = Application.dataPath.Replace("Assets","Temp")+"/Compiled-"+shader.name.Replace("/","-").Replace(" ","")+".shader"; + path = Application.dataPath.Replace("Assets","Temp")+"/Compiled-"+shader.name.Replace("/","-")+".shader"; Debug.Log("Compiled Shader : "+path); ReadCompiledD3DShader(path); } - public void ShowData() + private void ShowData() { SubShaderPass selected = pList[selectedSubShaderPass]; @@ -325,8 +328,15 @@ public void ShowData() GUILayout.EndHorizontal(); } + + private void CleanUpData() + { + sList.Clear(); + pList.Clear(); + pListMenu.Clear(); + } - public void ReadCompiledD3DShader(string path) + private void ReadCompiledD3DShader(string path) { FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); @@ -345,9 +355,7 @@ public void ReadCompiledD3DShader(string path) int data_countTextures = 0; //CleanUp - sList.Clear(); - pList.Clear(); - pListMenu.Clear(); + CleanUpData(); using (StreamReader sr = new StreamReader(fs)) { @@ -494,7 +502,7 @@ public void ReadCompiledD3DShader(string path) } //==========HELPER=========== - public static string ExtractString(string line, string from, string to, bool takeLastIndexOfTo = true) + private static string ExtractString(string line, string from, string to, bool takeLastIndexOfTo = true) { int pFrom = 0; if(from != "") From 3b7d1a0e3cb0cd852d94c0cb429c27e4e19a3c04 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Fri, 21 Oct 2022 16:56:53 +0200 Subject: [PATCH 16/35] more fixes --- .../ReadCompiledShaderTool.cs | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs index 1472d16..b89c157 100644 --- a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs +++ b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs @@ -69,7 +69,8 @@ void OnGUI () // "5. After the compiled shader code is opened, save the file to somewhere, copy the path of the file \n"+ // " e.g. C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader \n"+ // "6. Paste the path into box below" - "This only works for showing D3D compiler math numbers. \n" + "This only works for showing D3D compiler math numbers. \n"+ + "Compilation will include all variants, avoid shaders with a lot of keywords. \n" ); //GUILayout.Space(10); GUI.color = Color.white; @@ -125,7 +126,7 @@ private void CompileShader() // extern internal static void OpenCompiledShader(Shader shader, int mode, int externPlatformsMask, bool includeAllVariants, bool preprocessOnly, bool stripLineDirectives); // extern internal static void CompileShaderForTargetCompilerPlatform(Shader shader, ShaderCompilerPlatform platform); - const bool INCLUDE_ALL_VARIANTS = false; + const bool INCLUDE_ALL_VARIANTS = true; System.Type t = typeof(ShaderUtil); MethodInfo dynMethod = t.GetMethod("OpenCompiledShader", BindingFlags.NonPublic | BindingFlags.Static); int defaultMask = (1 << System.Enum.GetNames(typeof(UnityEditor.Rendering.ShaderCompilerPlatform)).Length - 1); @@ -299,25 +300,25 @@ private void ShowData() layoutID++; EditorGUILayout.LabelField("Max numbers is from this variant (Click to copy)",headerStyle,columnLayoutOption[layoutID]); - string kingText = sList[countMath_king].variant; + string kingText = countMath_king > 0 ? sList[countMath_king].variant : ""; if(GUILayout.Button(kingText,kingButtonStyle,columnLayoutOption[layoutID])) { GUIUtility.systemCopyBuffer = kingText; } - kingText = sList[countTmpReg_king].variant; + kingText = countTmpReg_king > 0 ? sList[countTmpReg_king].variant : ""; if(GUILayout.Button(kingText,kingButtonStyle,columnLayoutOption[layoutID])) { GUIUtility.systemCopyBuffer = kingText; } - kingText = sList[countBranches_king].variant; + kingText = countBranches_king > 0 ? sList[countBranches_king].variant : ""; if(GUILayout.Button(kingText,kingButtonStyle,columnLayoutOption[layoutID])) { GUIUtility.systemCopyBuffer = kingText; } - kingText = sList[countTextures_king].variant; + kingText = countTextures_king > 0 ? sList[countTextures_king].variant : ""; if(GUILayout.Button(kingText,kingButtonStyle,columnLayoutOption[layoutID])) { GUIUtility.systemCopyBuffer = kingText; @@ -412,8 +413,11 @@ private void ReadCompiledD3DShader(string path) } /* + math -> temp registers -> textures -> branches // Stats: 79 math, 7 temp registers, 33 branches // Stats: 0 math, 1 textures + // Stats: 2 math, 2 temp registers, 1 textures + // Stats: 98 math, 11 temp registers, 1 textures, 6 branches */ //DATA @@ -424,15 +428,7 @@ private void ReadCompiledD3DShader(string path) string temp = ExtractString(data, ""," math",true); data_countMath = int.Parse(temp); data = data.Replace(data_countMath+" math, ",""); - - //textures count - if(data.Contains("textures")) - { - temp = ExtractString(data, ""," textures",true); - data_countTextures = int.Parse(temp); - data = data.Replace(data_countTextures+" textures, ",""); - } - + //register count if(data.Contains("temp registers")) { @@ -441,12 +437,20 @@ private void ReadCompiledD3DShader(string path) data = data.Replace(data_countTmpReg+" temp registers, ",""); } + //textures count + if(data.Contains("textures")) + { + temp = ExtractString(data, ""," textures",true); + data_countTextures = int.Parse(temp); + data = data.Replace(data_countTextures+" textures, ",""); + } + //branch count if(data.Contains("branches")) { temp = ExtractString(data, ""," branches",true); data_countBranches = int.Parse(temp); - } + } //Pack into struct VariantCompileStat newData = new VariantCompileStat(); From 9543ff46308ecb086b90fadcd2a17db797eb0263 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Fri, 21 Oct 2022 17:12:32 +0200 Subject: [PATCH 17/35] edit readme --- .../Read_Compiled_Shader_Tool/README.md | 1 + .../ReadCompiledShaderTool.JPG | Bin 0 -> 39298 bytes .../ReadCompiledShaderTool.cs | 18 +++++++++++------- README.md | 3 ++- READMEImages/ShaderVariantTool.JPG | Bin 108262 -> 0 bytes 5 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG delete mode 100644 READMEImages/ShaderVariantTool.JPG diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/README.md b/Assets/Editor/Read_Compiled_Shader_Tool/README.md index 437ab38..bdf942e 100644 --- a/Assets/Editor/Read_Compiled_Shader_Tool/README.md +++ b/Assets/Editor/Read_Compiled_Shader_Tool/README.md @@ -9,3 +9,4 @@ This tool reads compiled shader code (D3D only!) and put counts and summary numb 3. See steps on the tool. \ \ +![](ReadCompiledShaderTool.JPG) \ No newline at end of file diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG new file mode 100644 index 0000000000000000000000000000000000000000..0a666c6d5bdaf7e95f7e2fd62029566484594308 GIT binary patch literal 39298 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 z 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 L&U+~SGWS0KQu36O literal 0 HcmV?d00001 diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs index b89c157..e0a113f 100644 --- a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs +++ b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs @@ -13,6 +13,7 @@ public class ReadCompiledShaderTool : EditorWindow { public string path = "";//"C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader"; public Shader shader; + private bool includeAllVariants = true; //Variant Data private List sList = new List(); @@ -70,7 +71,7 @@ void OnGUI () // " e.g. C:\\Users\\XYZ\\Documents\\Compiled-ABC.shader \n"+ // "6. Paste the path into box below" "This only works for showing D3D compiler math numbers. \n"+ - "Compilation will include all variants, avoid shaders with a lot of keywords. \n" + "If you select include all variants, avoid shaders with a lot of keywords. \n" ); //GUILayout.Space(10); GUI.color = Color.white; @@ -80,11 +81,15 @@ void OnGUI () //shader file shader = (Shader)EditorGUILayout.ObjectField(shader, typeof(Shader), true); - if (shader != null && GUILayout.Button ("Compile shader",GUILayout.Width(200))) + if (shader != null) { - path = ""; - CleanUpData(); - CompileShader(); + includeAllVariants = GUILayout.Toggle (includeAllVariants, "Include all variants?"); + if(GUILayout.Button ("Compile shader",GUILayout.Width(200))) + { + path = ""; + CleanUpData(); + CompileShader(); + } } //open compiled shader file @@ -126,11 +131,10 @@ private void CompileShader() // extern internal static void OpenCompiledShader(Shader shader, int mode, int externPlatformsMask, bool includeAllVariants, bool preprocessOnly, bool stripLineDirectives); // extern internal static void CompileShaderForTargetCompilerPlatform(Shader shader, ShaderCompilerPlatform platform); - const bool INCLUDE_ALL_VARIANTS = true; System.Type t = typeof(ShaderUtil); MethodInfo dynMethod = t.GetMethod("OpenCompiledShader", BindingFlags.NonPublic | BindingFlags.Static); int defaultMask = (1 << System.Enum.GetNames(typeof(UnityEditor.Rendering.ShaderCompilerPlatform)).Length - 1); - dynMethod.Invoke(null, new object[] { shader, 1, defaultMask, INCLUDE_ALL_VARIANTS, false, true}); + dynMethod.Invoke(null, new object[] { shader, 1, defaultMask, includeAllVariants, false, true}); //This does not generate the compiled file // System.Type t = typeof(ShaderUtil); diff --git a/README.md b/README.md index a702492..0f1aa1c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ Unity version : 2022.2+ on master. For older versions pleaase see branches. | `ScreenCaptureEditorTool` | ![](READMEImages/ScreenCaptureEditorTool.JPG) | Just make a screen capture | | `RenameObjectsTool` | ![](READMEImages/RenameObjectsTool.JPG) | Rename scene objects or project files | | `PlaceObjectsTool` | ![](READMEImages/PlaceObjectsTool.JPG) | Distribute / Align / Random / CopyPaste the GameObjects transform, Replace objects | -| `ShaderVariantTool` | ![](READMEImages/ShaderVariantTool.JPG) | See what shader variants are included in the build. [See details here](Assets/Editor/ShaderVariantTool/) | +| `ShaderVariantTool` | ![](Assets/Editor/ShaderVariantTool/README01.jpg) | See what shader variants are included in the build. [See details here](Assets/Editor/ShaderVariantTool/) | +| `ReadCompiledShaderTool` | ![](Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG) | Gather shader math , temp registers, textures and branches count from D3D shader compiler | | `AnimationPreviewTool` | ![](READMEImages/AnimationPreviewTool.JPG) | Preview any animation that exists on any scene GameObjects | | `AsyncShaderCompilingTool` | ![](READMEImages/AsyncShaderCompilingTool.JPG) | Select materials and compile the shader passes | diff --git a/READMEImages/ShaderVariantTool.JPG b/READMEImages/ShaderVariantTool.JPG deleted file mode 100644 index 665977490309f9dc798b4b861789852587e9586f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108262 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 From bb7126c56f0390cb4e08f10d88d8c3733e493067 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Mon, 14 Nov 2022 12:47:48 +0100 Subject: [PATCH 18/35] Fix project open 22.2 --- Assets/Editor/Read_Compiled_Shader_Tool.meta | 8 + .../Read_Compiled_Shader_Tool/README.md.meta | 7 + .../ReadCompiledShaderTool.JPG.meta | 136 +++++++++ .../ReadCompiledShaderTool.cs.meta | 11 + Assets/Editor/ScenesThatContainThis.cs.meta | 11 + .../Editor/ShaderVariantTool/README.md.meta | 7 + .../ShaderVariantTool/README01.jpg.meta | 136 +++++++++ .../ShaderVariantTool_LogReader.cs.meta | 11 + Assets/Editor/StrippingExample_Shader.cs.meta | 11 + Packages/manifest.json | 36 +++ Packages/packages-lock.json | 256 +++++++++++++++++ ProjectSettings/MemorySettings.asset | 35 +++ ProjectSettings/PackageManagerSettings.asset | 36 +++ ProjectSettings/ProjectSettings.asset | 269 +++++++++++++----- ProjectSettings/ProjectVersion.txt | 4 +- ProjectSettings/VersionControlSettings.asset | 8 + 16 files changed, 916 insertions(+), 66 deletions(-) create mode 100644 Assets/Editor/Read_Compiled_Shader_Tool.meta create mode 100644 Assets/Editor/Read_Compiled_Shader_Tool/README.md.meta create mode 100644 Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG.meta create mode 100644 Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs.meta create mode 100644 Assets/Editor/ScenesThatContainThis.cs.meta create mode 100644 Assets/Editor/ShaderVariantTool/README.md.meta create mode 100644 Assets/Editor/ShaderVariantTool/README01.jpg.meta create mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs.meta create mode 100644 Assets/Editor/StrippingExample_Shader.cs.meta create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/VersionControlSettings.asset diff --git a/Assets/Editor/Read_Compiled_Shader_Tool.meta b/Assets/Editor/Read_Compiled_Shader_Tool.meta new file mode 100644 index 0000000..d5a88fe --- /dev/null +++ b/Assets/Editor/Read_Compiled_Shader_Tool.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1960e96237bff9d4db05b0cd298954b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/README.md.meta b/Assets/Editor/Read_Compiled_Shader_Tool/README.md.meta new file mode 100644 index 0000000..8bc1293 --- /dev/null +++ b/Assets/Editor/Read_Compiled_Shader_Tool/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4f7c06d3866d297478624f749c136a4f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG.meta b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG.meta new file mode 100644 index 0000000..4918854 --- /dev/null +++ b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.JPG.meta @@ -0,0 +1,136 @@ +fileFormatVersion: 2 +guid: cd6b7c87105cf684fa3c9d2101ae3e95 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs.meta b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs.meta new file mode 100644 index 0000000..674a614 --- /dev/null +++ b/Assets/Editor/Read_Compiled_Shader_Tool/ReadCompiledShaderTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9190b198980a22645941ce3e9c572535 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/ScenesThatContainThis.cs.meta b/Assets/Editor/ScenesThatContainThis.cs.meta new file mode 100644 index 0000000..8a336a7 --- /dev/null +++ b/Assets/Editor/ScenesThatContainThis.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 39a6344861b6f134bb4446c6308c3ed9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/ShaderVariantTool/README.md.meta b/Assets/Editor/ShaderVariantTool/README.md.meta new file mode 100644 index 0000000..2514bdc --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 63d73fcd3309bbc45b52ec908b0d7495 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/ShaderVariantTool/README01.jpg.meta b/Assets/Editor/ShaderVariantTool/README01.jpg.meta new file mode 100644 index 0000000..36aa3d6 --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/README01.jpg.meta @@ -0,0 +1,136 @@ +fileFormatVersion: 2 +guid: f5e81bd06233504429ce742cc6b5a201 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs.meta b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs.meta new file mode 100644 index 0000000..249935d --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb9e5bc2077dfb54aa2b04e517162f62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/StrippingExample_Shader.cs.meta b/Assets/Editor/StrippingExample_Shader.cs.meta new file mode 100644 index 0000000..6dfebb9 --- /dev/null +++ b/Assets/Editor/StrippingExample_Shader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad5abeeea4415ea42a84adbda01fd452 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..83493a0 --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,36 @@ +{ + "dependencies": { + "com.unity.ugui": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..ed69428 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,256 @@ +{ + "dependencies": { + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/ProjectSettings/MemorySettings.asset b/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000..5b5face --- /dev/null +++ b/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..fc37ffe --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_ConfigSource: 0 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -870 + m_OriginalInstanceId: -872 + m_LoadAssets: 0 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 4f46cc2..d4b95b4 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 20 + serializedVersion: 25 productGUID: 2294ff65ac2813d42b9d073071bee4d9 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -48,12 +48,14 @@ PlayerSettings: defaultScreenHeightWeb: 600 m_StereoRenderingPath: 0 m_ActiveColorSpace: 0 + m_SpriteBatchVertexThreshold: 300 m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 iosUseCustomAppBackgroundBehavior: 0 - iosAllowHTTPDownload: 1 allowedAutorotateToPortrait: 1 allowedAutorotateToPortraitUpsideDown: 1 allowedAutorotateToLandscapeRight: 1 @@ -66,6 +68,12 @@ PlayerSettings: androidRenderOutsideSafeArea: 1 androidUseSwappy: 0 androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 0 @@ -103,6 +111,7 @@ PlayerSettings: xboxOneMonoLoggingLevel: 0 xboxOneLoggingLevel: 1 xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 xboxOnePresentImmediateThreshold: 0 switchQueueCommandMemory: 1048576 switchQueueControlMemory: 16384 @@ -110,14 +119,19 @@ PlayerSettings: switchNVNShaderPoolsGranularity: 33554432 switchNVNDefaultPoolsGranularity: 16777216 switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchNVNGraphicsFirmwareMemory: 32 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 vulkanNumSwapchainBuffers: 3 vulkanEnableSetSRGBWrite: 0 - m_SupportedAspectRatios: - 4:3: 1 - 5:4: 1 - 16:10: 1 - 16:9: 1 - Others: 1 + vulkanEnablePreTransform: 0 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + loadStoreDebugModeEnabled: 0 bundleVersion: 1.0 preloadedAssets: [] metroInputSource: 0 @@ -126,45 +140,26 @@ PlayerSettings: xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: - cardboard: - depthFormat: 0 - enableTransitionView: 0 - daydream: - depthFormat: 0 - useSustainedPerformanceMode: 0 - enableVideoLayer: 0 - useProtectedVideoMemory: 0 - minimumSupportedHeadTracking: 0 - maximumSupportedHeadTracking: 1 - hololens: - depthFormat: 1 - depthBufferSharingEnabled: 1 - lumin: - depthFormat: 0 - frameTiming: 2 - enableGLCache: 0 - glCacheMaxBlobSize: 524288 - glCacheMaxFileSize: 8388608 - oculus: - sharedDepthBuffer: 1 - dashSupport: 1 - lowOverheadMode: 0 - protectedContext: 0 - v2Signing: 1 enable360StereoCapture: 0 isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 useHDRDisplay: 0 D3DHDRBitDepth: 0 m_ColorGamuts: 00000000 - targetPixelDensity: 0 + targetPixelDensity: 30 resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 applicationIdentifier: {} - buildNumber: {} + buildNumber: + Standalone: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 19 + AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 aotOptions: @@ -177,34 +172,19 @@ PlayerSettings: APKExpansionFiles: 0 keepLoadedShadersAlive: 0 StripUnusedMeshComponents: 0 + strictShaderVariantMatching: 0 VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: + iOSTargetOSVersionString: 12.0 tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: + tvOSTargetOSVersionString: 12.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 uIStatusBarHidden: 1 uIExitOnSuspend: 0 uIStatusBarStyle: 0 - iPhoneSplashScreen: {fileID: 0} - iPhoneHighResSplashScreen: {fileID: 0} - iPhoneTallHighResSplashScreen: {fileID: 0} - iPhone47inSplashScreen: {fileID: 0} - iPhone55inPortraitSplashScreen: {fileID: 0} - iPhone55inLandscapeSplashScreen: {fileID: 0} - iPhone58inPortraitSplashScreen: {fileID: 0} - iPhone58inLandscapeSplashScreen: {fileID: 0} - iPadPortraitSplashScreen: {fileID: 0} - iPadHighResPortraitSplashScreen: {fileID: 0} - iPadLandscapeSplashScreen: {fileID: 0} - iPadHighResLandscapeSplashScreen: {fileID: 0} - iPhone65inPortraitSplashScreen: {fileID: 0} - iPhone65inLandscapeSplashScreen: {fileID: 0} - iPhone61inPortraitSplashScreen: {fileID: 0} - iPhone61inLandscapeSplashScreen: {fileID: 0} appleTVSplashScreen: {fileID: 0} appleTVSplashScreen2x: {fileID: 0} tvOSSmallIconLayers: [] @@ -232,15 +212,17 @@ PlayerSettings: iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 iOSLaunchScreeniPadCustomXibPath: - iOSUseLaunchScreenStoryboard: 0 iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] + macOSURLSchemes: [] iOSBackgroundModes: 0 iOSMetalForceHardShadows: 0 metalEditorSupport: 1 metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 appleDeveloperTeamID: iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: @@ -250,14 +232,24 @@ PlayerSettings: iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 appleEnableProMotion: 0 + shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 templatePackageId: templateDefaultScene: + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomProguardFile: 0 AndroidTargetArchitectures: 1 + AndroidTargetDevices: 0 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 @@ -270,15 +262,119 @@ PlayerSettings: height: 180 banner: {fileID: 0} androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 AndroidAppBundleSizeToValidate: 150 m_BuildTargetIcons: [] - m_BuildTargetPlatformIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: [] m_BuildTargetGraphicsJobMode: [] - m_BuildTargetGraphicsAPIs: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AndroidPlayer + m_APIs: 0b00000008000000 + m_Automatic: 0 m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 openGLRequireES31: 0 openGLRequireES31AEP: 0 openGLRequireES32: 0 @@ -288,7 +384,11 @@ PlayerSettings: iPhone: 1 tvOS: 1 m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupHDRCubemapEncodingQuality: [] m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] + m_BuildTargetNormalMapEncoding: [] + m_BuildTargetDefaultTextureCompressionFormat: [] playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 @@ -298,14 +398,20 @@ PlayerSettings: cameraUsageDescription: locationUsageDescription: microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: 10.13.0 + switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 + switchUseGOLDLinker: 0 + switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 switchNSODependencies: + switchCompilerFlags: switchTitleNames_0: switchTitleNames_1: switchTitleNames_2: @@ -321,6 +427,7 @@ PlayerSettings: switchTitleNames_12: switchTitleNames_13: switchTitleNames_14: + switchTitleNames_15: switchPublisherNames_0: switchPublisherNames_1: switchPublisherNames_2: @@ -336,6 +443,7 @@ PlayerSettings: switchPublisherNames_12: switchPublisherNames_13: switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -351,6 +459,7 @@ PlayerSettings: switchIcons_12: {fileID: 0} switchIcons_13: {fileID: 0} switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} switchSmallIcons_0: {fileID: 0} switchSmallIcons_1: {fileID: 0} switchSmallIcons_2: {fileID: 0} @@ -366,6 +475,7 @@ PlayerSettings: switchSmallIcons_12: {fileID: 0} switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} switchManualHTML: switchAccessibleURLs: switchLegalInformation: @@ -428,6 +538,11 @@ PlayerSettings: switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 switchPlayerConnectionEnabled: 1 + switchUseNewStyleFilepaths: 1 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -454,6 +569,7 @@ PlayerSettings: ps4ShareFilePath: ps4ShareOverlayImagePath: ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 ps4RemotePlayKeyMappingDir: @@ -479,6 +595,7 @@ PlayerSettings: ps4UseResolutionFallback: 0 ps4ReprojectionSupport: 0 ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 ps4SocialScreenEnabled: 0 ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 @@ -495,6 +612,9 @@ PlayerSettings: ps4disableAutoHideSplash: 0 ps4videoRecordingFeaturesUsed: 0 ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 @@ -506,6 +626,7 @@ PlayerSettings: webGLMemorySize: 32 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 webGLEmscriptenArgs: @@ -514,16 +635,28 @@ PlayerSettings: webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 webGLCompressionFormat: 0 + webGLWasmArithmeticExceptions: 0 webGLLinkerTarget: 1 webGLThreadsSupport: 0 - webGLWasmStreaming: 0 + webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 scriptingDefineSymbols: {} + additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} managedStrippingLevel: {} incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 allowUnsafeCode: 0 + useDeterministicCompilation: 1 + selectedPlatform: 0 additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 @@ -558,6 +691,7 @@ PlayerSettings: metroFTAName: metroFTAFileTypes: [] metroProtocolName: + vcxProjDefaultLanguage: XboxOneProductId: XboxOneUpdateKey: XboxOneSandboxId: @@ -576,6 +710,7 @@ PlayerSettings: XboxOneCapability: [] XboxOneGameRating: {} XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 XboxOneEnableGPUVariability: 1 XboxOneSockets: {} XboxOneSplashScreen: {fileID: 0} @@ -583,10 +718,8 @@ PlayerSettings: XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 XboxOneOverrideIdentityName: - vrEditorSettings: - daydream: - daydreamIconForeground: {fileID: 0} - daydreamIconBackground: {fileID: 0} + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: m_Name: @@ -599,12 +732,20 @@ PlayerSettings: luminVersion: m_VersionCode: 1 m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 1 + hmiCpuConfiguration: apiCompatibilityLevel: 6 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 cloudProjectId: framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] projectName: organizationId: cloudEnabled: 0 - enableNativePlatformBackendsForNewInputSystem: 0 - disableOldInputManagerSupport: 0 legacyClampBlendShapeWeights: 0 + hmiLoadingImage: {fileID: 0} + virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 1407dd8..6e79a67 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2019.3.1f1 -m_EditorVersionWithRevision: 2019.3.1f1 (9c473a0c8ba4) +m_EditorVersion: 2022.2.0b15 +m_EditorVersionWithRevision: 2022.2.0b15 (759cc6eb342a) diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 From 497cb97c9499b0b445847c548daab12b6c3c13b8 Mon Sep 17 00:00:00 2001 From: MingWai Chan Date: Mon, 14 Nov 2022 13:30:19 +0100 Subject: [PATCH 19/35] update ShaderVariantTool --- Assets/Editor/ShaderVariantTool/README01.jpg | Bin 78264 -> 194810 bytes .../ShaderVariantTool/ShaderVariantTool.cs | 648 ++++++++++++++---- .../ShaderVariantTool_BuildProcess.cs | 143 +++- .../ShaderVariantTool_ComputeProcess.cs | 7 +- .../ShaderVariantTool_Helper.cs | 5 + .../ShaderVariantTool_LogReader.cs | 22 +- .../ShaderVariantTool_ShaderProcess.cs | 7 +- ProjectSettings/ProjectVersion.txt | 2 +- README.md | 2 +- 9 files changed, 636 insertions(+), 200 deletions(-) diff --git a/Assets/Editor/ShaderVariantTool/README01.jpg b/Assets/Editor/ShaderVariantTool/README01.jpg index 67b3242d750c5fd084261a2c4f7f1c5134aef7d2..825b7d3112788bc1553bc2ba651ee2c50342bf91 100644 GIT binary patch literal 194810 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�U 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 literal 78264 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 diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs index ee07c8b..853d69e 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs @@ -1,44 +1,256 @@ -using UnityEditor; +using System; +using UnityEditor; using UnityEngine; using System.Linq; +using System.IO; using System.Collections.Generic; +using System.Globalization; +using UnityEditor.IMGUI.Controls; namespace GfxQA.ShaderVariantTool { public class ShaderVariantTool : EditorWindow { - Vector2 scrollPosition; - - public static string folderPath = ""; + private Vector2 scrollPosition; public static string savedFile = ""; - - //ColumnSetup - Color columnColor1 = new Color(0.3f,0.3f,0.3f,1); - Color columnColor2 = new Color(0.28f,0.28f,0.28f,1); - float[] widthScale = new float[] + + //For Build summary style + private CultureInfo culture = new CultureInfo("is-IS"); + private GUIStyle variantDisplayStyle = null; + private string format = "{0, -50}{1, 30}"; + private Font monospacedFont; + private List buildRows; + + //For Shader summary table + private bool shader_guiEnabled = true; + private MultiColumnHeader shader_columnHeader; + private MultiColumnHeaderState.Column[] shader_columns; + private List shaderRows; + private List shaderRows_Expanded; + private int visibleShaderColumns = 6; //lineData.Length //don't want to show all the columns + private int defaultSortColumn = 4; //Sorting default is no. variant after stripping (i.e. variant in build) + + //For Variant keyword table + private MultiColumnHeader variant_columnHeader; + private MultiColumnHeaderState.Column[] variant_columns; + private List variantRows; + private int visibleVariantColumns = 0; + private int defaultVariantSortColumn = 1; //Sorting default is no. variant after stripping (i.e. variant in build) + private float widthPadding = 10; + + //Table styles + private Color columnColor1 = new Color(0.3f,0.3f,0.3f,1); + private Color columnColor2 = new Color(0.28f,0.28f,0.28f,1); + private Color columnColorbg = new Color(0.7f,0.7f,0.7f,1); + private Color columnColorShader = new Color(0,0.2f,0.2f); + private Color columnColorShaderHover = new Color(0,0.3f,0.3f); + private GUIStyle background = null; + private GUIStyle foldoutTitleStyle = null; + +#region CSV file reading functions + + private List CSVFileNames; + private int selectedCSVFile = 0; + private string prevSelectedCSVFile = ""; + + private void GetCSVFileNames() { - 0, //we don't show shader name + if(CSVFileNames == null) + { + CSVFileNames = new List(); + } + else + { + CSVFileNames.Clear(); + } - 0.9f, - 1.8f, - 1f, + var info = new DirectoryInfo(Helper.GetCSVFolderPath()); + var fileInfo = info.GetFiles(); + foreach(FileInfo file in fileInfo) + { + if(file.Name.Contains("ShaderVariants_") && file.FullName.Contains(".csv")) + { + CSVFileNames.Add(file.FullName); + } + } - 1.5f, + //sort file names, top is newest + CSVFileNames = CSVFileNames.OrderByDescending(o=>o).ToList(); + } - 0.6f, - 0.8f, - 0.5f, + private string[] ReadCSVFile() + { + string fileData = System.IO.File.ReadAllText(CSVFileNames[selectedCSVFile]); + string[] lines = fileData.Split("\n"[0]); + return lines; + } - 0.8f, - - 2.1f, - 0.5f, - //0.5f, - //0.5f, - //0.5f, + private string[] GetLineCells(string[] lines, int lineID) + { + return lines[lineID].Trim().Split(","[0]); + } - 0.4f, - }; + private string NumberSeperator(string input) + { + int outNum = 0; + bool success = int.TryParse(input, out outNum); + if(success) + { + return outNum.ToString("N0"); + } + else + { + return input; + } + } + + void UpdateCSVDataForGUI() + { + //Read the CSV file lines + string[] lines = ReadCSVFile(); + if(lines.Length <= 0) + { + //TODO some error messages when there is no line to read + } + else + { + int lineID = 0; + string[] lineData = GetLineCells(lines,lineID); + + //Load build summary data + if(buildRows == null) buildRows = new List(); + buildRows.Clear(); + while(lineData[0]!="") + { + buildRows.Add(lineData); + + //Next line + lineID++; + lineData = GetLineCells(lines,lineID); + } + + //Next line + lineID++; + lineData = GetLineCells(lines,lineID); + + //Shader number list header + shader_columns = new MultiColumnHeaderState.Column[visibleShaderColumns]; + for(int i=0; i(); + if(shaderRows_Expanded == null) shaderRows_Expanded = new List(); + shaderRows.Clear(); + shaderRows_Expanded.Clear(); + while(lineData[0]!="") + { + shaderRows.Add(lineData); + shaderRows_Expanded.Add(false); + + //Next line + lineID++; + lineData = GetLineCells(lines,lineID); + } + + //Sort shader rows + OnShaderSortingChanged(null); + + //Next line + lineID++; + lineData = GetLineCells(lines,lineID); + + //Variant list header + visibleVariantColumns = lineData.Length -1;//skip the shader name column + if(variant_columns == null || variant_columnHeader == null) + { + variant_columns = new MultiColumnHeaderState.Column[visibleVariantColumns]; + for(int i=0; i(); + variantRows.Clear(); + while(lineData[0]!="") + { + variantRows.Add(lineData); + + //Next line + lineID++; + lineData = GetLineCells(lines,lineID); + } + + //Sort variant list by compile count + variantRows = variantRows.OrderByDescending(o=>int.Parse(o[defaultVariantSortColumn])).ToList(); + + Debug.Log("ShaderVariantTool - successfully loaded "+CSVFileNames[selectedCSVFile]); + } + } + + private void OnShaderSortingChanged(MultiColumnHeader header) + { + if(shader_columnHeader.sortedColumnIndex > 0) + { + //sort numbers + if(shader_columnHeader.IsSortedAscending(shader_columnHeader.sortedColumnIndex)) + { + shaderRows = shaderRows.OrderBy(o=>float.Parse(o[shader_columnHeader.sortedColumnIndex])).ToList(); + } + else + { + shaderRows = shaderRows.OrderByDescending(o=>float.Parse(o[shader_columnHeader.sortedColumnIndex])).ToList(); + } + } + else + { + //sort string Alphabetical Order + if(shader_columnHeader.IsSortedAscending(shader_columnHeader.sortedColumnIndex)) + { + shaderRows = shaderRows.OrderBy(o=>o[shader_columnHeader.sortedColumnIndex]).ToList(); + } + else + { + shaderRows = shaderRows.OrderByDescending(o=>o[shader_columnHeader.sortedColumnIndex]).ToList(); + } + } + } + +#endregion [MenuItem("Window/ShaderVariantTool")] public static void ShowWindow () @@ -48,145 +260,270 @@ public static void ShowWindow () window.titleContent = new GUIContent("ShaderVariantTool"); } - // public void Awake() - // { - // } + void OnEnable() + { + //InitGUIStyles(); //Can't call it here.. + } + + private void InitGUIStyles() + { + //Build summary styles setup + if (variantDisplayStyle == null) + { + if(monospacedFont==null) monospacedFont = EditorGUIUtility.Load("Fonts/RobotoMono/RobotoMono-Regular.ttf") as Font; + variantDisplayStyle = new GUIStyle(GUI.skin.label);//EditorStyles.label); + variantDisplayStyle.font = monospacedFont; + variantDisplayStyle.wordWrap = true; + variantDisplayStyle.hover.textColor = Color.cyan; + } - // public void OnDestroy() - // { - // } + //shader & variant table row background + if(background == null) + { + background = new GUIStyle + { + normal = + { + background = Texture2D.whiteTexture, + textColor = Color.white + } + }; + } + + //shader list foldout + if(foldoutTitleStyle == null) + { + foldoutTitleStyle = new GUIStyle("foldout"); + foldoutTitleStyle.fontStyle = FontStyle.Bold; + } + } + + private void CopyValueMenu(Rect valueRect, string textToCopy) + { + GUIContent s_CopyPropertyText = EditorGUIUtility.TrTextContent("Copy"); + var e = Event.current; + + // Copy function + if (valueRect.Contains(e.mousePosition)) + { + e.Use(); + + GenericMenu menu = new GenericMenu(); + menu.AddItem(s_CopyPropertyText, false, delegate + { + EditorGUIUtility.systemCopyBuffer = textToCopy; + }); + menu.ShowAsContext(); + } + } void OnGUI () { + InitGUIStyles(); + Color originalBackgroundColor = GUI.backgroundColor; - //Width for the columns & style - float currentSize = this.position.width; - float widthForEach = currentSize / (SVL.columns.Length-1+currentSize*0.0002f); - GUIStyle background = new GUIStyle - { - normal = - { - background = Texture2D.whiteTexture, - textColor = Color.white - } - }; +#region CSV file selection GUI - //Title - GUI.color = Color.cyan; - GUILayout.Label ("Build the player and see the variants list here.", EditorStyles.wordWrappedLabel); - ShaderVariantTool_BuildPreprocess.deletePlayerCacheBeforeBuild = GUILayout.Toggle(ShaderVariantTool_BuildPreprocess.deletePlayerCacheBeforeBuild,"Delete PlayerCache Before Build"); - GUILayout.Space(10); - GUI.color = Color.white; + //This should be always on + ShaderVariantTool_BuildPreprocess.deletePlayerCacheBeforeBuild = true; - if(savedFile != "") + //Scroll Start + scrollPosition = GUILayout.BeginScrollView(scrollPosition,GUILayout.Width(0),GUILayout.Height(0)); + + //Select CSV file to read from + if (GUILayout.Button ("Update CSV File List",GUILayout.Width(200)) || CSVFileNames == null) { - GUI.color = Color.green; + GetCSVFileNames(); + } - GUILayout.Label ( "Build Time: " + SVL.buildTimeString, EditorStyles.wordWrappedLabel ); + if(CSVFileNames.Count == 0 ) + { + //Hint for user + GUI.color = Color.cyan; + GUILayout.Label ("Build the player and see the variants list here.", EditorStyles.wordWrappedLabel); + GUI.color = Color.white; - GUILayout.Space(5); + GUILayout.EndScrollView(); + return; + } - //Result - Shader - GUI.color = Color.white; - GUILayout.Label ( "Shader" , EditorStyles.boldLabel ); - GUILayout.Label ( "Shader Count: " + SVL.normalShaderCount, EditorStyles.wordWrappedLabel ); - GUILayout.Label ( "Shader Variant Count before Stripping: " + SVL.variantBeforeStrippingCount, EditorStyles.wordWrappedLabel ); - GUILayout.Label ( "Shader Variant Count in Build: " + SVL.variantFromShader+ - " (cached:" + SVL.variantInCache + " compiled:" + SVL.variantCompiledCount +")", EditorStyles.wordWrappedLabel ); - GUILayout.Label ( "Shader Dynamic Branch variant count: " + SVL.shaderDynamicVariant ); + // string CSVFileCompare = CSVFileNames[selectedCSVFile].Replace(@"\", @"/"); + // if(savedFile != "" && CSVFileCompare != savedFile) + // { + // GetCSVFileNames(); + // prevSelectedCSVFile = -1; + // Debug.Log(CSVFileCompare + " ---- " + savedFile); + // } + + //Show dropdown list + selectedCSVFile = EditorGUILayout.Popup("Select CSV File", selectedCSVFile, CSVFileNames.ToArray()); + if(prevSelectedCSVFile != CSVFileNames[selectedCSVFile]) + { + UpdateCSVDataForGUI(); + prevSelectedCSVFile = CSVFileNames[selectedCSVFile]; + } - GUILayout.Space(5); + //Show folder button + if (GUILayout.Button ("Show in explorer",GUILayout.Width(200))) + { + string path = CSVFileNames[selectedCSVFile]; + EditorUtility.RevealInFinder(path.Replace(@"/", @"\")); + } + GUILayout.Space(10); - //Result - ComputeShader - GUI.color = Color.white; - GUILayout.Label ( "ComputeShader" , EditorStyles.boldLabel ); - GUILayout.Label ( "ComputeShader Count: " + SVL.computeShaderCount, EditorStyles.wordWrappedLabel ); - GUILayout.Label ( "ComputeShader Variant Count in Build: " + SVL.variantFromCompute, EditorStyles.wordWrappedLabel ); - GUILayout.Label ( "ComputeShader Dynamic Branch variant count: " + SVL.computeDynamicVariant ); +#endregion +#region Build summary GUI - GUILayout.Space(10); + GUI.skin.settings.doubleClickSelectsWord = true; - //Saved file path - GUI.color = Color.green; - GUILayout.Label ( "Saved: "+savedFile, EditorStyles.wordWrappedLabel); + //To prevent error after script compiles when tool is opened + if(buildRows == null) + { + UpdateCSVDataForGUI(); + prevSelectedCSVFile = CSVFileNames[selectedCSVFile]; + } - //Show folder button - GUI.color = Color.white; - if (GUILayout.Button ("Show in explorer",GUILayout.Width(200))) + for(int i=0; i0 && SVL.rowData.Count > 0) + //Show shader table + Rect shaderRect = GUILayoutUtility.GetLastRect(); + shaderRect.position += new Vector2(0,30); + shaderRect.width = position.width; + if(shader_guiEnabled) { - for(int k=1; k < SVL.rowData.Count; k++) //first row is title so start with 1 + //Shader header + shader_columnHeader.OnGUI(shaderRect, 1); //TODO - check if we need xScroll + + //Apply sorting + shader_columnHeader.sortingChanged += OnShaderSortingChanged; + + //Shader rows + int uiRowCount = 0; + Rect contentRect = new Rect(); + for(int i=0; i o.name == shaderName ); - CompiledShader currentShader = SVL.shaderlist[shaderIndex]; - - if(shaderName != SVL.rowData[k-1][0]) //show title + string[] rowlineData = shaderRows[i]; + if(!shaderRows_Expanded[i]) { - GUI.backgroundColor = originalBackgroundColor; - currentShader.guiEnabled = EditorGUILayout.Foldout( currentShader.guiEnabled, shaderName + " (" + currentShader.noOfVariantsForThisShader + ")" ); - SVL.shaderlist[shaderIndex] = currentShader; + //For each column + for(int j=0; j= position.x && mousePos.x <= position.xMax && + mousePos.y >= contentScreenPos.y && mousePos.y <= contentScreenPos.y+contentRect.height + ) + { + GUI.backgroundColor = columnColorShaderHover; + } + else + { + GUI.backgroundColor = uiRowCount%2 == 0 ? columnColor1 :columnColor2; + } + + //Show the shader summary number + string content = rowlineData[j]; + shaderRows_Expanded[i] = GUI.Toggle(contentRect,shaderRows_Expanded[i],content,background); + } } - - //Show the shader variants - if( currentShader.guiEnabled ) + else { - EditorGUILayout.BeginHorizontal(); - for(int i=1;i AddEditorLogShaderInfo(List outputRows, L outputRows.Add( new string[] { "Shader", - "Variant Count before Stripping", - "Variant in Cache", + "Variant Count original", + "Variant Count after Prefiltering", + "Variant Count after Builtin-Stripping", + "Variant after Scriptable-Stripping", "Dynamic branch variants", + "Variant in Cache", "Compiled Variant Count", - "Variant Count in Build", "Stripping+Compilation Time" } ); + + //Compute shader do not have Editor log info + //string computeMsg = "This is compute shader. Numbers for prefiltering and stripping is not available."; for(int i = 0; i outputRows, string fileName) sb.AppendLine(string.Join(delimiter, outputRows[index])); //Write to CSV file - ShaderVariantTool.folderPath = Application.dataPath.Replace("/Assets","/"); - string savedFile = ShaderVariantTool.folderPath+fileName+".csv"; + string savedFile = Helper.GetCSVFolderPath()+fileName+".csv"; StreamWriter outStream = System.IO.File.CreateText(savedFile); outStream.WriteLine(sb); outStream.Close(); @@ -193,8 +200,8 @@ public static string SaveCSVFile(List outputRows, string fileName) public static List ReadShaderCompileInfo(string startTimeStamp, string editorLogPath, bool isLogReader) { //For making sure there is no bug - int variantCountinBuild = 0; - int skippedVariantsTotalCount = 0; + uint variantCountinBuild = 0; + uint skippedVariantsTotalCount = 0; //Read EditorLog string fromtext = startTimeStamp; @@ -237,24 +244,87 @@ public static List ReadShaderCompileInfo(string startTimeStamp, string programName = Helper.ExtractString(currentLine, passName+"\" (",""); programName = programName.Replace("\"","").Replace(")",""); - //skip the line bla bla bla prepared - currentLine = sr.ReadLine(); - while(!currentLine.Contains("variants left after stripping, ")) + //Sometime the log is like this + /* + Compiling shader "Universal Render Pipeline/Lit" pass "ForwardLit" (fp) + [2.97s] 100M / ~402M prepared + [11.34s] 200M / ~402M prepared + [19.22s] 300M / ~402M prepared + [27.65s] 400M / ~402M prepared + Full variant space: 402653184 + After settings filtering: 402653184 + After built-in stripping: 3145728 + After scriptable stripping: 896 + Processed in 28.45 seconds + starting compilation... + [ 61s] 360 / 896 variants ready + [123s] 537 / 896 variants ready + [189s] 660 / 896 variants ready + [254s] 795 / 896 variants ready + finished in 301.68 seconds. Local cache hits 8 (0.00s CPU time), remote cache hits 0 (0.00s CPU time), compiled 888 variants (4504.33s CPU time), skipped 0 variants + Prepared data for serialisation in 0.02s + */ + while(!currentLine.Contains("Full variant space:")) { currentLine = sr.ReadLine(); } + //Full variant space (variant count before prefiltering & stripping) + //currentLine = sr.ReadLine(); + uint totalVariantInt = 0; + if(currentLine.Contains("Full variant space:")) + { + string totalVariant = Helper.ExtractString(currentLine, "Full variant space:" , "" ); + totalVariant = totalVariant.Replace(" ",""); + totalVariantInt = uint.Parse(totalVariant); + } + + //After settings filtering (variant count after prefiltering) + currentLine = sr.ReadLine(); + uint prefilteredVariantInt = 0; + if(currentLine.Contains("After settings filtering:")) + { + string prefilteredVariant = Helper.ExtractString(currentLine, "After settings filtering:" , "" ); + prefilteredVariant = prefilteredVariant.Replace(" ",""); + prefilteredVariantInt = uint.Parse(prefilteredVariant); + } + + //After builtin stripping + currentLine = sr.ReadLine(); + uint builtinStrippedVariantInt = 0; + if(currentLine.Contains("After built-in stripping:")) + { + string builtinStrippedVariant = Helper.ExtractString(currentLine, "After built-in stripping:" , "" ); + builtinStrippedVariant = builtinStrippedVariant.Replace(" ",""); + builtinStrippedVariantInt = uint.Parse(builtinStrippedVariant); + } + + //After scriptable stripping (final variant count in build) + currentLine = sr.ReadLine(); //After scriptable stripping: + uint remainingVariantInt = 0; + if(currentLine.Contains("After scriptable stripping:")) + { + string remainingVariant = Helper.ExtractString(currentLine, "After scriptable stripping:" , "" ); + remainingVariant = remainingVariant.Replace(" ",""); + remainingVariantInt = uint.Parse(remainingVariant); + } + else + { + Debug.LogError("Cannot find line [After scriptable stripping:]. CurrentLine = "+currentLine); + } + //remaining variant & stripping time - string remainingVariant = Helper.ExtractString(currentLine, "" , " / " ); - int remainingVariantInt = int.Parse(remainingVariant); + //string remainingVariant = Helper.ExtractString(currentLine, "" , " / " ); + //int remainingVariantInt = int.Parse(remainingVariant); //total variant - string totalVariant = Helper.ExtractString(currentLine, "/ " , " variants" ); - totalVariant = totalVariant.Replace(" ",""); - int totalVariantInt = int.Parse(totalVariant); + //string totalVariant = Helper.ExtractString(currentLine, "/ " , " variants" ); + //totalVariant = totalVariant.Replace(" ",""); + //int totalVariantInt = int.Parse(totalVariant); //stripping time - string strippingTime = Helper.ExtractString(currentLine, "variants left after stripping, processed in " , " seconds" ); + currentLine = sr.ReadLine(); + string strippingTime = Helper.ExtractString(currentLine, "Processed in " , " seconds" ); //jump to line of compilation time if(remainingVariantInt > 0) @@ -312,17 +382,20 @@ public static List ReadShaderCompileInfo(string startTimeStamp, skippedVariants = skippedVariants.Replace(" ",""); remainingText = Helper.GetRemainingString(remainingText,endString); } - int compiledVariantsInt = int.Parse(compiledVariants); - int localCacheInt = int.Parse(localCache); - int remoteCacheInt = int.Parse(remoteCache); - int skippedVariantsInt = int.Parse(skippedVariants); + uint compiledVariantsInt = uint.Parse(compiledVariants); + uint localCacheInt = uint.Parse(localCache); + uint remoteCacheInt = uint.Parse(remoteCache); + uint skippedVariantsInt = uint.Parse(skippedVariants); skippedVariantsTotalCount += skippedVariantsInt; float strippingTimeFloat = float.Parse(strippingTime); float compileTimeFloat = float.Parse(compileTime); //---------- Temp object info ------------// CompiledShader temp = new CompiledShader(); + temp.isComputeShader = false; temp.name = shaderName; temp.editorLog_originalVariantCount = totalVariantInt; + temp.editorLog_prefilteredVariantCount = prefilteredVariantInt; + temp.editorLog_builtinStrippedVariantCount = builtinStrippedVariantInt; temp.editorLog_compiledVariantCount = compiledVariantsInt; temp.editorLog_totalProcessTime = strippingTimeFloat+compileTimeFloat; temp.editorLog_remainingVariantCount = remainingVariantInt; @@ -369,7 +442,9 @@ public static List ReadShaderCompileInfo(string startTimeStamp, int listID = SVL.shaderlist.IndexOf(SVL.shaderlist.Find(x => x.name.Equals(compiledShaderInfoFromEditorLog[i].name))); SVL.shaderlist[listID] = AccumulateToCompiledShader(compiledShaderInfoFromEditorLog[i],SVL.shaderlist[listID]); //---------- For total countinvariantInCache ------------// - SVL.variantBeforeStrippingCount += compiledShaderInfoFromEditorLog[i].editorLog_originalVariantCount; + SVL.variantOriginalCount += compiledShaderInfoFromEditorLog[i].editorLog_originalVariantCount; + SVL.variantAfterPrefilteringCount += compiledShaderInfoFromEditorLog[i].editorLog_prefilteredVariantCount; + SVL.variantAfterBuiltinStrippingCount += compiledShaderInfoFromEditorLog[i].editorLog_builtinStrippedVariantCount; SVL.variantCompiledCount += compiledShaderInfoFromEditorLog[i].editorLog_compiledVariantCount; SVL.variantInCache += compiledShaderInfoFromEditorLog[i].editorLog_variantInCacheCount; variantCountinBuild += compiledShaderInfoFromEditorLog[i].editorLog_remainingVariantCount; //for making sure no bug @@ -382,7 +457,7 @@ public static List ReadShaderCompileInfo(string startTimeStamp, "Tool counted there are "+SVL.variantFromShader+" shader variants in build, "+ "but Editor Log counted "+variantCountinBuild+". Please contact @mingwai on slack."); } - int variantCacheAndCompiledSum = SVL.variantInCache + SVL.variantCompiledCount + skippedVariantsTotalCount; + uint variantCacheAndCompiledSum = SVL.variantInCache + SVL.variantCompiledCount + skippedVariantsTotalCount; if( variantCacheAndCompiledSum != variantCountinBuild) { Debug.LogError("ShaderVariantTool error. "+ @@ -400,6 +475,8 @@ public static List ReadShaderCompileInfo(string startTimeStamp, private static CompiledShader AccumulateToCompiledShader(CompiledShader src, CompiledShader dst) { + dst.editorLog_builtinStrippedVariantCount += src.editorLog_builtinStrippedVariantCount; + dst.editorLog_prefilteredVariantCount += src.editorLog_prefilteredVariantCount; dst.editorLog_originalVariantCount += src.editorLog_originalVariantCount; dst.editorLog_compiledVariantCount += src.editorLog_compiledVariantCount; dst.editorLog_totalProcessTime += src.editorLog_totalProcessTime; diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs index 3b164dc..d9b8759 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_ComputeProcess.cs @@ -17,11 +17,11 @@ public ShaderVariantTool_ComputePreprocess() public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList data) { - int newVariantsForThisShader = 0; - int dynamicVariantForThisShader = 0; + uint newVariantsForThisShader = 0; + uint dynamicVariantForThisShader = 0; //The real variant count - newVariantsForThisShader+=data.Count; + newVariantsForThisShader+=(uint)data.Count; //Go through all the variants for (int i = 0; i < data.Count; ++i) @@ -102,6 +102,7 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis if( compiledShaderId == -1 ) { CompiledShader newCompiledShader = new CompiledShader(); + newCompiledShader.isComputeShader = true; newCompiledShader.name = shader.name; newCompiledShader.guiEnabled = false; newCompiledShader.noOfVariantsForThisShader = 0; diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs index 4ee2832..d1b3859 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_Helper.cs @@ -9,6 +9,11 @@ namespace GfxQA.ShaderVariantTool { public static class Helper { + public static string GetCSVFolderPath() + { + return Application.dataPath.Replace("/Assets","/"); + } + public static string TimeFormatString (double timeInSeconds) { float t = (float)timeInSeconds; diff --git a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs index 4e2b0e5..53f7620 100644 --- a/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs +++ b/Assets/Editor/ShaderVariantTool/ShaderVariantTool_LogReader.cs @@ -90,21 +90,27 @@ void OnGUI () List outputRows = new List(); //Overview - int total_shaderCount = slist.Count; - int total_variantBeforeStripping = 0; - int total_variantInBuild = 0; - int total_variantInCache = 0; - int total_variantCompiled = 0; + uint total_shaderCount = (uint)slist.Count; + uint total_variantOriginalCount = 0; + uint total_variantAfterPrefiltering = 0; + uint total_variantAfterBuiltinStripping = 0; + uint total_variantInBuild = 0; + uint total_variantInCache = 0; + uint total_variantCompiled = 0; for(int i=0; i data) { - int newVariantsForThisShader = 0; - int dynamicVariantForThisShader = 0; + uint newVariantsForThisShader = 0; + uint dynamicVariantForThisShader = 0; //The real variant count - newVariantsForThisShader+=data.Count; + newVariantsForThisShader+=(uint)data.Count; //Go through all the variants for (int i = 0; i < data.Count; ++i) @@ -103,6 +103,7 @@ public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList Date: Thu, 16 Feb 2023 15:52:05 +0100 Subject: [PATCH 20/35] Updated ShaderVariantTool using UIElements to get rid of performance issue caused by drawing many labels in old UI system. --- Assets/Editor/ShaderVariantTool/Editor.meta | 8 + .../ShaderVariantTool/Editor/Resources.meta | 8 + .../Resources/ShaderVariantTool_Main.uxml | 42 + .../ShaderVariantTool_Main.uxml.meta | 10 + .../Resources/ShaderVariantTool_Style.uss | 93 ++ .../ShaderVariantTool_Style.uss.meta | 11 + .../ShaderVariantTool_VariantTable.uxml | 31 + .../ShaderVariantTool_VariantTable.uxml.meta | 10 + .../Editor/ShaderVariantTool.cs | 987 ++++++++++++++++++ .../{ => Editor}/ShaderVariantTool.cs.meta | 2 +- .../ShaderVariantTool_BuildProcess.cs | 61 +- .../ShaderVariantTool_BuildProcess.cs.meta | 2 +- .../ShaderVariantTool_ComputeProcess.cs | 20 +- .../ShaderVariantTool_ComputeProcess.cs.meta | 2 +- .../{ => Editor}/ShaderVariantTool_Helper.cs | 0 .../ShaderVariantTool_Helper.cs.meta | 2 +- .../ShaderVariantTool_LogReader.cs | 21 +- .../ShaderVariantTool_LogReader.cs.meta | 2 +- .../ShaderVariantTool_ShaderProcess.cs | 21 +- .../ShaderVariantTool_ShaderProcess.cs.meta | 2 +- Assets/Editor/ShaderVariantTool/README.md | 3 +- Assets/Editor/ShaderVariantTool/README01.jpg | Bin 194810 -> 399377 bytes .../ShaderVariantTool/ShaderVariantTool.cs | 722 ------------- ProjectSettings/ProjectSettings.asset | 11 +- ProjectSettings/ProjectVersion.txt | 4 +- 25 files changed, 1301 insertions(+), 774 deletions(-) create mode 100644 Assets/Editor/ShaderVariantTool/Editor.meta create mode 100644 Assets/Editor/ShaderVariantTool/Editor/Resources.meta create mode 100644 Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_Main.uxml create mode 100644 Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_Main.uxml.meta create mode 100644 Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_Style.uss create mode 100644 Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_Style.uss.meta create mode 100644 Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_VariantTable.uxml create mode 100644 Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_VariantTable.uxml.meta create mode 100644 Assets/Editor/ShaderVariantTool/Editor/ShaderVariantTool.cs rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool.cs.meta (83%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_BuildProcess.cs (90%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_BuildProcess.cs.meta (83%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_ComputeProcess.cs (93%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_ComputeProcess.cs.meta (83%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_Helper.cs (100%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_Helper.cs.meta (83%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_LogReader.cs (91%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_LogReader.cs.meta (83%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_ShaderProcess.cs (93%) rename Assets/Editor/ShaderVariantTool/{ => Editor}/ShaderVariantTool_ShaderProcess.cs.meta (83%) delete mode 100644 Assets/Editor/ShaderVariantTool/ShaderVariantTool.cs diff --git a/Assets/Editor/ShaderVariantTool/Editor.meta b/Assets/Editor/ShaderVariantTool/Editor.meta new file mode 100644 index 0000000..b1a2edb --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5f748f3e964aa84aa2aae8dbbd26807 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/ShaderVariantTool/Editor/Resources.meta b/Assets/Editor/ShaderVariantTool/Editor/Resources.meta new file mode 100644 index 0000000..bf6d395 --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 732c98c7d204e894c85b5d8a5fc38d42 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_Main.uxml b/Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_Main.uxml new file mode 100644 index 0000000..b7da3b5 --- /dev/null +++ b/Assets/Editor/ShaderVariantTool/Editor/Resources/ShaderVariantTool_Main.uxml @@ -0,0 +1,42 @@ + +