Skip to content

Commit 3ad98b9

Browse files
committed
enum SpirvTargetEnv containing all targets
1 parent f9ea001 commit 3ad98b9

File tree

13 files changed

+302
-249
lines changed

13 files changed

+302
-249
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::SpirvTargetEnv;
4+
5+
impl SpirvTargetEnv {
6+
pub fn include_str(&self) -> &'static str {
7+
match self {
8+
SpirvTargetEnv::OpenGL_4_0 => {
9+
include_str!("../target-specs/spirv-unknown-opengl4.0.json")
10+
}
11+
SpirvTargetEnv::OpenGL_4_1 => {
12+
include_str!("../target-specs/spirv-unknown-opengl4.1.json")
13+
}
14+
SpirvTargetEnv::OpenGL_4_2 => {
15+
include_str!("../target-specs/spirv-unknown-opengl4.2.json")
16+
}
17+
SpirvTargetEnv::OpenGL_4_3 => {
18+
include_str!("../target-specs/spirv-unknown-opengl4.3.json")
19+
}
20+
SpirvTargetEnv::OpenGL_4_5 => {
21+
include_str!("../target-specs/spirv-unknown-opengl4.5.json")
22+
}
23+
SpirvTargetEnv::Spv_1_0 => {
24+
include_str!("../target-specs/spirv-unknown-spv1.0.json")
25+
}
26+
SpirvTargetEnv::Spv_1_1 => {
27+
include_str!("../target-specs/spirv-unknown-spv1.1.json")
28+
}
29+
SpirvTargetEnv::Spv_1_2 => {
30+
include_str!("../target-specs/spirv-unknown-spv1.2.json")
31+
}
32+
SpirvTargetEnv::Spv_1_3 => {
33+
include_str!("../target-specs/spirv-unknown-spv1.3.json")
34+
}
35+
SpirvTargetEnv::Spv_1_4 => {
36+
include_str!("../target-specs/spirv-unknown-spv1.4.json")
37+
}
38+
SpirvTargetEnv::Spv_1_5 => {
39+
include_str!("../target-specs/spirv-unknown-spv1.5.json")
40+
}
41+
SpirvTargetEnv::Spv_1_6 => {
42+
include_str!("../target-specs/spirv-unknown-spv1.6.json")
43+
}
44+
SpirvTargetEnv::Vulkan_1_0 => {
45+
include_str!("../target-specs/spirv-unknown-vulkan1.0.json")
46+
}
47+
SpirvTargetEnv::Vulkan_1_1 => {
48+
include_str!("../target-specs/spirv-unknown-vulkan1.1.json")
49+
}
50+
SpirvTargetEnv::Vulkan_1_1_Spv_1_4 => {
51+
include_str!("../target-specs/spirv-unknown-vulkan1.1spv1.4.json")
52+
}
53+
SpirvTargetEnv::Vulkan_1_2 => {
54+
include_str!("../target-specs/spirv-unknown-vulkan1.2.json")
55+
}
56+
SpirvTargetEnv::Vulkan_1_3 => {
57+
include_str!("../target-specs/spirv-unknown-vulkan1.3.json")
58+
}
59+
SpirvTargetEnv::Vulkan_1_4 => {
60+
include_str!("../target-specs/spirv-unknown-vulkan1.4.json")
61+
}
62+
}
63+
}
64+
}
Lines changed: 110 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,118 @@
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+
pub const SPIRV_ARCH: &str = "spirv";
13+
pub const SPIRV_VENDOR: &str = "unknown";
14+
15+
/// All target envs rust-gpu supports
16+
#[allow(non_camel_case_types, clippy::upper_case_acronyms)]
17+
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, EnumString, IntoStaticStr, EnumIter, Display)]
18+
pub enum SpirvTargetEnv {
19+
#[strum(to_string = "opengl4.0")]
20+
OpenGL_4_0,
21+
#[strum(to_string = "opengl4.1")]
22+
OpenGL_4_1,
23+
#[strum(to_string = "opengl4.2")]
24+
OpenGL_4_2,
25+
#[strum(to_string = "opengl4.3")]
26+
OpenGL_4_3,
27+
#[strum(to_string = "opengl4.5")]
28+
OpenGL_4_5,
29+
#[strum(to_string = "spv1.0")]
30+
Spv_1_0,
31+
#[strum(to_string = "spv1.1")]
32+
Spv_1_1,
33+
#[strum(to_string = "spv1.2")]
34+
Spv_1_2,
35+
#[strum(to_string = "spv1.3")]
36+
Spv_1_3,
37+
#[strum(to_string = "spv1.4")]
38+
Spv_1_4,
39+
#[strum(to_string = "spv1.5")]
40+
Spv_1_5,
41+
#[strum(to_string = "spv1.6")]
42+
Spv_1_6,
43+
#[strum(to_string = "vulkan1.0")]
44+
Vulkan_1_0,
45+
#[strum(to_string = "vulkan1.1")]
46+
Vulkan_1_1,
47+
#[strum(to_string = "vulkan1.1spv1.4")]
48+
Vulkan_1_1_Spv_1_4,
49+
#[strum(to_string = "vulkan1.2")]
50+
Vulkan_1_2,
51+
#[strum(to_string = "vulkan1.3")]
52+
Vulkan_1_3,
53+
#[strum(to_string = "vulkan1.4")]
54+
Vulkan_1_4,
55+
}
56+
57+
impl SpirvTargetEnv {
58+
pub fn parse_triple(target: &str) -> Option<Self> {
59+
target
60+
.strip_prefix(&format!("{SPIRV_ARCH}-{SPIRV_VENDOR}-"))
61+
.and_then(|env| TryFrom::try_from(env).ok())
62+
}
63+
64+
pub fn as_str(&self) -> &'static str {
65+
self.into()
66+
}
67+
68+
pub fn target_triple(&self) -> String {
69+
format!("{SPIRV_ARCH}-{SPIRV_VENDOR}-{}", self.as_str())
70+
}
71+
72+
pub fn target_json_file_name(&self) -> String {
73+
format!("{SPIRV_ARCH}-{SPIRV_VENDOR}-{}.json", self.as_str())
74+
}
75+
76+
#[cfg(feature = "dir_path")]
77+
pub fn target_json_path(&self) -> String {
78+
format!(
79+
"{TARGET_SPEC_DIR_PATH}/{SPIRV_ARCH}-{SPIRV_VENDOR}-{}.json",
80+
self.as_str()
81+
)
82+
}
83+
84+
pub fn iter() -> impl DoubleEndedIterator<Item = Self> {
85+
<Self as strum::IntoEnumIterator>::iter()
86+
}
87+
}
88+
89+
#[cfg(test)]
90+
mod tests {
91+
use super::*;
92+
93+
#[test]
94+
pub fn test_parse_as_str_loop() {
95+
for target in SpirvTargetEnv::iter() {
96+
let parsed = SpirvTargetEnv::parse_triple(target.as_str()).unwrap();
97+
assert_eq!(target, parsed);
98+
}
99+
}
100+
101+
#[test]
102+
#[cfg(feature = "dir_path")]
103+
pub fn test_target_json_path() {
104+
for target in SpirvTargetEnv::iter() {
105+
let file = std::path::PathBuf::from(target.target_json_path());
106+
assert!(file.is_file());
107+
}
108+
}
109+
110+
#[test]
111+
#[cfg(all(feature = "dir_path", feature = "include_str"))]
112+
pub fn test_target_json_content() {
113+
for target in SpirvTargetEnv::iter() {
114+
let content = std::fs::read_to_string(target.target_json_path()).unwrap();
115+
assert_eq!(content, target.include_str());
116+
}
117+
}
118+
}

