blob: 1fd0d4745a5a8c209b3c370a181c28e89e0db38d [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
8#include <iostream>
9#include <string>
10
11namespace armnn
12{
13
14namespace gatordmock
15{
16
17//Array of member functions, the array index matches the decl_id
18const TimelineCaptureCommandHandler::ReadFunction TimelineCaptureCommandHandler::m_ReadFunctions[5]
19{
20 &TimelineCaptureCommandHandler::ReadLabel, // Label decl_id = 0
21 &TimelineCaptureCommandHandler::ReadEntity, // Entity decl_id = 1
22 &TimelineCaptureCommandHandler::ReadEventClass, // EventClass decl_id = 2
23 &TimelineCaptureCommandHandler::ReadRelationship, // Relationship decl_id = 3
24 &TimelineCaptureCommandHandler::ReadEvent // Event decl_id = 4
25};
26
27void TimelineCaptureCommandHandler::ParseData(const armnn::profiling::Packet& packet)
28{
29 uint32_t offset = 0;
30
31 if (packet.GetLength() < 8)
32 {
33 return;
34 }
35
36 const unsigned char* data = reinterpret_cast<const unsigned char*>(packet.GetData());
37
38 uint32_t declId = 0;
39
40 declId = profiling::ReadUint32(data, offset);
41 offset += uint32_t_size;
42
43 (this->*m_ReadFunctions[declId])(data, offset);
44}
45
46void TimelineCaptureCommandHandler::ReadLabel(const unsigned char* data, uint32_t offset)
47{
Finn Williams510f6182020-02-21 11:14:08 +000048 ITimelineDecoder::Label label;
Finn Williamse63a0262019-10-22 10:30:49 +010049 label.m_Guid = profiling::ReadUint64(data, offset);
50 offset += uint64_t_size;
51
52 uint32_t nameLength = profiling::ReadUint32(data, offset);
53 offset += uint32_t_size;
54
Finn Williams510f6182020-02-21 11:14:08 +000055 for (uint32_t i = 0; i < nameLength-1; ++i)
Finn Williamse63a0262019-10-22 10:30:49 +010056 {
Finn Williams510f6182020-02-21 11:14:08 +000057 label.m_Name += static_cast<char>(profiling::ReadUint8(data, offset + i));
Finn Williamse63a0262019-10-22 10:30:49 +010058 }
Finn Williams510f6182020-02-21 11:14:08 +000059 m_TimelineDecoder.CreateLabel(label);
Finn Williamse63a0262019-10-22 10:30:49 +010060}
61
62void TimelineCaptureCommandHandler::ReadEntity(const unsigned char* data, uint32_t offset)
63{
Finn Williams510f6182020-02-21 11:14:08 +000064 ITimelineDecoder::Entity entity;
Finn Williamse63a0262019-10-22 10:30:49 +010065 entity.m_Guid = profiling::ReadUint64(data, offset);
66
Finn Williams510f6182020-02-21 11:14:08 +000067 m_TimelineDecoder.CreateEntity(entity);
Finn Williamse63a0262019-10-22 10:30:49 +010068}
69
70void TimelineCaptureCommandHandler::ReadEventClass(const unsigned char* data, uint32_t offset)
71{
Finn Williams510f6182020-02-21 11:14:08 +000072 ITimelineDecoder::EventClass eventClass;
Finn Williamse63a0262019-10-22 10:30:49 +010073 eventClass.m_Guid = profiling::ReadUint64(data, offset);
74
Finn Williams510f6182020-02-21 11:14:08 +000075 m_TimelineDecoder.CreateEventClass(eventClass);
Finn Williamse63a0262019-10-22 10:30:49 +010076}
77
78void TimelineCaptureCommandHandler::ReadRelationship(const unsigned char* data, uint32_t offset)
79{
Finn Williams510f6182020-02-21 11:14:08 +000080 ITimelineDecoder::Relationship relationship;
81 relationship.m_RelationshipType =
82 static_cast<ITimelineDecoder::RelationshipType>(profiling::ReadUint32(data, offset));
Finn Williamse63a0262019-10-22 10:30:49 +010083 offset += uint32_t_size;
84
85 relationship.m_Guid = profiling::ReadUint64(data, offset);
86 offset += uint64_t_size;
87
88 relationship.m_HeadGuid = profiling::ReadUint64(data, offset);
89 offset += uint64_t_size;
90
91 relationship.m_TailGuid = profiling::ReadUint64(data, offset);
92
Finn Williams510f6182020-02-21 11:14:08 +000093 m_TimelineDecoder.CreateRelationship(relationship);
Finn Williamse63a0262019-10-22 10:30:49 +010094}
95
Finn Williamse63a0262019-10-22 10:30:49 +010096void TimelineCaptureCommandHandler::ReadEvent(const unsigned char* data, uint32_t offset)
97{
Finn Williams510f6182020-02-21 11:14:08 +000098 ITimelineDecoder::Event event;
Finn Williamse63a0262019-10-22 10:30:49 +010099 event.m_TimeStamp = profiling::ReadUint64(data, offset);
100 offset += uint64_t_size;
101
Finn Williams510f6182020-02-21 11:14:08 +0000102 if (m_ThreadIdSize == 4)
103 {
104 event.m_ThreadId = profiling::ReadUint32(data, offset);
105 }
106 else if (m_ThreadIdSize == 8)
107 {
108 event.m_ThreadId = profiling::ReadUint64(data, offset);
109 }
110
111 offset += m_ThreadIdSize;
Finn Williamse63a0262019-10-22 10:30:49 +0100112
113 event.m_Guid = profiling::ReadUint64(data, offset);
114
Finn Williams510f6182020-02-21 11:14:08 +0000115 m_TimelineDecoder.CreateEvent(event);
Finn Williamse63a0262019-10-22 10:30:49 +0100116}
117
118void TimelineCaptureCommandHandler::operator()(const profiling::Packet& packet)
119{
120 ParseData(packet);
121}
122
Finn Williamse63a0262019-10-22 10:30:49 +0100123} //namespace gatordmock
124
125} //namespace armnn