@@ -206,18 +206,17 @@ fn merge_unreal_context(event: &mut Event, context: Unreal4Context) {
206
206
} ;
207
207
208
208
if let Some ( msg) = runtime_props. error_message . take ( ) {
209
- event
210
- . logentry
211
- . get_or_insert_with ( LogEntry :: default )
212
- . formatted = Annotated :: new ( Message :: from ( msg ) ) ;
209
+ let logentry = event. logentry . get_or_insert_with ( LogEntry :: default ) ;
210
+ if logentry. formatted . is_empty ( ) {
211
+ logentry . formatted = Annotated :: new ( Message :: from ( msg ) ) ;
212
+ }
213
213
}
214
214
215
215
if let Some ( username) = runtime_props. username . take ( ) {
216
- event
217
- . user
218
- . get_or_insert_with ( User :: default)
219
- . username
220
- . set_value ( Some ( username. into ( ) ) ) ;
216
+ let user = event. user . get_or_insert_with ( User :: default) ;
217
+ if user. username . is_empty ( ) {
218
+ user. username . set_value ( Some ( username. into ( ) ) ) ;
219
+ }
221
220
}
222
221
223
222
if let Some ( login_id) = & runtime_props. login_id {
@@ -232,47 +231,65 @@ fn merge_unreal_context(event: &mut Event, context: Unreal4Context) {
232
231
233
232
if let Some ( memory_physical) = runtime_props. memory_stats_total_physical . take ( ) {
234
233
let device_context = contexts. get_or_default :: < DeviceContext > ( ) ;
235
- device_context. memory_size = Annotated :: new ( memory_physical) ;
234
+ if device_context. memory_size . is_empty ( ) {
235
+ device_context. memory_size = Annotated :: new ( memory_physical) ;
236
+ }
236
237
}
237
238
238
239
// OS information is likely overwritten by Minidump processing later.
239
240
if let Some ( os_major) = runtime_props. misc_os_version_major . take ( ) {
240
241
let os_context = contexts. get_or_default :: < OsContext > ( ) ;
241
- os_context. raw_description = Annotated :: new ( os_major) ;
242
+ if os_context. raw_description . is_empty ( ) {
243
+ os_context. raw_description = Annotated :: new ( os_major) ;
244
+ }
242
245
}
243
246
244
247
// See https://github.com/EpicGames/UnrealEngine/blob/5.3.2-release/Engine/Source/Runtime/RHI/Private/DynamicRHI.cpp#L368-L376
245
248
if let Some ( adapter_name) = context. engine_data . get ( "RHI.AdapterName" ) {
246
249
let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
247
- gpu_context. name = Annotated :: new ( adapter_name. into ( ) ) ;
250
+ if gpu_context. name . is_empty ( ) {
251
+ gpu_context. name = Annotated :: new ( adapter_name. into ( ) ) ;
252
+ }
248
253
} else if let Some ( gpu_brand) = runtime_props. misc_primary_gpu_brand . take ( ) {
249
254
let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
250
- gpu_context. name = Annotated :: new ( gpu_brand) ;
255
+ if gpu_context. name . is_empty ( ) {
256
+ gpu_context. name = Annotated :: new ( gpu_brand) ;
257
+ }
251
258
}
252
259
253
260
if let Some ( device_id) = context. engine_data . get ( "RHI.DeviceId" ) {
254
261
let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
255
- gpu_context. id = Annotated :: new ( Value :: String ( device_id. into ( ) ) ) ;
262
+ if gpu_context. id . is_empty ( ) {
263
+ gpu_context. id = Annotated :: new ( Value :: String ( device_id. into ( ) ) ) ;
264
+ }
256
265
}
257
266
258
267
if let Some ( feature_level) = context. engine_data . get ( "RHI.FeatureLevel" ) {
259
268
let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
260
- gpu_context. graphics_shader_level = Annotated :: new ( feature_level. into ( ) ) ;
269
+ if gpu_context. graphics_shader_level . is_empty ( ) {
270
+ gpu_context. graphics_shader_level = Annotated :: new ( feature_level. into ( ) ) ;
271
+ }
261
272
}
262
273
263
274
if let Some ( vendor_name) = context. engine_data . get ( "RHI.GPUVendor" ) {
264
275
let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
265
- gpu_context. vendor_name = Annotated :: new ( vendor_name. into ( ) ) ;
276
+ if gpu_context. vendor_name . is_empty ( ) {
277
+ gpu_context. vendor_name = Annotated :: new ( vendor_name. into ( ) ) ;
278
+ }
266
279
}
267
280
268
281
if let Some ( driver_version) = context. engine_data . get ( "RHI.UserDriverVersion" ) {
269
282
let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
270
- gpu_context. version = Annotated :: new ( driver_version. into ( ) ) ;
283
+ if gpu_context. version . is_empty ( ) {
284
+ gpu_context. version = Annotated :: new ( driver_version. into ( ) ) ;
285
+ }
271
286
}
272
287
273
288
if let Some ( rhi_name) = context. engine_data . get ( "RHI.RHIName" ) {
274
289
let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
275
- gpu_context. api_type = Annotated :: new ( rhi_name. into ( ) ) ;
290
+ if gpu_context. api_type . is_empty ( ) {
291
+ gpu_context. api_type = Annotated :: new ( rhi_name. into ( ) ) ;
292
+ }
276
293
}
277
294
278
295
if event. level . is_empty ( ) {
@@ -572,4 +589,73 @@ mod tests {
572
589
LenientString ( "ebff51ef3c4878627823eebd9ff40eb4" . to_owned( ) )
573
590
) ;
574
591
}
592
+
593
+ #[ test]
594
+ fn test_merge_unreal_context_is_input_preserved ( ) {
595
+ let context = get_context ( ) ;
596
+
597
+ let mut event = Event :: default ( ) ;
598
+
599
+ let logentry = event. logentry . get_or_insert_with ( LogEntry :: default) ;
600
+ logentry. formatted = Annotated :: new ( String :: from ( "error_message" ) . into ( ) ) ;
601
+
602
+ let user = event. user . get_or_insert_with ( User :: default) ;
603
+ user. username = Annotated :: new ( String :: from ( "user_name" ) . into ( ) ) ;
604
+
605
+ let contexts = event. contexts . get_or_insert_with ( Contexts :: default) ;
606
+
607
+ let device_context = contexts. get_or_default :: < DeviceContext > ( ) ;
608
+ device_context. memory_size = Annotated :: new ( 123456789 ) ;
609
+
610
+ let os_context = contexts. get_or_default :: < OsContext > ( ) ;
611
+ os_context. name = Annotated :: new ( String :: from ( "os_name" ) ) ;
612
+
613
+ let gpu_context = contexts. get_or_default :: < GpuContext > ( ) ;
614
+ gpu_context. name = Annotated :: new ( String :: from ( "adapter_name" ) ) ;
615
+ gpu_context. id = Annotated :: new ( Value :: String ( String :: from ( "device_id" ) ) ) ;
616
+ gpu_context. graphics_shader_level = Annotated :: new ( String :: from ( "feature_level" ) ) ;
617
+ gpu_context. vendor_name = Annotated :: new ( String :: from ( "vendor_name" ) ) ;
618
+ gpu_context. version = Annotated :: new ( String :: from ( "driver_version" ) ) ;
619
+ gpu_context. api_type = Annotated :: new ( String :: from ( "rhi_name" ) ) ;
620
+
621
+ merge_unreal_context ( & mut event, context) ;
622
+
623
+ let logentry = event. logentry . value ( ) . unwrap ( ) ;
624
+ let formatted = logentry. formatted . value ( ) . unwrap ( ) ;
625
+ assert_eq ! ( formatted. as_ref( ) , "error_message" ) ;
626
+
627
+ let user = event. user . value ( ) . unwrap ( ) ;
628
+ let username = user. username . value ( ) . unwrap ( ) ;
629
+ assert_eq ! ( username. as_ref( ) , "user_name" ) ;
630
+
631
+ let contexts = event. contexts . value ( ) . unwrap ( ) ;
632
+
633
+ let device_context = contexts. get :: < DeviceContext > ( ) . unwrap ( ) ;
634
+ let memory_size = device_context. memory_size . value ( ) . unwrap ( ) ;
635
+ assert_eq ! ( * memory_size, 123456789 ) ;
636
+
637
+ let os_context = contexts. get :: < OsContext > ( ) . unwrap ( ) ;
638
+ let os_name = os_context. name . value ( ) . unwrap ( ) ;
639
+ assert_eq ! ( os_name, "os_name" ) ;
640
+
641
+ let gpu_context = contexts. get :: < GpuContext > ( ) . unwrap ( ) ;
642
+ let adapter_name = gpu_context. name . value ( ) . unwrap ( ) ;
643
+ assert_eq ! ( adapter_name, "adapter_name" ) ;
644
+
645
+ let device_id = gpu_context. id . value ( ) . unwrap ( ) ;
646
+ let device_id = device_id. as_str ( ) . unwrap ( ) ;
647
+ assert_eq ! ( device_id, "device_id" ) ;
648
+
649
+ let feature_level = gpu_context. graphics_shader_level . value ( ) . unwrap ( ) ;
650
+ assert_eq ! ( feature_level, "feature_level" ) ;
651
+
652
+ let vendor_name = gpu_context. vendor_name . value ( ) . unwrap ( ) ;
653
+ assert_eq ! ( vendor_name, "vendor_name" ) ;
654
+
655
+ let driver_version = gpu_context. version . value ( ) . unwrap ( ) ;
656
+ assert_eq ! ( driver_version, "driver_version" ) ;
657
+
658
+ let rhi_name = gpu_context. api_type . value ( ) . unwrap ( ) ;
659
+ assert_eq ! ( rhi_name, "rhi_name" ) ;
660
+ }
575
661
}
0 commit comments