crates/rustc_codegen_spirv/src/builder_spirv.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ use crate::builder;
55
use crate::codegen_cx::CodegenCx;
66
use crate::spirv_type::SpirvType;
77
use crate::symbols::Symbols;
8-
use crate::target::SpirvTarget;
8+
use crate::target::TargetsExt;
99
use crate::target_feature::TargetFeature;
1010
use rspirv::dr::{Block, Builder, Instruction, Module, Operand};
1111
use rspirv::spirv::{
1212
AddressingModel, Capability, MemoryModel, Op, SourceLanguage, StorageClass, Word,
1313
};
1414
use rspirv::{binary::Assemble, binary::Disassemble};
1515
use rustc_arena::DroplessArena;
16+
use rustc_codegen_spirv_target_specs::SpirvTargetEnv;
1617
use rustc_codegen_ssa::traits::ConstCodegenMethods as _;
1718
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
1819
use rustc_data_structures::sync::Lrc;
@@ -431,7 +432,7 @@ impl<'tcx> BuilderSpirv<'tcx> {
431432
pub fn new(
432433
tcx: TyCtxt<'tcx>,
433434
sym: &Symbols,
434-
target: &SpirvTarget,
435+
target: &SpirvTargetEnv,
435436
features: &[TargetFeature],
436437
) -> Self {
437438
let version = target.spirv_version();

crates/rustc_codegen_spirv/src/codegen_cx/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ use crate::builder_spirv::{BuilderCursor, BuilderSpirv, SpirvConst, SpirvValue,
88
use crate::custom_decorations::{CustomDecoration, SrcLocDecoration, ZombieDecoration};
99
use crate::spirv_type::{SpirvType, SpirvTypePrinter, TypeCache};
1010
use crate::symbols::Symbols;
11-
use crate::target::SpirvTarget;
1211

1312
// HACK(eddyb) avoids rewriting all of the imports (see `lib.rs` and `build.rs`).
1413
use crate::maybe_pqp_cg_ssa as rustc_codegen_ssa;
1514

15+
use crate::target::TargetsExt;
1616
use itertools::Itertools as _;
1717
use rspirv::dr::{Module, Operand};
1818
use rspirv::spirv::{Decoration, LinkageType, Op, Word};
1919
use rustc_ast::ast::{InlineAsmOptions, InlineAsmTemplatePiece};
20+
use rustc_codegen_spirv_target_specs::SpirvTargetEnv;
2021
use rustc_codegen_ssa::mir::debuginfo::{FunctionDebugContext, VariableKind};
2122
use rustc_codegen_ssa::traits::{
2223
AsmCodegenMethods, BackendTypes, DebugInfoCodegenMethods, GlobalAsmOperandRef,
@@ -95,7 +96,7 @@ impl<'tcx> CodegenCx<'tcx> {
9596
pub fn new(tcx: TyCtxt<'tcx>, codegen_unit: &'tcx CodegenUnit<'tcx>) -> Self {
9697
// Validate the target spec, as the backend doesn't control `--target`.
9798
let target_tuple = tcx.sess.opts.target_triple.tuple();
98-
let target: SpirvTarget = target_tuple.parse().unwrap_or_else(|_| {
99+
let target = SpirvTargetEnv::parse_triple(target_tuple).unwrap_or_else(|| {
99100
let qualifier = if !target_tuple.starts_with("spirv-") {
100101
"non-SPIR-V "
101102
} else {

crates/rustc_codegen_spirv/src/linker/test.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use super::{LinkResult, link};
2+
use crate::target::TargetsExt;
23
use rspirv::dr::{Loader, Module};
4+
use rustc_codegen_spirv_target_specs::SpirvTargetEnv;
35
use rustc_errors::registry::Registry;
46
use rustc_session::CompilerIO;
57
use rustc_session::config::{Input, OutputFilenames, OutputTypes};
@@ -130,8 +132,7 @@ fn link_with_linker_opts(
130132
.unwrap();
131133
let sopts = rustc_session::config::build_session_options(&mut early_dcx, &matches);
132134

133-
let target = "spirv-unknown-spv1.0"
134-
.parse::<crate::target::SpirvTarget>()
135+
let target = SpirvTargetEnv::parse_triple("spirv-unknown-spv1.0")
135136
.unwrap()
136137
.rustc_target();
137138
let sm_inputs = rustc_span::source_map::SourceMapInputs {

0 commit comments

Comments
 (0)