Skip to content

Commit b692ab5

Browse files
authored
Convert Image<> parameters from enums to integers to make spirv-std build on stable (#761)
* Convert Image<> parameters from enums to integers to make spirv-std build on stable * Remove access_qualifier from Image type It's kernel-mode-only, and we won't ever support kernel mode.
1 parent 2540106 commit b692ab5

File tree

13 files changed

+411
-563
lines changed

13 files changed

+411
-563
lines changed

crates/rustc_codegen_spirv/src/abi.rs

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use std::collections::hash_map::Entry;
2525
use std::fmt;
2626

2727
use num_traits::cast::FromPrimitive;
28-
use rspirv::spirv;
2928

3029
/// If a struct contains a pointer to itself, even indirectly, then doing a naiive recursive walk
3130
/// of the fields will result in an infinite loop. Because pointers are the only thing that are
@@ -715,17 +714,17 @@ fn trans_intrinsic_type<'tcx>(
715714
return Err(ErrorReported);
716715
}
717716

718-
fn type_from_variant_discriminant<'tcx, P: FromPrimitive>(
719-
cx: &CodegenCx<'tcx>,
720-
const_: &'tcx Const<'tcx>,
721-
) -> P {
722-
let adt_def = const_.ty.ty_adt_def().unwrap();
723-
assert!(adt_def.is_enum());
724-
let destructured = cx.tcx.destructure_const(ParamEnv::reveal_all().and(const_));
725-
let idx = destructured.variant.unwrap();
726-
let value = const_.ty.discriminant_for_variant(cx.tcx, idx).unwrap().val as u64;
727-
<_>::from_u64(value).unwrap()
728-
}
717+
// fn type_from_variant_discriminant<'tcx, P: FromPrimitive>(
718+
// cx: &CodegenCx<'tcx>,
719+
// const_: &'tcx Const<'tcx>,
720+
// ) -> P {
721+
// let adt_def = const_.ty.ty_adt_def().unwrap();
722+
// assert!(adt_def.is_enum());
723+
// let destructured = cx.tcx.destructure_const(ParamEnv::reveal_all().and(const_));
724+
// let idx = destructured.variant.unwrap();
725+
// let value = const_.ty.discriminant_for_variant(cx.tcx, idx).unwrap().val as u64;
726+
// <_>::from_u64(value).unwrap()
727+
// }
729728

730729
let sampled_type = match substs.type_at(0).kind() {
731730
TyKind::Int(int) => match int {
@@ -760,25 +759,37 @@ fn trans_intrinsic_type<'tcx>(
760759
}
761760
};
762761

763-
let dim: spirv::Dim = type_from_variant_discriminant(cx, substs.const_at(1));
764-
let depth: u32 = type_from_variant_discriminant(cx, substs.const_at(2));
765-
let arrayed: u32 = type_from_variant_discriminant(cx, substs.const_at(3));
766-
let multisampled: u32 = type_from_variant_discriminant(cx, substs.const_at(4));
767-
let sampled: u32 = type_from_variant_discriminant(cx, substs.const_at(5));
768-
let image_format: spirv::ImageFormat =
769-
type_from_variant_discriminant(cx, substs.const_at(6));
770-
771-
let access_qualifier = {
772-
let option = cx
773-
.tcx
774-
.destructure_const(ParamEnv::reveal_all().and(substs.const_at(7)));
775-
776-
match option.variant.map(|i| i.as_u32()).unwrap_or(0) {
777-
0 => None,
778-
1 => Some(type_from_variant_discriminant(cx, option.fields[0])),
779-
_ => unreachable!(),
762+
// let dim: spirv::Dim = type_from_variant_discriminant(cx, substs.const_at(1));
763+
// let depth: u32 = type_from_variant_discriminant(cx, substs.const_at(2));
764+
// let arrayed: u32 = type_from_variant_discriminant(cx, substs.const_at(3));
765+
// let multisampled: u32 = type_from_variant_discriminant(cx, substs.const_at(4));
766+
// let sampled: u32 = type_from_variant_discriminant(cx, substs.const_at(5));
767+
// let image_format: spirv::ImageFormat =
768+
// type_from_variant_discriminant(cx, substs.const_at(6));
769+
770+
fn const_int_value<'tcx, P: FromPrimitive>(
771+
cx: &CodegenCx<'tcx>,
772+
const_: &'tcx Const<'tcx>,
773+
) -> Result<P, ErrorReported> {
774+
assert!(const_.ty.is_integral());
775+
let value = const_.eval_bits(cx.tcx, ParamEnv::reveal_all(), const_.ty);
776+
match P::from_u128(value) {
777+
Some(v) => Ok(v),
778+
None => {
779+
cx.tcx
780+
.sess
781+
.err(&format!("Invalid value for Image const generic: {}", value));
782+
Err(ErrorReported)
783+
}
780784
}
781-
};
785+
}
786+
787+
let dim = const_int_value(cx, substs.const_at(1))?;
788+
let depth = const_int_value(cx, substs.const_at(2))?;
789+
let arrayed = const_int_value(cx, substs.const_at(3))?;
790+
let multisampled = const_int_value(cx, substs.const_at(4))?;
791+
let sampled = const_int_value(cx, substs.const_at(5))?;
792+
let image_format = const_int_value(cx, substs.const_at(6))?;
782793

