use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct FilePayload {
pub file: u64,
pub offset: u64,
pub length: u64,
pub flags: u32,
pub result: i64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct MemPayload {
pub size: u64,
pub align: u32,
pub arena: u32,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct SyncPayload {
pub kind: u32,
pub value: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ThreadPayload {
pub action: u32,
pub extra: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct D3d12Payload {
pub a: u64,
pub b: u64,
pub c: u64,
pub d: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct VulkanPayload {
pub a: u64,
pub b: u64,
pub c: u64,
pub d: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct GpuPayload {
pub counter: u32,
pub value: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct IoPayload {
pub queue_depth: u32,
pub latency_ns: u64,
pub bytes: u64,
pub op: u32,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct KatraPayload {
pub subsystem: u16,
pub state: u16,
pub detail: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ShaderPayload {
pub stage: u32,
pub input_hash: u64,
pub output_hash: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct CachePayload {
pub layer: u8,
pub hit: bool,
pub key: u64,
pub size: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct PresentPayload {
pub frame: u64,
pub present_mode: u32,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct DecompressPayload {
pub input_bytes: u64,
pub output_bytes: u64,
pub format: u32,
pub latency_ns: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct RawPayload {
pub a: u64,
pub b: u64,
pub c: u64,
pub d: u64,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum Payload {
#[default]
None,
File(FilePayload),
Mem(MemPayload),
Sync(SyncPayload),
Thread(ThreadPayload),
D3d12(D3d12Payload),
Vulkan(VulkanPayload),
Gpu(GpuPayload),
Io(IoPayload),
Katra(KatraPayload),
Shader(ShaderPayload),
Cache(CachePayload),
Present(PresentPayload),
Decompress(DecompressPayload),
Raw(RawPayload),
}
impl Payload {
pub fn as_str(&self) -> &'static str {
match self {
Payload::None => "none",
Payload::File(_) => "file",
Payload::Mem(_) => "mem",
Payload::Sync(_) => "sync",
Payload::Thread(_) => "thread",
Payload::D3d12(_) => "d3d12",
Payload::Vulkan(_) => "vulkan",
Payload::Gpu(_) => "gpu",
Payload::Io(_) => "io",
Payload::Katra(_) => "katra",
Payload::Shader(_) => "shader",
Payload::Cache(_) => "cache",
Payload::Present(_) => "present",
Payload::Decompress(_) => "decompress",
Payload::Raw(_) => "raw",
}
}
pub fn d3d12(a: u64, b: u64, c: u64, d: u64) -> Self {
Payload::D3d12(D3d12Payload { a, b, c, d })
}
pub fn vulkan(a: u64, b: u64, c: u64, d: u64) -> Self {
Payload::Vulkan(VulkanPayload { a, b, c, d })
}
pub fn raw(a: u64, b: u64, c: u64, d: u64) -> Self {
Payload::Raw(RawPayload { a, b, c, d })
}
}