@@ -47,61 +47,85 @@ pub struct SharedGpuContext {
4747
4848static GPU : OnceCell < Option < SharedGpuContext > > = OnceCell :: const_new ( ) ;
4949
50- pub async fn get_shared_gpu ( ) -> Option < & ' static SharedGpuContext > {
51- GPU . get_or_init ( || async {
52- let instance = wgpu:: Instance :: new ( & wgpu:: InstanceDescriptor :: default ( ) ) ;
50+ async fn init_gpu_inner ( ) -> Option < SharedGpuContext > {
51+ let instance = wgpu:: Instance :: new ( & wgpu:: InstanceDescriptor :: default ( ) ) ;
52+
53+ let hardware_adapter = instance
54+ . request_adapter ( & wgpu:: RequestAdapterOptions {
55+ power_preference : wgpu:: PowerPreference :: HighPerformance ,
56+ force_fallback_adapter : false ,
57+ compatible_surface : None ,
58+ } )
59+ . await
60+ . ok ( ) ;
5361
54- let hardware_adapter = instance
62+ let ( adapter, is_software_adapter) = if let Some ( adapter) = hardware_adapter {
63+ tracing:: info!(
64+ adapter_name = adapter. get_info( ) . name,
65+ adapter_backend = ?adapter. get_info( ) . backend,
66+ "Using hardware GPU adapter for shared context"
67+ ) ;
68+ ( adapter, false )
69+ } else {
70+ tracing:: warn!(
71+ "No hardware GPU adapter found, attempting software fallback for shared context"
72+ ) ;
73+ let software_adapter = instance
5574 . request_adapter ( & wgpu:: RequestAdapterOptions {
56- power_preference : wgpu:: PowerPreference :: HighPerformance ,
57- force_fallback_adapter : false ,
75+ power_preference : wgpu:: PowerPreference :: LowPower ,
76+ force_fallback_adapter : true ,
5877 compatible_surface : None ,
5978 } )
6079 . await
61- . ok ( ) ;
62-
63- let ( adapter, is_software_adapter) = if let Some ( adapter) = hardware_adapter {
64- tracing:: info!(
65- adapter_name = adapter. get_info( ) . name,
66- adapter_backend = ?adapter. get_info( ) . backend,
67- "Using hardware GPU adapter for shared context"
68- ) ;
69- ( adapter, false )
70- } else {
71- tracing:: warn!( "No hardware GPU adapter found, attempting software fallback for shared context" ) ;
72- let software_adapter = instance
73- . request_adapter ( & wgpu:: RequestAdapterOptions {
74- power_preference : wgpu:: PowerPreference :: LowPower ,
75- force_fallback_adapter : true ,
76- compatible_surface : None ,
77- } )
78- . await
79- . ok ( ) ?;
80-
81- tracing:: info!(
82- adapter_name = software_adapter. get_info( ) . name,
83- adapter_backend = ?software_adapter. get_info( ) . backend,
84- "Using software adapter for shared context (CPU rendering - performance may be reduced)"
85- ) ;
86- ( software_adapter, true )
87- } ;
88-
89- let ( device, queue) = adapter
90- . request_device ( & wgpu:: DeviceDescriptor {
91- label : Some ( "cap-shared-gpu-device" ) ,
92- required_features : wgpu:: Features :: empty ( ) ,
93- ..Default :: default ( )
94- } )
95- . await
9680 . ok ( ) ?;
9781
98- Some ( SharedGpuContext {
99- device : Arc :: new ( device) ,
100- queue : Arc :: new ( queue) ,
101- adapter : Arc :: new ( adapter) ,
102- instance : Arc :: new ( instance) ,
103- is_software_adapter,
82+ tracing:: info!(
83+ adapter_name = software_adapter. get_info( ) . name,
84+ adapter_backend = ?software_adapter. get_info( ) . backend,
85+ "Using software adapter for shared context (CPU rendering - performance may be reduced)"
86+ ) ;
87+ ( software_adapter, true )
88+ } ;
89+
90+ let ( device, queue) = adapter
91+ . request_device ( & wgpu:: DeviceDescriptor {
92+ label : Some ( "cap-shared-gpu-device" ) ,
93+ required_features : wgpu:: Features :: empty ( ) ,
94+ ..Default :: default ( )
10495 } )
96+ . await
97+ . ok ( ) ?;
98+
99+ Some ( SharedGpuContext {
100+ device : Arc :: new ( device) ,
101+ queue : Arc :: new ( queue) ,
102+ adapter : Arc :: new ( adapter) ,
103+ instance : Arc :: new ( instance) ,
104+ is_software_adapter,
105+ } )
106+ }
107+
108+ pub async fn get_shared_gpu ( ) -> Option < & ' static SharedGpuContext > {
109+ GPU . get_or_init ( || async {
110+ let result = tokio:: spawn ( init_gpu_inner ( ) ) . await ;
111+
112+ match result {
113+ Ok ( ctx) => ctx,
114+ Err ( e) => {
115+ if e. is_panic ( ) {
116+ tracing:: error!(
117+ "GPU initialization panicked (wgpu internal error). \
118+ The app will continue without GPU acceleration."
119+ ) ;
120+ } else {
121+ tracing:: error!(
122+ error = %e,
123+ "GPU initialization task failed"
124+ ) ;
125+ }
126+ None
127+ }
128+ }
105129 } )
106130 . await
107131 . as_ref ( )
0 commit comments