783794
let ty = SpirvType::Image {
784795
sampled_type,
@@ -788,7 +799,6 @@ fn trans_intrinsic_type<'tcx>(
788799
multisampled,
789800
sampled,
790801
image_format,
791-
access_qualifier,
792802
};
793803
Ok(ty.def(span, cx))
794804
}

crates/rustc_codegen_spirv/src/builder/spirv_asm.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,6 @@ impl<'cx, 'tcx> Builder<'cx, 'tcx> {
343343
multisampled: inst.operands[4].unwrap_literal_int32(),
344344
sampled: inst.operands[5].unwrap_literal_int32(),
345345
image_format: inst.operands[6].unwrap_image_format(),
346-
access_qualifier: None,
347346
}
348347
.def(self.span(), self),
349348
Op::TypeSampledImage => SpirvType::SampledImage {

crates/rustc_codegen_spirv/src/spirv_type.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ use crate::codegen_cx::CodegenCx;
44
use bimap::BiHashMap;
55
use indexmap::IndexSet;
66
use rspirv::dr::Operand;
7-
use rspirv::spirv::{
8-
AccessQualifier, Capability, Decoration, Dim, ImageFormat, StorageClass, Word,
9-
};
7+
use rspirv::spirv::{Capability, Decoration, Dim, ImageFormat, StorageClass, Word};
108
use rustc_data_structures::fx::FxHashMap;
119
use rustc_span::def_id::DefId;
1210
use rustc_span::Span;
@@ -75,7 +73,6 @@ pub enum SpirvType {
7573
multisampled: u32,
7674
sampled: u32,
7775
image_format: ImageFormat,
78-
access_qualifier: Option<AccessQualifier>,
7976
},
8077
Sampler,
8178
SampledImage {
@@ -243,7 +240,6 @@ impl SpirvType {
243240
multisampled,
244241
sampled,
245242
image_format,
246-
access_qualifier,
247243
} => cx.emit_global().type_image_id(
248244
id,
249245
sampled_type,
@@ -253,7 +249,7 @@ impl SpirvType {
253249
multisampled,
254250
sampled,
255251
image_format,
256-
access_qualifier,
252+
None,
257253
),
258254
Self::Sampler => cx.emit_global().type_sampler_id(id),
259255
Self::AccelerationStructureKhr => {
@@ -513,7 +509,6 @@ impl fmt::Debug for SpirvTypePrinter<'_, '_> {
513509
multisampled,
514510
sampled,
515511
image_format,
516-
access_qualifier,
517512
} => f
518513
.debug_struct("Image")
519514
.field("id", &self.id)
@@ -524,7 +519,6 @@ impl fmt::Debug for SpirvTypePrinter<'_, '_> {
524519
.field("multisampled", &multisampled)
525520
.field("sampled", &sampled)
526521
.field("image_format", &image_format)
527-
.field("access_qualifier", &access_qualifier)
528522
.finish(),
529523
SpirvType::Sampler => f.debug_struct("Sampler").field("id", &self.id).finish(),
530524
SpirvType::SampledImage { image_type } => f
@@ -670,7 +664,6 @@ impl SpirvTypePrinter<'_, '_> {
670664
multisampled,
671665
sampled,
672666
image_format,
673-
access_qualifier,
674667
} => f
675668
.debug_struct("Image")
676669
.field("sampled_type", &self.cx.debug_type(sampled_type))
@@ -680,7 +673,6 @@ impl SpirvTypePrinter<'_, '_> {
680673
.field("multisampled", &multisampled)
681674
.field("sampled", &sampled)
682675
.field("image_format", &image_format)
683-
.field("access_qualifier", &access_qualifier)
684676
.finish(),
685677
SpirvType::Sampler => f.write_str("Sampler"),
686678
SpirvType::SampledImage { image_type } => f

crates/spirv-std/macros/src/image.rs

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ type, or use `format` to set the image to a specific image format.";
2525

2626
/// Creates an `Image` type using the following syntax.
2727
pub struct ImageType {
28-
access_qualifier: Option<AccessQualifier>,
2928
arrayed: Arrayed,
3029
crate_root: Option<syn::Path>,
3130
depth: ImageDepth,
@@ -38,7 +37,6 @@ pub struct ImageType {
3837

3938
impl Parse for ImageType {
4039
fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
41-
let mut access_qualifier = None;
4240
let mut sampled_type = None;
4341
let mut dimensionality = None;
4442
let mut arrayed = None;
@@ -86,20 +84,7 @@ impl Parse for ImageType {
8684
} else if input.peek(syn::Ident) {
8785
let ident = input.parse::<Ident>().unwrap();
8886

89-
if ident == "access" {
90-
let value = peek_and_eat_value!(syn::Ident)
91-
.as_ref()
92-
.map(|i| params::access_qualifier_from_str(&i.to_string()));
93-
94-
if value.is_none() {
95-
return Err(syn::Error::new(
96-
ident.span(),
97-
"Expected argument for `access`.",
98-
));
99-
}
100-
101-
access_qualifier = value.unwrap().ok();
102-
} else if ident == "buffer" {
87+
if ident == "buffer" {
10388
set_unique!(dimensionality = Dimensionality::Buffer);
10489
} else if ident == "cube" {
10590
set_unique!(dimensionality = Dimensionality::Cube);
@@ -302,7 +287,6 @@ impl Parse for ImageType {
302287
let sampled = sampled.unwrap_or(Sampled::Unknown);
303288

304289
Ok(Self {
305-
access_qualifier,
306290
arrayed,
307291
crate_root,
308292
depth,
@@ -326,13 +310,6 @@ impl quote::ToTokens for ImageType {
326310
punct
327311
},
328312
});
329-
let access_qualifier = match self.access_qualifier {
330-
Some(aq) => {
331-
let aq = params::access_qualifier_to_tokens(&aq);
332-
quote!(Some(#crate_root::image::#aq))
333-
}
334-
None => quote!(None),
335-
};
336313
let dimensionality = params::dimensionality_to_tokens(&self.dimensionality);
337314
let arrayed = params::arrayed_to_tokens(&self.arrayed);
338315
let depth = params::image_depth_to_tokens(&self.depth);
@@ -344,13 +321,12 @@ impl quote::ToTokens for ImageType {
344321
tokens.append_all(quote::quote! {
345322
#crate_root::image::Image<
346323
#crate_root::image::__private::#sampled_type,
347-
{ #crate_root::image::#dimensionality },
348-
{ #crate_root::image::#depth },
349-
{ #crate_root::image::#arrayed },
350-
{ #crate_root::image::#multisampled },
351-
{ #crate_root::image::#sampled },
352-
{ #crate_root::image::#format },
353-
{ #access_qualifier },
324+
{ #crate_root::image::#dimensionality as u32 },
325+
{ #crate_root::image::#depth as u32 },
326+
{ #crate_root::image::#arrayed as u32 },
327+
{ #crate_root::image::#multisampled as u32 },
328+
{ #crate_root::image::#sampled as u32 },
329+
{ #crate_root::image::#format as u32 },
354330
>
355331
});
356332
}
@@ -360,15 +336,6 @@ mod params {
360336
use super::*;
361337
use proc_macro2::TokenStream;
362338

363-
pub fn access_qualifier_from_str(s: &str) -> Result<AccessQualifier, &'static str> {
364-
match s {
365-
"read" => Ok(AccessQualifier::ReadOnly),
366-
"write" => Ok(AccessQualifier::WriteOnly),
367-
"read_write" => Ok(AccessQualifier::ReadWrite),
368-
_ => Err("Invalid access qualifier."),
369-
}
370-
}
371-
372339
pub fn image_format_from_str(s: &str) -> Result<ImageFormat, &'static str> {
373340
Ok(match s {
374341
"rgba32f" => ImageFormat::Rgba32f,
@@ -449,14 +416,6 @@ mod params {
449416
}
450417
}
451418

452-
pub fn access_qualifier_to_tokens(aq: &AccessQualifier) -> TokenStream {
453-
match aq {
454-
AccessQualifier::ReadOnly => quote!(AccessQualifier::ReadOnly),
455-
AccessQualifier::WriteOnly => quote!(AccessQualifier::WriteOnly),
456-
AccessQualifier::ReadWrite => quote!(AccessQualifier::ReadWrite),
457-
}
458-
}
459-
460419
pub fn image_depth_to_tokens(id: &ImageDepth) -> TokenStream {
461420
match id {
462421
ImageDepth::True => quote!(ImageDepth::True),

0 commit comments

Comments
 (0)