|  | # Copyright (C) 2023 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | """Contains tables for relevant for slices.""" | 
|  |  | 
|  | from python.generators.trace_processor_table.public import Column as C | 
|  | from python.generators.trace_processor_table.public import ColumnDoc | 
|  | from python.generators.trace_processor_table.public import ColumnFlag | 
|  | from python.generators.trace_processor_table.public import CppInt32 | 
|  | from python.generators.trace_processor_table.public import CppInt64 | 
|  | from python.generators.trace_processor_table.public import CppOptional | 
|  | from python.generators.trace_processor_table.public import CppSelfTableId | 
|  | from python.generators.trace_processor_table.public import CppString | 
|  | from python.generators.trace_processor_table.public import CppTableId | 
|  | from python.generators.trace_processor_table.public import CppUint32 | 
|  | from python.generators.trace_processor_table.public import Table | 
|  | from python.generators.trace_processor_table.public import TableDoc | 
|  | from python.generators.trace_processor_table.public import WrappingSqlView | 
|  |  | 
|  | from src.trace_processor.tables.track_tables import TRACK_TABLE | 
|  |  | 
|  | SLICE_TABLE = Table( | 
|  | python_module=__file__, | 
|  | class_name='SliceTable', | 
|  | sql_name='__intrinsic_slice', | 
|  | columns=[ | 
|  | C('ts', CppInt64(), flags=ColumnFlag.SORTED), | 
|  | C('dur', CppInt64()), | 
|  | C('track_id', CppTableId(TRACK_TABLE)), | 
|  | C('category', CppOptional(CppString())), | 
|  | C('name', CppOptional(CppString())), | 
|  | C('depth', CppUint32()), | 
|  | C('stack_id', CppInt64()), | 
|  | C('parent_stack_id', CppInt64()), | 
|  | C('parent_id', CppOptional(CppSelfTableId())), | 
|  | C('arg_set_id', CppUint32()), | 
|  | C('thread_ts', CppOptional(CppInt64())), | 
|  | C('thread_dur', CppOptional(CppInt64())), | 
|  | C('thread_instruction_count', CppOptional(CppInt64())), | 
|  | C('thread_instruction_delta', CppOptional(CppInt64())), | 
|  | ], | 
|  | wrapping_sql_view=WrappingSqlView('slice'), | 
|  | tabledoc=TableDoc( | 
|  | doc=''' | 
|  | Contains slices from userspace which explains what threads were doing | 
|  | during the trace. | 
|  | ''', | 
|  | group='Events', | 
|  | columns={ | 
|  | 'ts': | 
|  | 'The timestamp at the start of the slice (in nanoseconds).', | 
|  | 'dur': | 
|  | 'The duration of the slice (in nanoseconds).', | 
|  | 'track_id': | 
|  | 'The id of the track this slice is located on.', | 
|  | 'category': | 
|  | ''' | 
|  | The "category" of the slice. If this slice originated with | 
|  | track_event, this column contains the category emitted. | 
|  | Otherwise, it is likely to be null (with limited exceptions). | 
|  | ''', | 
|  | 'name': | 
|  | ''' | 
|  | The name of the slice. The name describes what was happening | 
|  | during the slice. | 
|  | ''', | 
|  | 'depth': | 
|  | 'The depth of the slice in the current stack of slices.', | 
|  | 'stack_id': | 
|  | ''' | 
|  | A unique identifier obtained from the names of all slices | 
|  | in this stack. This is rarely useful and kept around only | 
|  | for legacy reasons. | 
|  | ''', | 
|  | 'parent_stack_id': | 
|  | 'The stack_id for the parent of this slice. Rarely useful.', | 
|  | 'parent_id': | 
|  | ''' | 
|  | The id of the parent (i.e. immediate ancestor) slice for this | 
|  | slice. | 
|  | ''', | 
|  | 'arg_set_id': | 
|  | ColumnDoc( | 
|  | 'The id of the argument set associated with this slice.', | 
|  | joinable='args.arg_set_id'), | 
|  | 'thread_ts': | 
|  | ''' | 
|  | The thread timestamp at the start of the slice. This column | 
|  | will only be populated if thread timestamp collection is | 
|  | enabled with track_event. | 
|  | ''', | 
|  | 'thread_dur': | 
|  | '''' | 
|  | The thread time used by this slice. This column will only be | 
|  | populated if thread timestamp collection is enabled with | 
|  | track_event. | 
|  | ''', | 
|  | 'thread_instruction_count': | 
|  | ''' | 
|  | The value of the CPU instruction counter at the start of the | 
|  | slice. This column will only be populated if thread | 
|  | instruction collection is enabled with track_event. | 
|  | ''', | 
|  | 'thread_instruction_delta': | 
|  | ''' | 
|  | The change in value of the CPU instruction counter between the | 
|  | start and end of the slice. This column will only be | 
|  | populated if thread instruction collection is enabled with | 
|  | track_event. | 
|  | ''', | 
|  | })) | 
|  |  | 
|  | GPU_SLICE_TABLE = Table( | 
|  | python_module=__file__, | 
|  | class_name='GpuSliceTable', | 
|  | sql_name='gpu_slice', | 
|  | columns=[ | 
|  | C('context_id', CppOptional(CppInt64())), | 
|  | C('render_target', CppOptional(CppInt64())), | 
|  | C('render_target_name', CppString()), | 
|  | C('render_pass', CppOptional(CppInt64())), | 
|  | C('render_pass_name', CppString()), | 
|  | C('command_buffer', CppOptional(CppInt64())), | 
|  | C('command_buffer_name', CppString()), | 
|  | C('frame_id', CppOptional(CppUint32())), | 
|  | C('submission_id', CppOptional(CppUint32())), | 
|  | C('hw_queue_id', CppOptional(CppInt64())), | 
|  | C('upid', CppOptional(CppUint32())), | 
|  | C('render_subpasses', CppString()), | 
|  | ], | 
|  | parent=SLICE_TABLE, | 
|  | tabledoc=TableDoc( | 
|  | doc='''''', | 
|  | group='Slice', | 
|  | columns={ | 
|  | 'context_id': | 
|  | '''''', | 
|  | 'render_target': | 
|  | '''''', | 
|  | 'render_target_name': | 
|  | '''''', | 
|  | 'render_pass': | 
|  | '''''', | 
|  | 'render_pass_name': | 
|  | '''''', | 
|  | 'command_buffer': | 
|  | '''''', | 
|  | 'command_buffer_name': | 
|  | '''''', | 
|  | 'frame_id': | 
|  | '''''', | 
|  | 'submission_id': | 
|  | '''''', | 
|  | 'hw_queue_id': | 
|  | '''''', | 
|  | 'upid': | 
|  | ''' | 
|  | Unique process id of the app that generates this gpu render | 
|  | stage event. | 
|  | ''', | 
|  | 'render_subpasses': | 
|  | '''''' | 
|  | })) | 
|  |  | 
|  | GRAPHICS_FRAME_SLICE_TABLE = Table( | 
|  | python_module=__file__, | 
|  | class_name='GraphicsFrameSliceTable', | 
|  | sql_name='frame_slice', | 
|  | columns=[ | 
|  | C('frame_number', CppUint32()), | 
|  | C('layer_name', CppString()), | 
|  | C('queue_to_acquire_time', CppInt64()), | 
|  | C('acquire_to_latch_time', CppInt64()), | 
|  | C('latch_to_present_time', CppInt64()), | 
|  | ], | 
|  | parent=SLICE_TABLE, | 
|  | tabledoc=TableDoc( | 
|  | doc='''''', | 
|  | group='Slice', | 
|  | columns={ | 
|  | 'frame_number': '''''', | 
|  | 'layer_name': '''''', | 
|  | 'queue_to_acquire_time': '''''', | 
|  | 'acquire_to_latch_time': '''''', | 
|  | 'latch_to_present_time': '''''' | 
|  | })) | 
|  |  | 
|  | EXPECTED_FRAME_TIMELINE_SLICE_TABLE = Table( | 
|  | python_module=__file__, | 
|  | class_name='ExpectedFrameTimelineSliceTable', | 
|  | sql_name='expected_frame_timeline_slice', | 
|  | columns=[ | 
|  | C('display_frame_token', CppInt64()), | 
|  | C('surface_frame_token', CppInt64()), | 
|  | C('upid', CppUint32()), | 
|  | C('layer_name', CppString()), | 
|  | ], | 
|  | parent=SLICE_TABLE, | 
|  | tabledoc=TableDoc( | 
|  | doc=''' | 
|  | This table contains information on the expected timeline of either | 
|  | a display frame or a surface frame. | 
|  | ''', | 
|  | group='Slice', | 
|  | columns={ | 
|  | 'display_frame_token': | 
|  | 'Display frame token (vsync id).', | 
|  | 'surface_frame_token': | 
|  | ''' | 
|  | Surface frame token (vsync id), null if this is a display frame. | 
|  | ''', | 
|  | 'upid': | 
|  | ''' | 
|  | Unique process id of the app that generates the surface frame. | 
|  | ''', | 
|  | 'layer_name': | 
|  | 'Layer name if this is a surface frame.', | 
|  | })) | 
|  |  | 
|  | ACTUAL_FRAME_TIMELINE_SLICE_TABLE = Table( | 
|  | python_module=__file__, | 
|  | class_name='ActualFrameTimelineSliceTable', | 
|  | sql_name='actual_frame_timeline_slice', | 
|  | columns=[ | 
|  | C('display_frame_token', CppInt64()), | 
|  | C('surface_frame_token', CppInt64()), | 
|  | C('upid', CppUint32()), | 
|  | C('layer_name', CppString()), | 
|  | C('present_type', CppString()), | 
|  | C('on_time_finish', CppInt32()), | 
|  | C('gpu_composition', CppInt32()), | 
|  | C('jank_type', CppString()), | 
|  | C('jank_severity_type', CppString()), | 
|  | C('prediction_type', CppString()), | 
|  | C('jank_tag', CppString()), | 
|  | ], | 
|  | parent=SLICE_TABLE, | 
|  | tabledoc=TableDoc( | 
|  | doc=''' | 
|  | This table contains information on the actual timeline and additional | 
|  | analysis related to the performance of either a display frame or a | 
|  | surface frame. | 
|  | ''', | 
|  | group='Slice', | 
|  | columns={ | 
|  | 'display_frame_token': | 
|  | 'Display frame token (vsync id).', | 
|  | 'surface_frame_token': | 
|  | ''' | 
|  | Surface frame token (vsync id), null if this is a display frame. | 
|  | ''', | 
|  | 'upid': | 
|  | ''' | 
|  | Unique process id of the app that generates the surface frame. | 
|  | ''', | 
|  | 'layer_name': | 
|  | 'Layer name if this is a surface frame.', | 
|  | 'present_type': | 
|  | 'Frame\'s present type (eg. on time / early / late).', | 
|  | 'on_time_finish': | 
|  | 'Whether the frame finishes on time.', | 
|  | 'gpu_composition': | 
|  | 'Whether the frame used gpu composition.', | 
|  | 'jank_type': | 
|  | ''' | 
|  | Specify the jank types for this frame if there's jank, or | 
|  | none if no jank occurred. | 
|  | ''', | 
|  | 'jank_severity_type': | 
|  | 'Severity of the jank: none if no jank.', | 
|  | 'prediction_type': | 
|  | 'Frame\'s prediction type (eg. valid / expired).', | 
|  | 'jank_tag': | 
|  | 'Jank tag based on jank type, used for slice visualization.' | 
|  | })) | 
|  |  | 
|  | EXPERIMENTAL_FLAT_SLICE_TABLE = Table( | 
|  | python_module=__file__, | 
|  | class_name='ExperimentalFlatSliceTable', | 
|  | sql_name='experimental_flat_slice', | 
|  | columns=[ | 
|  | C('ts', CppInt64()), | 
|  | C('dur', CppInt64()), | 
|  | C('track_id', CppTableId(TRACK_TABLE)), | 
|  | C('category', CppOptional(CppString())), | 
|  | C('name', CppOptional(CppString())), | 
|  | C('arg_set_id', CppUint32()), | 
|  | C('source_id', CppOptional(CppTableId(SLICE_TABLE))), | 
|  | C('start_bound', CppInt64(), flags=ColumnFlag.HIDDEN), | 
|  | C('end_bound', CppInt64(), flags=ColumnFlag.HIDDEN), | 
|  | ], | 
|  | tabledoc=TableDoc( | 
|  | doc=''' | 
|  | An experimental table which "flattens" stacks of slices to contain | 
|  | only the "deepest" slice at any point in time on each track. | 
|  | ''', | 
|  | group='Slice', | 
|  | columns={ | 
|  | 'ts': | 
|  | '''The timestamp at the start of the slice (in nanoseconds).''', | 
|  | 'dur': | 
|  | '''The duration of the slice (in nanoseconds).''', | 
|  | 'track_id': | 
|  | 'The id of the track this slice is located on.', | 
|  | 'category': | 
|  | ''' | 
|  | The "category" of the slice. If this slice originated with | 
|  | track_event, this column contains the category emitted. | 
|  | Otherwise, it is likely to be null (with limited exceptions). | 
|  | ''', | 
|  | 'name': | 
|  | ''' | 
|  | The name of the slice. The name describes what was happening | 
|  | during the slice. | 
|  | ''', | 
|  | 'arg_set_id': | 
|  | ColumnDoc( | 
|  | 'The id of the argument set associated with this slice.', | 
|  | joinable='args.arg_set_id'), | 
|  | 'source_id': | 
|  | 'The id of the slice which this row originated from.', | 
|  | })) | 
|  |  | 
|  | ANDROID_NETWORK_PACKETS_TABLE = Table( | 
|  | python_module=__file__, | 
|  | class_name='AndroidNetworkPacketsTable', | 
|  | sql_name='__intrinsic_android_network_packets', | 
|  | columns=[ | 
|  | C('iface', CppString()), | 
|  | C('direction', CppString()), | 
|  | C('packet_transport', CppString()), | 
|  | C('packet_length', CppInt64()), | 
|  | C('packet_count', CppInt64()), | 
|  | C('socket_tag', CppUint32()), | 
|  | C('socket_tag_str', CppString()), | 
|  | C('socket_uid', CppUint32()), | 
|  | C('local_port', CppOptional(CppUint32())), | 
|  | C('remote_port', CppOptional(CppUint32())), | 
|  | C('packet_icmp_type', CppOptional(CppUint32())), | 
|  | C('packet_icmp_code', CppOptional(CppUint32())), | 
|  | C('packet_tcp_flags', CppOptional(CppUint32())), | 
|  | C('packet_tcp_flags_str', CppOptional(CppString())), | 
|  | ], | 
|  | parent=SLICE_TABLE, | 
|  | tabledoc=TableDoc( | 
|  | doc=""" | 
|  | This table contains details on Android Network activity. | 
|  | """, | 
|  | group='Slice', | 
|  | columns={ | 
|  | 'iface': 'The name of the network interface used', | 
|  | 'direction': 'The direction of traffic (Received or Transmitted)', | 
|  | 'packet_transport': | 
|  | 'The transport protocol of packets in this event', | 
|  | 'packet_length': 'The length (in bytes) of packets in this event', | 
|  | 'packet_count': 'The number of packets contained in this event', | 
|  | 'socket_tag': 'The Android network tag of the socket', | 
|  | 'socket_tag_str': 'The socket tag formatted as a hex string', | 
|  | 'socket_uid': 'The Linux user id of the socket', | 
|  | 'local_port': 'The local udp/tcp port', | 
|  | 'remote_port': 'The remote udp/tcp port', | 
|  | 'packet_icmp_type': 'The 1-byte ICMP type identifier', | 
|  | 'packet_icmp_code': 'The 1-byte ICMP code identifier', | 
|  | 'packet_tcp_flags': | 
|  | 'The TCP flags as an integer bitmask (FIN=0x1, SYN=0x2, etc)', | 
|  | 'packet_tcp_flags_str': | 
|  | ''' | 
|  | The TCP flags formatted as a string bitmask (e.g. "f...a..." for | 
|  | FIN & ACK) | 
|  | ''', | 
|  | }, | 
|  | ), | 
|  | ) | 
|  |  | 
|  | # Keep this list sorted. | 
|  | ALL_TABLES = [ | 
|  | ACTUAL_FRAME_TIMELINE_SLICE_TABLE, | 
|  | ANDROID_NETWORK_PACKETS_TABLE, | 
|  | EXPECTED_FRAME_TIMELINE_SLICE_TABLE, | 
|  | EXPERIMENTAL_FLAT_SLICE_TABLE, | 
|  | GPU_SLICE_TABLE, | 
|  | GRAPHICS_FRAME_SLICE_TABLE, | 
|  | SLICE_TABLE, | 
|  | ] |