@@ -31,7 +31,7 @@ fn main() {
31
31
return ;
32
32
}
33
33
34
- let wgpu_context = futures:: executor:: block_on ( WgpuContext :: new ( ) ) . unwrap ( ) ;
34
+ let wgpu_context = futures:: executor:: block_on ( init_wgpu_context ( ) ) ;
35
35
36
36
let event_loop = EventLoop :: new ( ) . unwrap ( ) ;
37
37
let ( app_event_sender, app_event_receiver) = std:: sync:: mpsc:: channel ( ) ;
@@ -67,3 +67,52 @@ fn main() {
67
67
68
68
event_loop. run_app ( & mut app) . unwrap ( ) ;
69
69
}
70
+
71
+ async fn init_wgpu_context ( ) -> WgpuContext {
72
+ // TODO: make this configurable via cli flags instead
73
+ let adapter_override = std:: env:: var ( "GRAPHITE_WGPU_ADAPTER" ) . ok ( ) . map ( |s| usize:: from_str_radix ( & s, 10 ) . ok ( ) ) . flatten ( ) ;
74
+
75
+ let instance_descriptor = wgpu:: InstanceDescriptor {
76
+ backends : wgpu:: Backends :: all ( ) ,
77
+ ..Default :: default ( )
78
+ } ;
79
+ let instance = wgpu:: Instance :: new ( & instance_descriptor) ;
80
+
81
+ let mut adapters = instance. enumerate_adapters ( wgpu:: Backends :: all ( ) ) ;
82
+
83
+ // TODO: add a cli flag to list adapters and exit instead of always printing
84
+ let adapters_fmt = adapters
85
+ . iter ( )
86
+ . enumerate ( )
87
+ . map ( |( i, a) | {
88
+ let info = a. get_info ( ) ;
89
+ format ! (
90
+ "\n Adapter {}:\n Name: {}\n Backend: {:?}\n Driver: {}\n Device ID: {}\n Vendor ID: {}" ,
91
+ i, info. name, info. backend, info. driver, info. device, info. vendor
92
+ )
93
+ } )
94
+ . collect :: < Vec < _ > > ( )
95
+ . join ( "\n " ) ;
96
+ println ! ( "\n Available wgpu adapters:\n {}\n " , adapters_fmt) ;
97
+
98
+ let adapter_index = if let Some ( index) = adapter_override
99
+ && index < adapters. len ( )
100
+ {
101
+ index
102
+ } else if cfg ! ( target_os = "windows" ) {
103
+ match adapters. iter ( ) . enumerate ( ) . find ( |( _, a) | a. get_info ( ) . backend == wgpu:: Backend :: Dx12 ) {
104
+ Some ( ( index, _) ) => index,
105
+ None => 0 ,
106
+ }
107
+ } else {
108
+ 0 // Same behavior as requests adapter
109
+ } ;
110
+
111
+ tracing:: info!( "Using WGPU adapter {adapter_index}" ) ;
112
+
113
+ let adapter = adapters. remove ( adapter_index) ;
114
+
115
+ WgpuContext :: new_with_instance_and_adapter ( instance, adapter)
116
+ . await
117
+ . expect ( "Failed to create WGPU context with specified adapter" )
118
+ }
0 commit comments