Skip to content

Commit 8738221

Browse files
committed
enum Targets
1 parent fab1f2f commit 8738221

File tree

9 files changed

+215
-145
lines changed

9 files changed

+215
-145
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ jobs:
5555
run: cargo test -p rustc_codegen_spirv --release --no-default-features --features "use-installed-tools"
5656

5757
- name: workspace test (excluding examples & difftest)
58-
run: cargo test --release --workspace --exclude "example-runner-*" --exclude "difftest*" --no-default-features --features "use-installed-tools"
58+
run: cargo test --release --workspace --exclude "example-runner-*" --exclude "difftest*" --no-default-features --features "use-installed-tools","include_str"
5959

6060
# Examples
6161
- name: cargo check examples

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rustc_codegen_spirv-target-specs/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ repository.workspace = true
1010
[features]
1111
include_str = []
1212
dir_path = []
13+
14+
[dependencies]
15+
strum = { version = "0.26.3", features = ["derive"] }
Lines changed: 64 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,64 @@
1-
/// Metadata for the compile targets supported by `rust-gpu`
2-
pub const TARGET_SPECS: &[(&str, &str)] = &[
3-
(
4-
"spirv-unknown-opengl4.0.json",
5-
include_str!("../target-specs/spirv-unknown-opengl4.0.json"),
6-
),
7-
(
8-
"spirv-unknown-opengl4.1.json",
9-
include_str!("../target-specs/spirv-unknown-opengl4.1.json"),
10-
),
11-
(
12-
"spirv-unknown-opengl4.2.json",
13-
include_str!("../target-specs/spirv-unknown-opengl4.2.json"),
14-
),
15-
(
16-
"spirv-unknown-opengl4.3.json",
17-
include_str!("../target-specs/spirv-unknown-opengl4.3.json"),
18-
),
19-
(
20-
"spirv-unknown-opengl4.5.json",
21-
include_str!("../target-specs/spirv-unknown-opengl4.5.json"),
22-
),
23-
(
24-
"spirv-unknown-spv1.0.json",
25-
include_str!("../target-specs/spirv-unknown-spv1.0.json"),
26-
),
27-
(
28-
"spirv-unknown-spv1.1.json",
29-
include_str!("../target-specs/spirv-unknown-spv1.1.json"),
30-
),
31-
(
32-
"spirv-unknown-spv1.2.json",
33-
include_str!("../target-specs/spirv-unknown-spv1.2.json"),
34-
),
35-
(
36-
"spirv-unknown-spv1.3.json",
37-
include_str!("../target-specs/spirv-unknown-spv1.3.json"),
38-
),
39-
(
40-
"spirv-unknown-spv1.4.json",
41-
include_str!("../target-specs/spirv-unknown-spv1.4.json"),
42-
),
43-
(
44-
"spirv-unknown-spv1.5.json",
45-
include_str!("../target-specs/spirv-unknown-spv1.5.json"),
46-
),
47-
(
48-
"spirv-unknown-spv1.6.json",
49-
include_str!("../target-specs/spirv-unknown-spv1.6.json"),
50-
),
51-
(
52-
"spirv-unknown-vulkan1.0.json",
53-
include_str!("../target-specs/spirv-unknown-vulkan1.0.json"),
54-
),
55-
(
56-
"spirv-unknown-vulkan1.1.json",
57-
include_str!("../target-specs/spirv-unknown-vulkan1.1.json"),
58-
),
59-
(
60-
"spirv-unknown-vulkan1.1spv1.4.json",
61-
include_str!("../target-specs/spirv-unknown-vulkan1.1spv1.4.json"),
62-
),
63-
(
64-
"spirv-unknown-vulkan1.2.json",
65-
include_str!("../target-specs/spirv-unknown-vulkan1.2.json"),
66-
),
67-
(
68-
"spirv-unknown-vulkan1.3.json",
69-
include_str!("../target-specs/spirv-unknown-vulkan1.3.json"),
70-
),
71-
(
72-
"spirv-unknown-vulkan1.4.json",
73-
include_str!("../target-specs/spirv-unknown-vulkan1.4.json"),
74-
),
75-
];
1+
//! Metadata for the compile targets supported by `rust-gpu`
2+
3+
use crate::Targets;
4+
5+
impl Targets {
6+
pub fn include_str(&self) -> &'static str {
7+
match self {
8+
Targets::spirv_unknown_opengl_4_0 => {
9+
include_str!("../target-specs/spirv-unknown-opengl4.0.json")
10+
}
11+
Targets::spirv_unknown_opengl_4_1 => {
12+
include_str!("../target-specs/spirv-unknown-opengl4.1.json")
13+
}
14+
Targets::spirv_unknown_opengl_4_2 => {
15+
include_str!("../target-specs/spirv-unknown-opengl4.2.json")
16+
}
17+
Targets::spirv_unknown_opengl_4_3 => {
18+
include_str!("../target-specs/spirv-unknown-opengl4.3.json")
19+
}
20+
Targets::spirv_unknown_opengl_4_5 => {
21+
include_str!("../target-specs/spirv-unknown-opengl4.5.json")
22+
}
23+
Targets::spirv_unknown_spv_1_0 => {
24+
include_str!("../target-specs/spirv-unknown-spv1.0.json")
25+
}
26+
Targets::spirv_unknown_spv_1_1 => {
27+
include_str!("../target-specs/spirv-unknown-spv1.1.json")
28+
}
29+
Targets::spirv_unknown_spv_1_2 => {
30+
include_str!("../target-specs/spirv-unknown-spv1.2.json")
31+
}
32+
Targets::spirv_unknown_spv_1_3 => {
33+
include_str!("../target-specs/spirv-unknown-spv1.3.json")
34+
}
35+
Targets::spirv_unknown_spv_1_4 => {
36+
include_str!("../target-specs/spirv-unknown-spv1.4.json")
37+
}
38+
Targets::spirv_unknown_spv_1_5 => {
39+
include_str!("../target-specs/spirv-unknown-spv1.5.json")
40+
}
41+
Targets::spirv_unknown_spv_1_6 => {
42+
include_str!("../target-specs/spirv-unknown-spv1.6.json")
43+
}
44+
Targets::spirv_unknown_vulkan_1_0 => {
45+
include_str!("../target-specs/spirv-unknown-vulkan1.0.json")
46+
}
47+
Targets::spirv_unknown_vulkan_1_1 => {
48+
include_str!("../target-specs/spirv-unknown-vulkan1.1.json")
49+
}
50+
Targets::spirv_unknown_vulkan_1_1_spv_1_4 => {
51+
include_str!("../target-specs/spirv-unknown-vulkan1.1spv1.4.json")
52+
}
53+
Targets::spirv_unknown_vulkan_1_2 => {
54+
include_str!("../target-specs/spirv-unknown-vulkan1.2.json")
55+
}
56+
Targets::spirv_unknown_vulkan_1_3 => {
57+
include_str!("../target-specs/spirv-unknown-vulkan1.3.json")
58+
}
59+
Targets::spirv_unknown_vulkan_1_4 => {
60+
include_str!("../target-specs/spirv-unknown-vulkan1.4.json")
61+
}
62+
}
63+
}
64+
}
Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,106 @@
11
#![doc = include_str!("../README.md")]
22

