#ifndef CHROME_BROWSER_ASH_ARC_TRACING_ARC_TRACING_GRAPHICS_MODEL_H_
#define CHROME_BROWSER_ASH_ARC_TRACING_ARC_TRACING_GRAPHICS_MODEL_H_
#include <map>
#include <string>
#include <vector>
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/ash/arc/tracing/arc_system_model.h"
namespace arc {
inline constexpr char kKeyInformation[] = "information";
inline constexpr char kKeyDuration[] = "duration";
inline constexpr char kKeyPerceivedFps[] = "perceived_fps";
class ArcTracingModel;
class PresentFramesTracer;
class ArcTracingGraphicsModel {
public:
enum class EventType {
kNone,
kBufferQueueDequeueStart = 100,
kBufferQueueDequeueDone,
kBufferQueueQueueStart,
kBufferQueueQueueDone,
kBufferQueueAcquire,
kBufferQueueReleased,
kBufferFillJank,
kExoSurfaceAttach = 200,
kExoProduceResource = 201,
kExoBound = 202,
kExoPendingQuery = 203,
kExoReleased = 204,
kExoJank = 205,
kExoSurfaceCommit = 206,
kExoSurfaceCommitJank = 207,
kExoLastEvent = kExoSurfaceCommitJank,
kChromeBarrierOrder = 300,
kChromeBarrierFlush = 301,
kSurfaceFlingerVsyncHandler = 400,
kSurfaceFlingerInvalidationStart = 401,
kSurfaceFlingerInvalidationDone = 402,
kSurfaceFlingerCompositionStart = 403,
kSurfaceFlingerCompositionDone = 404,
kSurfaceFlingerCompositionJank = 405,
kVsyncTimestamp = 406,
kChromeOSDraw = 500,
kChromeOSSwap = 501,
kChromeOSWaitForAck = 502,
kChromeOSPresentationDone = 503,
kChromeOSSwapDone = 504,
kChromeOSJank = 505,
kChromeOSPerceivedJank = 506,
kChromeOSSwapJank = 507,
kChromeOSLastEvent = kChromeOSSwapJank,
kCustomEvent = 600,
kInputEventCreated = 700,
kInputEventWaylandDispatched = 701,
kInputEventDeliverStart = 702,
kInputEventDeliverEnd = 703,
};
struct BufferEvent {
BufferEvent(EventType type, int64_t timestamp);
BufferEvent(EventType type, int64_t timestamp, const std::string& content);
bool operator==(const BufferEvent& other) const;
EventType type;
uint64_t timestamp;
std::string content;
};
struct ViewId {
ViewId(int task_id, const std::string& activity);
bool operator<(const ViewId& other) const;
bool operator==(const ViewId& other) const;
int task_id;
std::string activity;
};
using BufferEvents = std::vector<BufferEvent>;
class EventsContainer {
public:
EventsContainer();
EventsContainer(const EventsContainer&) = delete;
EventsContainer& operator=(const EventsContainer&) = delete;
~EventsContainer();
void Reset();
bool operator==(const EventsContainer& other) const;
std::vector<BufferEvents>& buffer_events() { return buffer_events_; }
const std::vector<BufferEvents>& buffer_events() const {
return buffer_events_;
}
BufferEvents& global_events() { return global_events_; }
const BufferEvents& global_events() const { return global_events_; }
private:
std::vector<BufferEvents> buffer_events_;
BufferEvents global_events_;
};
using ViewMap = std::map<ViewId, EventsContainer>;
ArcTracingGraphicsModel();
ArcTracingGraphicsModel(const ArcTracingGraphicsModel&) = delete;
ArcTracingGraphicsModel& operator=(const ArcTracingGraphicsModel&) = delete;
~ArcTracingGraphicsModel();
bool Build(const ArcTracingModel& common_model,
const PresentFramesTracer& present_frames);
base::Value::Dict Serialize() const;
std::string SerializeToJson() const;
bool LoadFromJson(const std::string& json_data);
bool LoadFromValue(const base::Value::Dict& root);
uint64_t duration() const { return duration_; }
base::Time timestamp() const { return timestamp_; }
const std::string& app_title() const { return app_title_; }
const std::vector<unsigned char>& app_icon_png() const {
return app_icon_png_;
}
const std::string& platform() const { return platform_; }
const ViewMap& view_buffers() const { return view_buffers_; }
const EventsContainer& chrome_top_level() const { return chrome_top_level_; }
ArcSystemModel& system_model() { return system_model_; }
const ArcSystemModel& system_model() const { return system_model_; }
void set_timestamp(base::Time timestamp) { timestamp_ = timestamp; }
void set_app_title(const std::string& app_title) { app_title_ = app_title; }
void set_app_icon_png(const std::vector<unsigned char>& app_icon_png) {
app_icon_png_ = app_icon_png;
}
void set_platform(const std::string& platform) { platform_ = platform; }
void set_skip_structure_validation() { skip_structure_validation_ = true; }
private:
void NormalizeTimestamps();
void Reset();
ViewMap view_buffers_;
EventsContainer chrome_top_level_;
uint32_t duration_ = 0;
double perceived_fps_ = 0;
double app_fps_ = 0;
std::string app_title_;
std::vector<unsigned char> app_icon_png_;
std::string platform_;
base::Time timestamp_;
ArcSystemModel system_model_;
bool skip_structure_validation_ = false;
};
std::ostream& operator<<(std::ostream& os, ArcTracingGraphicsModel::EventType);
}
#endif