Skip to content

Commit 0c711d9

Browse files
authored
Merge pull request #11 from ruccho/profiler-metadata-accessibility
Make profiler metadata accessible
2 parents db156e2 + b80f8f5 commit 0c711d9

File tree

1 file changed

+74
-2
lines changed

1 file changed

+74
-2
lines changed

unity-native-plugin/src/profiler_callbacks.rs

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl ProfilerThreadDesc {
5252
pub struct ProfilerMarkerEvent<'a> {
5353
pub desc: ProfilerMarkerDesc,
5454
pub event_type: ProfilerMarkerEventType,
55-
event_data: &'a [UnityProfilerMarkerData],
55+
pub event_data: &'a [ProfilerMarkerData],
5656
}
5757

5858
impl<'a> std::fmt::Debug for ProfilerMarkerEvent<'a> {
@@ -67,6 +67,78 @@ impl<'a> std::fmt::Debug for ProfilerMarkerEvent<'a> {
6767
}
6868
}
6969

70+
#[repr(transparent)]
71+
pub struct ProfilerMarkerData(UnityProfilerMarkerData);
72+
73+
impl ProfilerMarkerData {
74+
pub fn value(&self) -> ProfilerMarkerDataValue {
75+
match unsafe { std::mem::transmute::<_, ProfilerMarkerDataType>(self.0.type_) } {
76+
ProfilerMarkerDataType::None => ProfilerMarkerDataValue::None,
77+
ProfilerMarkerDataType::InstanceId => {
78+
ProfilerMarkerDataValue::InstanceId(unsafe { *(self.0.ptr as *const i32) })
79+
}
80+
ProfilerMarkerDataType::Int32 => {
81+
ProfilerMarkerDataValue::Int32(unsafe { *(self.0.ptr as *const i32) })
82+
}
83+
ProfilerMarkerDataType::UInt32 => {
84+
ProfilerMarkerDataValue::UInt32(unsafe { *(self.0.ptr as *const u32) })
85+
}
86+
ProfilerMarkerDataType::Int64 => {
87+
ProfilerMarkerDataValue::Int64(unsafe { *(self.0.ptr as *const i64) })
88+
}
89+
ProfilerMarkerDataType::UInt64 => {
90+
ProfilerMarkerDataValue::UInt64(unsafe { *(self.0.ptr as *const u64) })
91+
}
92+
ProfilerMarkerDataType::Float => {
93+
ProfilerMarkerDataValue::Float(unsafe { *(self.0.ptr as *const f32) })
94+
}
95+
ProfilerMarkerDataType::Double => {
96+
ProfilerMarkerDataValue::Double(unsafe { *(self.0.ptr as *const f64) })
97+
}
98+
ProfilerMarkerDataType::String => ProfilerMarkerDataValue::String(unsafe {
99+
std::ffi::CStr::from_ptr(self.0.ptr as *const std::ffi::c_char)
100+
.to_str()
101+
.unwrap()
102+
.to_string()
103+
}),
104+
ProfilerMarkerDataType::String16 => ProfilerMarkerDataValue::String(
105+
std::char::decode_utf16(unsafe {
106+
std::slice::from_raw_parts(
107+
self.0.ptr as *const u16,
108+
(self.0.size / 2 - 1) as usize,
109+
)
110+
.iter()
111+
.copied()
112+
})
113+
.map(|c| c.unwrap_or(std::char::REPLACEMENT_CHARACTER))
114+
.collect(),
115+
),
116+
other => ProfilerMarkerDataValue::Unknown {
117+
ty: other,
118+
data: unsafe {
119+
std::slice::from_raw_parts(self.0.ptr as *const u8, self.0.size as usize)
120+
},
121+
},
122+
}
123+
}
124+
}
125+
126+
pub enum ProfilerMarkerDataValue<'a> {
127+
None,
128+
InstanceId(i32),
129+
Int32(i32),
130+
UInt32(u32),
131+
Int64(i64),
132+
UInt64(u64),
133+
Float(f32),
134+
Double(f64),
135+
String(String),
136+
Unknown {
137+
ty: ProfilerMarkerDataType,
138+
data: &'a [u8],
139+
},
140+
}
141+
70142
extern "system" fn create_category_bridge(
71143
_desc: *const UnityProfilerCategoryDesc,
72144
_userdata: *mut c_void,
@@ -104,7 +176,7 @@ extern "system" fn marker_event_bridge(
104176
None => return,
105177
};
106178

107-
let event_data = unsafe { std::slice::from_raw_parts(_event_data, _event_data_count as usize) };
179+
let event_data = unsafe { std::slice::from_raw_parts(_event_data as *const ProfilerMarkerData, _event_data_count as usize) };
108180

109181
let desc = ProfilerMarkerEvent {
110182
desc,

0 commit comments

Comments
 (0)