3+
use strum::{Display, EnumIter, EnumString, IntoStaticStr};
4+
35
/// directory with all the `target-specs` jsons for our codegen backend
46
#[cfg(feature = "dir_path")]
57
pub const TARGET_SPEC_DIR_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/target-specs");
68

79
#[cfg(feature = "include_str")]
810
mod include_str;
9-
#[cfg(feature = "include_str")]
10-
pub use include_str::TARGET_SPECS;
11+
12+
/// All targets rust-gpu supports.
13+
#[allow(non_camel_case_types, clippy::upper_case_acronyms)]
14+
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, EnumString, IntoStaticStr, EnumIter, Display)]
15+
pub enum Targets {
16+
#[strum(to_string = "spirv-unknown-opengl4.0")]
17+
spirv_unknown_opengl_4_0,
18+
#[strum(to_string = "spirv-unknown-opengl4.1")]
19+
spirv_unknown_opengl_4_1,
20+
#[strum(to_string = "spirv-unknown-opengl4.2")]
21+
spirv_unknown_opengl_4_2,
22+
#[strum(to_string = "spirv-unknown-opengl4.3")]
23+
spirv_unknown_opengl_4_3,
24+
#[strum(to_string = "spirv-unknown-opengl4.5")]
25+
spirv_unknown_opengl_4_5,
26+
#[strum(to_string = "spirv-unknown-spv1.0")]
27+
spirv_unknown_spv_1_0,
28+
#[strum(to_string = "spirv-unknown-spv1.1")]
29+
spirv_unknown_spv_1_1,
30+
#[strum(to_string = "spirv-unknown-spv1.2")]
31+
spirv_unknown_spv_1_2,
32+
#[strum(to_string = "spirv-unknown-spv1.3")]
33+
spirv_unknown_spv_1_3,
34+
#[strum(to_string = "spirv-unknown-spv1.4")]
35+
spirv_unknown_spv_1_4,
36+
#[strum(to_string = "spirv-unknown-spv1.5")]
37+
spirv_unknown_spv_1_5,
38+
#[strum(to_string = "spirv-unknown-spv1.6")]
39+
spirv_unknown_spv_1_6,
40+
#[strum(to_string = "spirv-unknown-vulkan1.0")]
41+
spirv_unknown_vulkan_1_0,
42+
#[strum(to_string = "spirv-unknown-vulkan1.1")]
43+
spirv_unknown_vulkan_1_1,
44+
#[strum(to_string = "spirv-unknown-vulkan1.1spv1.4")]
45+
spirv_unknown_vulkan_1_1_spv_1_4,
46+
#[strum(to_string = "spirv-unknown-vulkan1.2")]
47+
spirv_unknown_vulkan_1_2,
48+
#[strum(to_string = "spirv-unknown-vulkan1.3")]
49+
spirv_unknown_vulkan_1_3,
50+
#[strum(to_string = "spirv-unknown-vulkan1.4")]
51+
spirv_unknown_vulkan_1_4,
52+
}
53+
54+
impl Targets {
55+
pub fn parse(target: &str) -> Option<Self> {
56+
TryFrom::try_from(target).ok()
57+
}
58+
59+
pub fn as_str(&self) -> &'static str {
60+
self.into()
61+
}
62+
63+
pub fn iter() -> impl DoubleEndedIterator<Item = Self> {
64+
<Self as strum::IntoEnumIterator>::iter()
65+
}
66+
67+
pub fn target_json_file_name(&self) -> String {
68+
format!("{}.json", self.as_str())
69+
}
70+
71+
#[cfg(feature = "dir_path")]
72+
pub fn target_json_path(&self) -> String {
73+
format!("{}/{}.json", TARGET_SPEC_DIR_PATH, self.as_str())
74+
}
75+
}
76+
77+
#[cfg(test)]
78+
mod tests {
79+
use super::*;
80+
81+
#[test]
82+
pub fn test_parse_as_str_loop() {
83+
for target in Targets::iter() {
84+
let parsed = Targets::parse(target.as_str()).unwrap();
85+
assert_eq!(target, parsed);
86+
}
87+
}
88+
89+
#[test]
90+
#[cfg(feature = "dir_path")]
91+
pub fn test_target_json_path() {
92+
for target in Targets::iter() {
93+
let file = std::path::PathBuf::from(target.target_json_path());
94+
assert!(file.is_file());
95+
}
96+
}
97+
98+
#[test]
99+
#[cfg(all(feature = "dir_path", feature = "include_str"))]
100+
pub fn test_target_json_content() {
101+
for target in Targets::iter() {
102+
let content = std::fs::read_to_string(target.target_json_path()).unwrap();
103+
assert_eq!(content, target.include_str());
104+
}
105+
}
106+
}

crates/spirv-builder/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ default = ["use-compiled-tools"]
2424
rustc_codegen_spirv = ["dep:rustc_codegen_spirv"]
2525
# Inclide target spec json files, allows constructing SpirvBuilder without
2626
# explicitly passing a path to the target spec json
27-
include-target-specs = ["dep:rustc_codegen_spirv-target-specs"]
27+
include-target-specs = ["rustc_codegen_spirv-target-specs/dir_path"]
2828
# See `rustc_codegen_spirv/Cargo.toml` for details on these features.
2929
# We add new "default" features to `use-installed-tools` and `use-compiled-tools` to keep
3030
# backwards compat with `default-features = false, features = "use-installed-tools"` setups
@@ -38,7 +38,7 @@ clap = ["dep:clap"]
3838
[dependencies]
3939
rustc_codegen_spirv = { workspace = true, optional = true }
4040
rustc_codegen_spirv-types = { workspace = true }
41-
rustc_codegen_spirv-target-specs = { workspace = true, features = ["dir_path"], optional = true }
41+
rustc_codegen_spirv-target-specs = { workspace = true }
4242

4343
memchr = "2.4"
4444
raw-string = "0.3.5"

0 commit comments

Comments
 (0)