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