iris: Move iris_bo_busy_gem() to i915/iris_bufmgr.c
[platform/upstream/mesa.git] / bin / refcnt-log-helper.py
1 #!/usr/bin/env python3
2 # Copyright © Microsoft Corporation
3 #
4 # Permission is hereby granted, free of charge, to any person obtaining a
5 # copy of this software and associated documentation files (the "Software"),
6 # to deal in the Software without restriction, including without limitation
7 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 # and/or sell copies of the Software, and to permit persons to whom the
9 # Software is furnished to do so, subject to the following conditions:
10 #
11 # The above copyright notice and this permission notice (including the next
12 # paragraph) shall be included in all copies or substantial portions of the
13 # Software.
14 #
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 # IN THE SOFTWARE.
22
23 import argparse
24
25 # Take a log file produced by GALLIUM_REFCNT_LOG, filter it to the objects that
26 # weren't destroyed by the end of the log, and write the results out sorted.
27 # Strips stacks by default to prevent OOM. Could probably be rewritten to walk
28 # the file twice to preserve stacks without OOM, but this was the easy way.
29 def main():
30     parser = argparse.ArgumentParser()
31     parser.add_argument('--input',
32                         action='store',
33                         required=True,
34                         help='path to file containing refcount log')
35     parser.add_argument('--output',
36                         action='store',
37                         required=True,
38                         help='path to trimmed log')
39     parser.add_argument('--filter',
40                         help='object type filter')
41     parser.add_argument('--keep-stacks',
42                         help='keep stacks, otherwise only headers')
43     args = parser.parse_args()
44
45     objects = {}
46
47     with open(args.input) as in_file:
48         stack = []
49         cur_object = ''
50
51         for line in in_file:
52             if line[0] == '<':
53
54                 parts = line.split(' ')
55                 prev_object = cur_object
56                 cur_object = parts[1]
57                 if parts[3].strip() == 'Destroy':
58                     if cur_object in objects:
59                         del objects[cur_object]
60                 else:
61                     if parts[3].strip() == 'Create':
62                         if (not args.filter) or (args.filter in parts[0]):
63                             objects[cur_object] = []
64                     if prev_object in objects:
65                         objects[prev_object] += stack
66
67                 stack = [line]
68             elif args.keep_stacks:
69                 stack += line
70
71     with open(args.output, 'wt') as out_file:
72         for stack in objects.values():
73             for stack_line in stack:
74                 out_file.write(stack_line)
75
76
77 if __name__ == '__main__':
78     main()