blob: 9d1e8eee16cdc3f08be07ac9bcc8da7cca7e9524 [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;
Jim Flynn1892d212020-05-26 21:10:49 +010092 eventClass.m_NameGuid = profiling::ReadUint64(data, offset);
93 offset += uint64_t_size;
Finn Williams510f6182020-02-21 11:14:08 +000094 m_TimelineDecoder.CreateEventClass(eventClass);
Finn Williamse63a0262019-10-22 10:30:49 +010095}
96
Keith Davis5238aff2020-03-11 12:17:05 +000097void TimelineCaptureCommandHandler::ReadRelationship(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +010098{
Finn Williams510f6182020-02-21 11:14:08 +000099 ITimelineDecoder::Relationship relationship;
100 relationship.m_RelationshipType =
101 static_cast<ITimelineDecoder::RelationshipType>(profiling::ReadUint32(data, offset));
Finn Williamse63a0262019-10-22 10:30:49 +0100102 offset += uint32_t_size;
103
104 relationship.m_Guid = profiling::ReadUint64(data, offset);
105 offset += uint64_t_size;
106
Keith Davis5238aff2020-03-11 12:17:05 +0000107 relationship.m_HeadGuid = profiling::ReadUint64(data, offset);
Finn Williamse63a0262019-10-22 10:30:49 +0100108 offset += uint64_t_size;
109
110 relationship.m_TailGuid = profiling::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000111 offset += uint64_t_size;
Finn Williams0a336dc2020-05-11 15:39:58 +0100112
113 relationship.m_AttributeGuid = profiling::ReadUint64(data, offset);
114 offset += uint64_t_size;
115
Finn Williams510f6182020-02-21 11:14:08 +0000116 m_TimelineDecoder.CreateRelationship(relationship);
Finn Williamse63a0262019-10-22 10:30:49 +0100117}
118
Keith Davis5238aff2020-03-11 12:17:05 +0000119void TimelineCaptureCommandHandler::ReadEvent(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +0100120{
Finn Williams510f6182020-02-21 11:14:08 +0000121 ITimelineDecoder::Event event;
Finn Williamse63a0262019-10-22 10:30:49 +0100122 event.m_TimeStamp = profiling::ReadUint64(data, offset);
123 offset += uint64_t_size;
124
Keith Davis5238aff2020-03-11 12:17:05 +0000125 if ( m_ThreadIdSize == 4 )
Finn Williams510f6182020-02-21 11:14:08 +0000126 {
127 event.m_ThreadId = profiling::ReadUint32(data, offset);
128 }
Keith Davis5238aff2020-03-11 12:17:05 +0000129 else if ( m_ThreadIdSize == 8 )
Finn Williams510f6182020-02-21 11:14:08 +0000130 {
131 event.m_ThreadId = profiling::ReadUint64(data, offset);
132 }
133
134 offset += m_ThreadIdSize;
Finn Williamse63a0262019-10-22 10:30:49 +0100135
136 event.m_Guid = profiling::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000137 offset += uint64_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +0100138
Finn Williams510f6182020-02-21 11:14:08 +0000139 m_TimelineDecoder.CreateEvent(event);
Finn Williamse63a0262019-10-22 10:30:49 +0100140}
141
Finn Williamse6a2ccd2020-02-27 16:21:41 +0000142void TimelineCaptureCommandHandler::SetThreadIdSize(uint32_t size)
143{
144 m_ThreadIdSize = size;
145}
146
Finn Williamse63a0262019-10-22 10:30:49 +0100147void TimelineCaptureCommandHandler::operator()(const profiling::Packet& packet)
148{
149 ParseData(packet);
150}
151
Finn Williamse63a0262019-10-22 10:30:49 +0100152} //namespace gatordmock
153
154} //namespace armnn