Skip to content

Commit 0945992

Browse files
committed
Refactored tests, added lots of tests with data generated by different Unity versions
1 parent 3dca0e9 commit 0945992

File tree

89 files changed

+1042425
-20559
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+1042425
-20559
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
**/*.gen.csproj
2222
**/*.gen.sln
2323
**/.vscode
24+
**/.DS_Store
2425
**/bin/
2526
**/obj/
2627
**/.idea/

Analyzer/Processors/ShaderProcessor.cs

+10-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class ShaderProcessor : IProcessor, IDisposable
1717

1818
List<int> m_Keywords = new();
1919
Dictionary<int, string> m_KeywordNames = new();
20-
HashSet<uint> m_UniquePrograms = new();
20+
HashSet<(sbyte, uint)> m_UniquePrograms = new();
2121

2222
static Dictionary<string, int> s_Keywords = new();
2323
static long s_SubProgramId = 0;
@@ -34,6 +34,9 @@ public class ShaderProcessor : IProcessor, IDisposable
3434

3535
public void Init(SQLiteConnection db)
3636
{
37+
s_Keywords.Clear();
38+
s_SubProgramId = 0;
39+
3740
using var command = new SQLiteCommand(db);
3841

3942
command.CommandText = Properties.Resources.Shader;
@@ -159,7 +162,7 @@ public void Process(AnalyzerTool analyzer, long objectId, Dictionary<int, int> l
159162

160163
int decompressedSize = 0;
161164

162-
if (!reader["decompressedLengths"].TypeTreeNode.Children[1].IsLeaf)
165+
if (reader["decompressedLengths"][0].IsArray)
163166
{
164167
// The decompressed lengths are stored per graphics API.
165168
foreach (var apiLengths in reader["decompressedLengths"])
@@ -195,9 +198,11 @@ void ProcessProgram(RandomAccessReader subPrograms, int hwTier = -1)
195198

196199
foreach (var subProgram in subPrograms)
197200
{
201+
var api = subProgram["m_GpuProgramType"].GetValue<sbyte>();
202+
198203
m_Keywords.Clear();
199-
200-
m_UniquePrograms.Add(subProgram["m_BlobIndex"].GetValue<uint>());
204+
205+
m_UniquePrograms.Add((api, subProgram["m_BlobIndex"].GetValue<uint>()));
201206

202207
if (subProgram.HasChild("m_KeywordIndices"))
203208
{
@@ -233,7 +238,7 @@ void ProcessProgram(RandomAccessReader subPrograms, int hwTier = -1)
233238
m_InsertSubProgramCommand.Parameters["@id"].Value = s_SubProgramId;
234239
m_InsertSubProgramCommand.Parameters["@sub_program"].Value = progNum++;
235240
m_InsertSubProgramCommand.Parameters["@hw_tier"].Value = hwTier != -1 ? hwTier : subProgram["m_ShaderHardwareTier"].GetValue<sbyte>();
236-
m_InsertSubProgramCommand.Parameters["@api"].Value = subProgram["m_GpuProgramType"].GetValue<sbyte>();
241+
m_InsertSubProgramCommand.Parameters["@api"].Value = api;
237242
m_InsertSubProgramCommand.ExecuteNonQuery();
238243

239244
m_InsertSubProgramKeywordsCommand.Parameters["@subprogram_id"].Value = s_SubProgramId;

Analyzer/Resources/Shader.sql

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ SELECT sp.shader AS shader_id, o.name, sp.sub_shader, sp.hw_tier, api.name api,
7373
FROM shader_subprograms sp
7474
CROSS JOIN objects o ON o.id = sp.shader
7575
CROSS JOIN shader_apis api ON api.id = sp.api
76-
CROSS JOIN shader_subprogram_keywords sk ON sk.subprogram_id = sp.id
77-
CROSS JOIN shader_keywords k ON sk.keyword_id = k.id
76+
LEFT JOIN shader_subprogram_keywords sk ON sk.subprogram_id = sp.id
77+
LEFT JOIN shader_keywords k ON sk.keyword_id = k.id
7878
GROUP BY sp.id;
7979

8080
CREATE VIEW shader_keyword_ratios AS

TextDumper/TextDumperTool.cs

+73-55
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ void RecursiveDump(TypeTreeNode node, ref long offset, int level)
126126
}
127127
}
128128

129-
void DumpArray(TypeTreeNode node, ref long offset, int level, bool isManagedReferenceRegistry = false)
129+
void DumpArray(TypeTreeNode node, ref long offset, int level)
130130
{
131131
// First child contains array size.
132132
var sizeNode = node.Children[0];
@@ -178,16 +178,11 @@ void DumpArray(TypeTreeNode node, ref long offset, int level, bool isManagedRefe
178178
}
179179
else
180180
{
181+
++level;
182+
181183
for (int i = 0; i < arraySize; ++i)
182184
{
183-
if (!isManagedReferenceRegistry)
184-
{
185-
RecursiveDump(dataNode, ref offset, level + 1);
186-
}
187-
else
188-
{
189-
DumpManagedReferenceData(dataNode, ref offset, level + 1);
190-
}
185+
RecursiveDump(dataNode, ref offset, level);
191186
}
192187
}
193188
}
@@ -199,56 +194,78 @@ void DumpManagedReferenceRegistry(TypeTreeNode node, ref long offset, int level)
199194
throw new Exception("Invalid ManagedReferenceRegistry");
200195

201196
// First child is version number.
197+
var version = m_Reader.ReadInt32(offset);
202198
RecursiveDump(node.Children[0], ref offset, level);
203-
204-
var refIdsVectorNode = node.Children[1];
205199

206-
if (refIdsVectorNode.Children.Count < 1 || refIdsVectorNode.Name != "RefIds")
207-
throw new Exception("Invalid ManagedReferenceRegistry RefIds vector");
208-
209-
m_StringBuilder.Append(' ', level * 2);
210-
m_StringBuilder.Append(refIdsVectorNode.Name);
211-
m_StringBuilder.Append(' ');
212-
m_StringBuilder.Append(refIdsVectorNode.Type);
213-
m_StringBuilder.Append(' ');
214-
215-
m_Writer.WriteLine(m_StringBuilder);
216-
m_StringBuilder.Clear();
200+
TypeTreeNode refTypeNode;
201+
TypeTreeNode refObjData;
217202

218-
var refIdsArrayNode = refIdsVectorNode.Children[0];
219-
220-
if (refIdsArrayNode.Children.Count != 2 || !refIdsArrayNode.Flags.HasFlag(TypeTreeFlags.IsArray))
221-
throw new Exception("Invalid ManagedReferenceRegistry RefIds array");
222-
223-
DumpArray(refIdsArrayNode, ref offset, level + 1, true);
224-
}
203+
if (version == 1)
204+
{
205+
// Second child is the ReferencedObject.
206+
var refObjNode = node.Children[1];
207+
// And its children are the referenced type and data nodes.
208+
refTypeNode = refObjNode.Children[0];
209+
refObjData = refObjNode.Children[1];
210+
211+
int i = 0;
225212

226-
void DumpManagedReferenceData(TypeTreeNode node, ref long offset, int level)
227-
{
228-
m_StringBuilder.Append(' ', level * 2);
229-
m_StringBuilder.Append(node.Name);
230-
m_StringBuilder.Append(' ');
231-
m_StringBuilder.Append(node.Type);
232-
m_StringBuilder.Append(' ');
233-
234-
m_Writer.WriteLine(m_StringBuilder);
235-
m_StringBuilder.Clear();
213+
while (DumpManagedReferenceData(refTypeNode, refObjData, ref offset, level, i++))
214+
{}
215+
}
216+
else if (version == 2)
217+
{
218+
// Second child is the RefIds vector.
219+
var refIdsVectorNode = node.Children[1];
236220

237-
if (node.Children.Count < 3)
238-
throw new Exception("Invalid ReferencedObject");
239-
240-
// First child is rid.
241-
RecursiveDump(node.Children[0], ref offset, level + 1);
221+
if (refIdsVectorNode.Children.Count < 1 || refIdsVectorNode.Name != "RefIds")
222+
throw new Exception("Invalid ManagedReferenceRegistry RefIds vector");
242223

243-
// Second child is ReferencedManagedType
244-
var refTypeNode = node.Children[1];
245-
224+
var refIdsArrayNode = refIdsVectorNode.Children[0];
225+
226+
if (refIdsArrayNode.Children.Count != 2 || !refIdsArrayNode.Flags.HasFlag(TypeTreeFlags.IsArray))
227+
throw new Exception("Invalid ManagedReferenceRegistry RefIds array");
228+
229+
// First child is the array size.
230+
int arraySize = m_Reader.ReadInt32(offset);
231+
offset += 4;
232+
233+
// Second child is the ReferencedObject.
234+
var refObjNode = refIdsArrayNode.Children[1];
235+
236+
for (int i = 0; i < arraySize; ++i)
237+
{
238+
// First child is the rid.
239+
long rid = m_Reader.ReadInt64(offset);
240+
offset += 8;
241+
242+
// And the next children are the referenced type and data nodes.
243+
refTypeNode = refObjNode.Children[1];
244+
refObjData = refObjNode.Children[2];
245+
DumpManagedReferenceData(refTypeNode, refObjData, ref offset, level, rid);
246+
}
247+
}
248+
else
249+
{
250+
throw new Exception("Unsupported ManagedReferenceRegistry version");
251+
}
252+
}
253+
254+
bool DumpManagedReferenceData(TypeTreeNode refTypeNode, TypeTreeNode referencedTypeDataNode, ref long offset, int level, long id)
255+
{
246256
if (refTypeNode.Children.Count < 3)
247257
throw new Exception("Invalid ReferencedManagedType");
258+
259+
m_StringBuilder.Append(' ', level * 2);
260+
m_StringBuilder.Append($"rid_");
261+
m_StringBuilder.Append(id);
262+
m_StringBuilder.Append(" ReferencedObject");
263+
m_StringBuilder.AppendLine();
264+
++level;
248265

249266
var refTypeOffset = offset;
250267
var stringSize = m_Reader.ReadInt32(offset);
251-
var clasName = m_Reader.ReadString(offset + 4, stringSize);
268+
var className = m_Reader.ReadString(offset + 4, stringSize);
252269
offset += stringSize + 4;
253270
offset = (offset + 3) & ~(3);
254271

@@ -262,13 +279,12 @@ void DumpManagedReferenceData(TypeTreeNode node, ref long offset, int level)
262279
offset += stringSize + 4;
263280
offset = (offset + 3) & ~(3);
264281

282+
if (className == "Terminus" && namespaceName == "UnityEngine.DMAT" && assemblyName == "FAKE_ASM")
283+
return false;
284+
265285
// Not the most efficient way, but it simplifies the code.
266-
RecursiveDump(refTypeNode, ref refTypeOffset, level + 1);
286+
RecursiveDump(refTypeNode, ref refTypeOffset, level);
267287

268-
// Third child is the referenced type data.
269-
var referencedTypeDataNode = node.Children[2];
270-
level += 1;
271-
272288
m_StringBuilder.Append(' ', level * 2);
273289
m_StringBuilder.Append(referencedTypeDataNode.Name);
274290
m_StringBuilder.Append(' ');
@@ -278,13 +294,15 @@ void DumpManagedReferenceData(TypeTreeNode node, ref long offset, int level)
278294
m_Writer.WriteLine(m_StringBuilder);
279295
m_StringBuilder.Clear();
280296

281-
var refTypeRoot = m_SerializedFile.GetRefTypeTypeTreeRoot(clasName, namespaceName, assemblyName);
282-
297+
var refTypeRoot = m_SerializedFile.GetRefTypeTypeTreeRoot(className, namespaceName, assemblyName);
298+
283299
// Dump the ReferencedObject using its own TypeTree, but skip the root.
284300
foreach (var child in refTypeRoot.Children)
285301
{
286302
RecursiveDump(child, ref offset, level + 1);
287303
}
304+
305+
return true;
288306
}
289307

290308
void OutputSerializedFile(string path)

0 commit comments

Comments
 (0)