|
4 | 4 | use crate::attr::{AggregatedSpirvAttributes, IntrinsicType};
|
5 | 5 | use crate::codegen_cx::CodegenCx;
|
6 | 6 | use crate::spirv_type::SpirvType;
|
7 |
| -use rspirv::spirv::{StorageClass, Word}; |
| 7 | +use rspirv::spirv::{AccessQualifier, StorageClass, Word}; |
8 | 8 | use rustc_data_structures::fx::FxHashMap;
|
9 | 9 | use rustc_errors::ErrorGuaranteed;
|
10 | 10 | use rustc_index::Idx;
|
@@ -883,7 +883,26 @@ fn trans_intrinsic_type<'tcx>(
|
883 | 883 | let multisampled = const_int_value(cx, args.const_at(4))?;
|
884 | 884 | let sampled = const_int_value(cx, args.const_at(5))?;
|
885 | 885 | let image_format = const_int_value(cx, args.const_at(6))?;
|
886 |
| - let access_qualifier = const_int_value(cx, args.const_at(7)).ok(); |
| 886 | + |
| 887 | + let access_qualifier_ty = args.type_at(8); |
| 888 | + let access_qualifier: Option<AccessQualifier> = if let TyKind::Adt(def, _) = |
| 889 | + access_qualifier_ty.kind() |
| 890 | + { |
| 891 | + match cx.tcx.def_path_str(def.did()).as_str() { |
| 892 | + "spirv_std::image::ImageAccessReadOnly" => Some(AccessQualifier::ReadOnly), |
| 893 | + "spirv_std::image::ImageAccessWriteOnly" => Some(AccessQualifier::WriteOnly), |
| 894 | + "spirv_std::image::ImageAccessReadWrite" => Some(AccessQualifier::ReadWrite), |
| 895 | + "spirv_std::image::ImageAccessUnknown" => None, |
| 896 | + s => { |
| 897 | + return Err(cx |
| 898 | + .tcx |
| 899 | + .dcx() |
| 900 | + .err(format!("Invalid image access qualifier: '{s}'"))); |
| 901 | + } |
| 902 | + } |
| 903 | + } else { |
| 904 | + return Err(cx.tcx.dcx().err("Invalid image access qualifier")); |
| 905 | + }; |
887 | 906 |
|
888 | 907 | let ty = SpirvType::Image {
|
889 | 908 | sampled_type,
|
|
0 commit comments