• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#
2# Copyright © 2021 Intel 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 FROM,
20# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21# SOFTWARE.
22#
23
24import argparse
25import sys
26
27# List of the default tracepoints enabled. By default most tracepoints are
28# enabled, set tp_default=False to disable them by default.
29#
30# Currently only stall is disabled by default
31intel_default_tps = []
32
33#
34# Tracepoint definitions:
35#
36def define_tracepoints(args):
37    from u_trace import Header, HeaderScope
38    from u_trace import ForwardDecl
39    from u_trace import Tracepoint
40    from u_trace import TracepointArg as Arg
41    from u_trace import TracepointArgStruct as ArgStruct
42
43    Header('intel_driver_ds.h', scope=HeaderScope.SOURCE)
44    Header('blorp/blorp_priv.h', scope=HeaderScope.HEADER)
45    Header('ds/intel_driver_ds.h', scope=HeaderScope.HEADER)
46
47    def begin_end_tp(name, tp_args=[], tp_struct=None, tp_print=None,
48                     tp_default_enabled=True, end_pipelined=True,
49                     need_cs_param=False):
50        global intel_default_tps
51        if tp_default_enabled:
52            intel_default_tps.append(name)
53        Tracepoint('intel_begin_{0}'.format(name),
54                   toggle_name=name,
55                   tp_perfetto='intel_ds_begin_{0}'.format(name),
56                   need_cs_param=need_cs_param)
57        Tracepoint('intel_end_{0}'.format(name),
58                   toggle_name=name,
59                   args=tp_args,
60                   tp_struct=tp_struct,
61                   tp_perfetto='intel_ds_end_{0}'.format(name),
62                   tp_print=tp_print,
63                   end_of_pipe=end_pipelined,
64                   need_cs_param=need_cs_param)
65
66    # Frame tracepoints
67    begin_end_tp('frame',
68                 tp_args=[Arg(type='uint32_t', var='frame', c_format='%u'),],
69                 end_pipelined=False,
70                 need_cs_param=True)
71
72    # Annotations for Queue(Begin|End)DebugUtilsLabelEXT
73    begin_end_tp('queue_annotation',
74                 tp_args=[ArgStruct(type='unsigned', var='len'),
75                          ArgStruct(type='const char *', var='str'),],
76                 tp_struct=[Arg(type='uint8_t', name='dummy', var='0', c_format='%hhu'),
77                            Arg(type='char', name='str', var='str', c_format='%s', length_arg='len + 1', copy_func='strncpy'),],
78                 end_pipelined=False,
79                 need_cs_param=True)
80
81    # Batch buffer tracepoints, only for Iris
82    begin_end_tp('batch',
83                 tp_args=[Arg(type='uint8_t', var='name', c_format='%hhu'),],
84                 end_pipelined=False)
85
86    # Command buffer tracepoints, only for Anv
87    begin_end_tp('cmd_buffer',
88                 tp_args=[Arg(type='uint8_t', var='level', c_format='%hhu'),],
89                 end_pipelined=False)
90
91    # Annotations for Cmd(Begin|End)DebugUtilsLabelEXT
92    begin_end_tp('cmd_buffer_annotation',
93                 tp_args=[ArgStruct(type='unsigned', var='len'),
94                          ArgStruct(type='const char *', var='str'),],
95                 tp_struct=[Arg(type='uint8_t', name='dummy', var='0', c_format='%hhu'),
96                            Arg(type='char', name='str', var='str', c_format='%s', length_arg='len + 1', copy_func='strncpy'),],
97                 end_pipelined=True)
98
99    # Transform feedback, only for Anv
100    begin_end_tp('xfb',
101                 end_pipelined=False)
102
103    # Dynamic rendering tracepoints, only for Anv
104    begin_end_tp('render_pass',
105                 tp_args=[Arg(type='uint16_t', var='width', c_format='%hu'),
106                          Arg(type='uint16_t', var='height', c_format='%hu'),
107                          Arg(type='uint8_t', var='att_count', c_format='%hhu'),
108                          Arg(type='uint8_t', var='msaa', c_format='%hhu'),])
109
110    # Blorp operations, Anv & Iris
111    begin_end_tp('blorp',
112                 tp_args=[Arg(type='enum blorp_op', name='op', var='op', c_format='%s', to_prim_type='blorp_op_to_name({})'),
113                          Arg(type='uint32_t', name='width', var='width', c_format='%u'),
114                          Arg(type='uint32_t', name='height', var='height', c_format='%u'),
115                          Arg(type='uint32_t', name='samples', var='samples', c_format='%u'),
116                          Arg(type='enum blorp_shader_pipeline', name='blorp_pipe', var='shader_pipe', c_format='%s', to_prim_type='blorp_shader_pipeline_to_name({})'),
117                          Arg(type='enum isl_format', name='dst_fmt', var='dst_fmt', c_format='%s', to_prim_type='isl_format_get_short_name({})'),
118                          Arg(type='enum isl_format', name='src_fmt', var='src_fmt', c_format='%s', to_prim_type='isl_format_get_short_name({})'),
119                          Arg(type='uint8_t', name='predicated', var='predicated', c_format='%hhu'),
120                          ])
121
122    # vkCmdWriteBufferMarker*, only for Anv
123    begin_end_tp('write_buffer_marker',
124                 end_pipelined=False)
125
126    # Indirect draw generation, only for Anv
127    begin_end_tp('generate_draws')
128    begin_end_tp('generate_commands')
129
130    # vkCmdResetQuery, only for Anv
131    begin_end_tp('query_clear_blorp',
132                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u')])
133    begin_end_tp('query_clear_cs',
134                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u')],
135                 end_pipelined=False)
136
137    # vkCmdCopyQueryResults, only for Anv
138    begin_end_tp('query_copy_cs',
139                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u')],
140                 end_pipelined=False)
141    begin_end_tp('query_copy_shader',
142                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u')])
143
144    # Various draws/dispatch, Anv & Iris
145    begin_end_tp('draw',
146                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u')])
147    begin_end_tp('draw_multi',
148                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u'),])
149    begin_end_tp('draw_indexed',
150                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u'),])
151    begin_end_tp('draw_indexed_multi',
152                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u'),])
153    begin_end_tp('draw_indirect_byte_count',
154                 tp_args=[Arg(type='uint32_t', var='instance_count', c_format='%u'),])
155    begin_end_tp('draw_indirect',
156                 tp_args=[Arg(type='uint32_t', var='draw_count', c_format='%u'),])
157    begin_end_tp('draw_indexed_indirect',
158                 tp_args=[Arg(type='uint32_t', var='draw_count', c_format='%u'),])
159    begin_end_tp('draw_indirect_count',
160                 tp_args=[Arg(type='uint32_t', var='max_draw_count', c_format='%u'),])
161    begin_end_tp('draw_indexed_indirect_count',
162                 tp_args=[Arg(type='uint32_t', var='max_draw_count', c_format='%u'),])
163
164    begin_end_tp('draw_mesh',
165                 tp_args=[Arg(type='uint32_t', var='group_x', c_format='%u'),
166                          Arg(type='uint32_t', var='group_y', c_format='%u'),
167                          Arg(type='uint32_t', var='group_z', c_format='%u'),],
168                 tp_print=['group=%ux%ux%u', '__entry->group_x', '__entry->group_y', '__entry->group_z'])
169    begin_end_tp('draw_mesh_indirect',
170                 tp_args=[Arg(type='uint32_t', var='draw_count', c_format='%u'),])
171    begin_end_tp('draw_mesh_indirect_count',
172                 tp_args=[Arg(type='uint32_t', var='max_draw_count', c_format='%u'),])
173
174    begin_end_tp('compute',
175                 tp_args=[Arg(type='uint32_t', var='group_x', c_format='%u'),
176                          Arg(type='uint32_t', var='group_y', c_format='%u'),
177                          Arg(type='uint32_t', var='group_z', c_format='%u'),],
178                 tp_print=['group=%ux%ux%u', '__entry->group_x', '__entry->group_y', '__entry->group_z'])
179
180    # Used to identify copies generated by utrace
181    begin_end_tp('trace_copy',
182                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u'),])
183    begin_end_tp('trace_copy_cb',
184                 tp_args=[Arg(type='uint32_t', var='count', c_format='%u'),],
185                 need_cs_param=True)
186
187    begin_end_tp('as_build')
188
189    begin_end_tp('rays',
190                 tp_args=[Arg(type='uint32_t', var='group_x', c_format='%u'),
191                          Arg(type='uint32_t', var='group_y', c_format='%u'),
192                          Arg(type='uint32_t', var='group_z', c_format='%u'),],
193                 tp_print=['group=%ux%ux%u', '__entry->group_x', '__entry->group_y', '__entry->group_z'])
194
195    def flag_bits(args):
196        bits = [Arg(type='enum intel_ds_stall_flag', name='flags', var='decode_cb(flags)', c_format='0x%x')]
197        for a in args:
198            bits.append(Arg(type='bool', name=a[1], var='__entry->flags & INTEL_DS_{0}_BIT'.format(a[0]), c_format='%u'))
199        return bits
200
201    def stall_args(args):
202        fmt = ''
203        exprs = []
204        for a in args:
205            fmt += '%s'
206            exprs.append('(__entry->flags & INTEL_DS_{0}_BIT) ? "+{1}" : ""'.format(a[0], a[1]))
207        fmt += ' : %s'
208        exprs.append('__entry->reason ? __entry->reason : "unknown"')
209        # To printout flags
210        # fmt += '(0x%08x)'
211        # exprs.append('__entry->flags')
212        fmt = [fmt]
213        fmt += exprs
214        return fmt
215
216    stall_flags = [['DEPTH_CACHE_FLUSH',             'depth_flush'],
217                   ['DATA_CACHE_FLUSH',              'dc_flush'],
218                   ['HDC_PIPELINE_FLUSH',            'hdc_flush'],
219                   ['RENDER_TARGET_CACHE_FLUSH',     'rt_flush'],
220                   ['TILE_CACHE_FLUSH',              'tile_flush'],
221                   ['STATE_CACHE_INVALIDATE',        'state_inval'],
222                   ['CONST_CACHE_INVALIDATE',        'const_inval'],
223                   ['VF_CACHE_INVALIDATE',           'vf_inval'],
224                   ['TEXTURE_CACHE_INVALIDATE',      'tex_inval'],
225                   ['INST_CACHE_INVALIDATE',         'ic_inval'],
226                   ['STALL_AT_SCOREBOARD',           'pb_stall'],
227                   ['DEPTH_STALL',                   'depth_stall'],
228                   ['CS_STALL',                      'cs_stall'],
229                   ['UNTYPED_DATAPORT_CACHE_FLUSH',  'udp_flush'],
230                   ['PSS_STALL_SYNC',                'pss_stall'],
231                   ['END_OF_PIPE',                   'eop'],
232                   ['CCS_CACHE_FLUSH',               'ccs_flush']]
233
234    begin_end_tp('stall',
235                 tp_args=[ArgStruct(type='uint32_t', var='flags'),
236                          ArgStruct(type='intel_ds_stall_cb_t', var='decode_cb'),
237                          ArgStruct(type='const char *', var='reason'),],
238                 tp_struct=[Arg(type='uint32_t', name='flags', var='decode_cb(flags)', c_format='0x%x'),
239                            Arg(type='const char *', name='reason', var='reason', c_format='%s'),],
240                 tp_print=stall_args(stall_flags),
241                 tp_default_enabled=False,
242                 end_pipelined=False)
243
244
245def generate_code(args):
246    from u_trace import utrace_generate
247    from u_trace import utrace_generate_perfetto_utils
248
249    utrace_generate(cpath=args.utrace_src, hpath=args.utrace_hdr,
250                    ctx_param='struct intel_ds_device *dev',
251                    trace_toggle_name='intel_gpu_tracepoint',
252                    trace_toggle_defaults=intel_default_tps)
253    utrace_generate_perfetto_utils(hpath=args.perfetto_hdr,
254                                   basename="intel_tracepoint")
255
256
257def main():
258    parser = argparse.ArgumentParser()
259    parser.add_argument('-p', '--import-path', required=True)
260    parser.add_argument('--utrace-src', required=True)
261    parser.add_argument('--utrace-hdr', required=True)
262    parser.add_argument('--perfetto-hdr', required=True)
263    args = parser.parse_args()
264    sys.path.insert(0, args.import_path)
265    define_tracepoints(args)
266    generate_code(args)
267
268
269if __name__ == '__main__':
270    main()
271