@@ -52,7 +52,7 @@ impl ProfilerThreadDesc {
5252pub 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
5858impl < ' 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+
70142extern "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