blob: 58edd9fc431c5f3b2bc5c43bfe51090b6d2f78dd [file] [log] [blame]
Finn Williamse63a0262019-10-22 10:30:49 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "TimelineCaptureCommandHandler.hpp"
7
Finn Williamse63a0262019-10-22 10:30:49 +01008#include <string>
Finn Williamse6a2ccd2020-02-27 16:21:41 +00009#include <armnn/Logging.hpp>
Finn Williamse63a0262019-10-22 10:30:49 +010010namespace armnn
11{
12
Finn Williams8a2b4682020-02-26 10:25:26 +000013namespace timelinedecoder
Finn Williamse63a0262019-10-22 10:30:49 +010014{
15
16//Array of member functions, the array index matches the decl_id
Finn Williams8a2b4682020-02-26 10:25:26 +000017const TimelineCaptureCommandHandler::ReadFunction TimelineCaptureCommandHandler::m_ReadFunctions[]
Finn Williamse63a0262019-10-22 10:30:49 +010018{
19 &TimelineCaptureCommandHandler::ReadLabel, // Label decl_id = 0
20 &TimelineCaptureCommandHandler::ReadEntity, // Entity decl_id = 1
21 &TimelineCaptureCommandHandler::ReadEventClass, // EventClass decl_id = 2
22 &TimelineCaptureCommandHandler::ReadRelationship, // Relationship decl_id = 3
23 &TimelineCaptureCommandHandler::ReadEvent // Event decl_id = 4
24};
25
26void TimelineCaptureCommandHandler::ParseData(const armnn::profiling::Packet& packet)
27{
28 uint32_t offset = 0;
Keith Davis5238aff2020-03-11 12:17:05 +000029 m_PacketLength = packet.GetLength();
Finn Williamse63a0262019-10-22 10:30:49 +010030
Finn Williamse6a2ccd2020-02-27 16:21:41 +000031 // We are expecting TimelineDirectoryCaptureCommandHandler to set the thread id size
32 // if it not set in the constructor
33 if (m_ThreadIdSize == 0)
34 {
35 ARMNN_LOG(error) << "TimelineCaptureCommandHandler: m_ThreadIdSize has not been set";
36 return;
37 }
38
39 if (packet.GetLength() < 8)
Finn Williamse63a0262019-10-22 10:30:49 +010040 {
41 return;
42 }
43
44 const unsigned char* data = reinterpret_cast<const unsigned char*>(packet.GetData());
45
46 uint32_t declId = 0;
47
Keith Davis5238aff2020-03-11 12:17:05 +000048 while ( offset < m_PacketLength )
49 {
50 declId = profiling::ReadUint32(data, offset);
51 offset += uint32_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +010052
Keith Davis5238aff2020-03-11 12:17:05 +000053 (this->*m_ReadFunctions[declId])(data, offset);
54 }
Finn Williamse63a0262019-10-22 10:30:49 +010055}
56
Keith Davis5238aff2020-03-11 12:17:05 +000057void TimelineCaptureCommandHandler::ReadLabel(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +010058{
Finn Williams510f6182020-02-21 11:14:08 +000059 ITimelineDecoder::Label label;
Finn Williamse63a0262019-10-22 10:30:49 +010060 label.m_Guid = profiling::ReadUint64(data, offset);
61 offset += uint64_t_size;
62
63 uint32_t nameLength = profiling::ReadUint32(data, offset);
64 offset += uint32_t_size;
65
Keith Davis5238aff2020-03-11 12:17:05 +000066 uint32_t i = 0;
67 // nameLength - 1 to account for null operator \0
68 for ( i = 0; i < nameLength - 1; ++i )
Finn Williamse63a0262019-10-22 10:30:49 +010069 {
Finn Williams510f6182020-02-21 11:14:08 +000070 label.m_Name += static_cast<char>(profiling::ReadUint8(data, offset + i));
Finn Williamse63a0262019-10-22 10:30:49 +010071 }
Keith Davis5238aff2020-03-11 12:17:05 +000072 // Shift offset past nameLength
73 uint32_t uint32WordAmount = (nameLength / uint32_t_size) + (nameLength % uint32_t_size != 0 ? 1 : 0);
74 offset += uint32WordAmount * uint32_t_size;
75
Finn Williams510f6182020-02-21 11:14:08 +000076 m_TimelineDecoder.CreateLabel(label);
Finn Williamse63a0262019-10-22 10:30:49 +010077}
78
Keith Davis5238aff2020-03-11 12:17:05 +000079void TimelineCaptureCommandHandler::ReadEntity(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +010080{
Finn Williams510f6182020-02-21 11:14:08 +000081 ITimelineDecoder::Entity entity;
Finn Williamse63a0262019-10-22 10:30:49 +010082 entity.m_Guid = profiling::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +000083 offset += uint64_t_size;
Finn Williams510f6182020-02-21 11:14:08 +000084 m_TimelineDecoder.CreateEntity(entity);
Finn Williamse63a0262019-10-22 10:30:49 +010085}
86
Keith Davis5238aff2020-03-11 12:17:05 +000087void TimelineCaptureCommandHandler::ReadEventClass(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +010088{
Finn Williams510f6182020-02-21 11:14:08 +000089 ITimelineDecoder::EventClass eventClass;
Finn Williamse63a0262019-10-22 10:30:49 +010090 eventClass.m_Guid = profiling::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +000091 offset += uint64_t_size;
Finn Williams510f6182020-02-21 11:14:08 +000092 m_TimelineDecoder.CreateEventClass(eventClass);
Finn Williamse63a0262019-10-22 10:30:49 +010093}
94
Keith Davis5238aff2020-03-11 12:17:05 +000095void TimelineCaptureCommandHandler::ReadRelationship(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +010096{
Finn Williams510f6182020-02-21 11:14:08 +000097 ITimelineDecoder::Relationship relationship;
98 relationship.m_RelationshipType =
99 static_cast<ITimelineDecoder::RelationshipType>(profiling::ReadUint32(data, offset));
Finn Williamse63a0262019-10-22 10:30:49 +0100100 offset += uint32_t_size;
101
102 relationship.m_Guid = profiling::ReadUint64(data, offset);
103 offset += uint64_t_size;
104
Keith Davis5238aff2020-03-11 12:17:05 +0000105 relationship.m_HeadGuid = profiling::ReadUint64(data, offset);
Finn Williamse63a0262019-10-22 10:30:49 +0100106 offset += uint64_t_size;
107
108 relationship.m_TailGuid = profiling::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000109 offset += uint64_t_size;
Finn Williams510f6182020-02-21 11:14:08 +0000110 m_TimelineDecoder.CreateRelationship(relationship);
Finn Williamse63a0262019-10-22 10:30:49 +0100111}
112
Keith Davis5238aff2020-03-11 12:17:05 +0000113void TimelineCaptureCommandHandler::ReadEvent(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +0100114{
Finn Williams510f6182020-02-21 11:14:08 +0000115 ITimelineDecoder::Event event;
Finn Williamse63a0262019-10-22 10:30:49 +0100116 event.m_TimeStamp = profiling::ReadUint64(data, offset);
117 offset += uint64_t_size;
118
Keith Davis5238aff2020-03-11 12:17:05 +0000119 if ( m_ThreadIdSize == 4 )
Finn Williams510f6182020-02-21 11:14:08 +0000120 {
121 event.m_ThreadId = profiling::ReadUint32(data, offset);
122 }
Keith Davis5238aff2020-03-11 12:17:05 +0000123 else if ( m_ThreadIdSize == 8 )
Finn Williams510f6182020-02-21 11:14:08 +0000124 {
125 event.m_ThreadId = profiling::ReadUint64(data, offset);
126 }
127
128 offset += m_ThreadIdSize;
Finn Williamse63a0262019-10-22 10:30:49 +0100129
130 event.m_Guid = profiling::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000131 offset += uint64_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +0100132
Finn Williams510f6182020-02-21 11:14:08 +0000133 m_TimelineDecoder.CreateEvent(event);
Finn Williamse63a0262019-10-22 10:30:49 +0100134}
135
Finn Williamse6a2ccd2020-02-27 16:21:41 +0000136void TimelineCaptureCommandHandler::SetThreadIdSize(uint32_t size)
137{
138 m_ThreadIdSize = size;
139}
140
Finn Williamse63a0262019-10-22 10:30:49 +0100141void TimelineCaptureCommandHandler::operator()(const profiling::Packet& packet)
142{
143 ParseData(packet);
144}
145
Finn Williamse63a0262019-10-22 10:30:49 +0100146} //namespace gatordmock
147
148} //namespace armnn