1
1
//! Display various information about `cargo gpu`, eg its cache directory.
2
2
3
- use std:: fs;
4
-
5
3
use crate :: cache_dir;
4
+ use crate :: spirv_source:: { query_metadata, SpirvSource } ;
5
+ use crate :: target_specs:: update_target_specs_files;
6
+ use anyhow:: bail;
7
+ use std:: fs;
8
+ use std:: path:: Path ;
6
9
7
10
/// Show the computed source of the spirv-std dependency.
8
11
#[ derive( Clone , Debug , clap:: Parser ) ]
@@ -25,7 +28,7 @@ pub enum Info {
25
28
Capabilities ,
26
29
27
30
/// All available SPIR-V targets
28
- Targets ,
31
+ Targets ( SpirvSourceDep ) ,
29
32
}
30
33
31
34
/// `cargo gpu show`
@@ -51,8 +54,7 @@ impl Show {
51
54
println ! ( "{}\n " , cache_dir( ) ?. display( ) ) ;
52
55
}
53
56
Info :: SpirvSource ( SpirvSourceDep { shader_crate } ) => {
54
- let rust_gpu_source =
55
- crate :: spirv_source:: SpirvSource :: get_rust_gpu_deps_from_shader ( shader_crate) ?;
57
+ let rust_gpu_source = SpirvSource :: get_rust_gpu_deps_from_shader ( shader_crate) ?;
56
58
println ! ( "{rust_gpu_source}\n " ) ;
57
59
}
58
60
Info :: Commitsh => {
@@ -68,8 +70,10 @@ impl Show {
68
70
println ! ( " {capability:?}" ) ;
69
71
}
70
72
}
71
- Info :: Targets => {
72
- for target in Self :: available_spirv_targets_iter ( ) ? {
73
+ Info :: Targets ( SpirvSourceDep { shader_crate } ) => {
74
+ let ( source, targets) = Self :: available_spirv_targets_iter ( shader_crate) ?;
75
+ println ! ( "All available targets for rust-gpu version '{}':" , source) ;
76
+ for target in targets {
73
77
println ! ( "{target}" ) ;
74
78
}
75
79
}
@@ -89,66 +93,29 @@ impl Show {
89
93
90
94
/// List all available spirv targets, note: the targets from compile time of cargo-gpu and those
91
95
/// in the cache-directory will be picked up.
92
- fn available_spirv_targets_iter ( ) -> anyhow:: Result < impl Iterator < Item = String > > {
93
- let legacy_targets = legacy_target_specs:: TARGET_SPECS
94
- . iter ( )
95
- . map ( |( spec, _src) | ( * spec) . to_owned ( ) ) ;
96
-
97
- let cache_dir = cache_dir ( ) ?;
98
- if !cache_dir. exists ( ) {
99
- log:: error!(
100
- "SPIR-V cache directory does not exist: {}" ,
101
- cache_dir. display( )
102
- ) ;
96
+ fn available_spirv_targets_iter (
97
+ shader_crate : & Path ,
98
+ ) -> anyhow:: Result < ( SpirvSource , impl Iterator < Item = String > ) > {
99
+ let source = SpirvSource :: new ( shader_crate, None , None ) ?;
100
+ let install_dir = source. install_dir ( ) ?;
101
+ if !install_dir. is_dir ( ) {
102
+ bail ! ( "rust-gpu version {} is not installed" , source) ;
103
103
}
104
- let entries = fs:: read_dir ( & cache_dir) ?;
104
+ let dummy_metadata = query_metadata ( & install_dir) ?;
105
+ let target_specs_dir = update_target_specs_files ( & source, & dummy_metadata, false ) ?;
105
106
106
- #[ expect(
107
- clippy:: shadow_unrelated,
108
- reason = "coz we use 'entry' in repeated nestings"
109
- ) ]
110
- let cached_targets: Vec < String > = entries
111
- . flatten ( )
112
- . flat_map ( |entry| {
113
- let path = entry. path ( ) ;
114
- if path. is_dir ( ) {
115
- fs:: read_dir ( path)
116
- . ok ( )
117
- . into_iter ( )
118
- . flatten ( )
119
- . filter_map ( Result :: ok)
120
- . filter_map ( |entry| {
121
- entry
122
- . path ( )
123
- . file_stem ( )
124
- . and_then ( std:: ffi:: OsStr :: to_str)
125
- . map ( str:: to_owned)
126
- } )
127
- . collect :: < Vec < _ > > ( )
128
- } else if path. extension ( ) . and_then ( std:: ffi:: OsStr :: to_str) == Some ( "json" ) {
129
- path. file_stem ( )
130
- . and_then ( std:: ffi:: OsStr :: to_str)
131
- . map ( str:: to_owned)
132
- . into_iter ( )
133
- . collect ( )
134
- } else {
135
- Vec :: new ( )
107
+ let mut targets = fs:: read_dir ( target_specs_dir) ?
108
+ . filter_map ( |entry| {
109
+ let file = entry. ok ( ) ?;
110
+ if file. path ( ) . is_file ( ) {
111
+ if let Some ( target) = file. file_name ( ) . to_string_lossy ( ) . strip_suffix ( ".json" ) {
112
+ return Some ( target. to_owned ( ) ) ;
113
+ }
136
114
}
115
+ None
137
116
} )
138
- . collect ( ) ;
139
- if cached_targets. is_empty ( ) {
140
- log:: error!(
141
- "Cache directory exists but contains no valid SPIR-V target files (*.json): {}" ,
142
- cache_dir. display( )
143
- ) ;
144
- }
145
- let mut targets: Vec < String > = legacy_targets
146
- . chain ( cached_targets)
147
- . filter ( |target| target. contains ( "vulkan" ) )
148
- . collect :: < std:: collections:: HashSet < _ > > ( )
149
- . into_iter ( )
150
- . collect ( ) ;
117
+ . collect :: < Vec < _ > > ( ) ;
151
118
targets. sort ( ) ;
152
- Ok ( targets. into_iter ( ) )
119
+ Ok ( ( source , targets. into_iter ( ) ) )
153
120
}
154
121
}
0 commit comments