Skip to content

Commit 430f567

Browse files
committed
Restrict SubpassData image dimension to Vulkan environments
SubpassData is a Vulkan-specific concept (input attachments). Reject OpTypeImage with Dim SubpassData in non-Vulkan environments with ImageTypeSubpassDataRequiresVulkan error.
1 parent 0b3b9f7 commit 430f567

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

rust/spirv-tools-core/src/validation/error.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4143,6 +4143,14 @@ pub enum ValidationError {
41434143
/// Actual operand count.
41444144
actual: usize,
41454145
},
4146+
/// OpTypeImage with SubpassData dimension requires Vulkan environment.
4147+
#[error("OpTypeImage {type_id:?} with SubpassData dimension is only allowed in Vulkan, current environment is {env:?}")]
4148+
ImageTypeSubpassDataRequiresVulkan {
4149+
/// The image type ID.
4150+
type_id: Option<TypeId>,
4151+
/// The current target environment.
4152+
env: crate::target_env::TargetEnv,
4153+
},
41464154
/// OpTypeImage with SubpassData dimension must not be arrayed.
41474155
#[error("OpTypeImage {type_id:?} with SubpassData dimension must not be arrayed")]
41484156
ImageTypeSubpassDataMustNotBeArrayed {

rust/spirv-tools-core/src/validation/rules/image.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,17 @@ impl ValidationRule for ImageTypeRule {
272272
);
273273
}
274274

275+
// SubpassData requires Vulkan environment
276+
if dim == Dim::DimSubpassData && !ctx.env.is_vulkan() {
277+
return Err(
278+
ValidationError::ImageTypeSubpassDataRequiresVulkan {
279+
type_id,
280+
env: ctx.env,
281+
}
282+
.into(),
283+
);
284+
}
285+
275286
// SubpassData constraints
276287
if dim == Dim::DimSubpassData {
277288
if arrayed != 0 {

rust/spirv-tools-core/src/validation/tests/misc.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7098,3 +7098,53 @@ OpFunctionEnd
70987098
assemble_and_validate_with_env(text, TargetEnv::Vulkan1_2)
70997099
.expect("Block var with per-member Locations should pass");
71007100
}
7101+
7102+
// ============================================================================
7103+
// SubpassData Vulkan-only restriction
7104+
// ============================================================================
7105+
7106+
#[test]
7107+
fn subpass_data_accepted_in_vulkan() {
7108+
let text = r#"
7109+
OpCapability Shader
7110+
OpCapability InputAttachment
7111+
OpMemoryModel Logical GLSL450
7112+
OpEntryPoint Fragment %main "main"
7113+
OpExecutionMode %main OriginUpperLeft
7114+
%void = OpTypeVoid
7115+
%fn = OpTypeFunction %void
7116+
%f32 = OpTypeFloat 32
7117+
%img = OpTypeImage %f32 SubpassData 0 0 0 2 Unknown
7118+
%main = OpFunction %void None %fn
7119+
%entry = OpLabel
7120+
OpReturn
7121+
OpFunctionEnd
7122+
"#;
7123+
assemble_and_validate_with_env(text, TargetEnv::Vulkan1_2)
7124+
.expect("SubpassData should be accepted in Vulkan");
7125+
}
7126+
7127+
#[test]
7128+
fn subpass_data_rejected_in_non_vulkan() {
7129+
let text = r#"
7130+
OpCapability Shader
7131+
OpCapability InputAttachment
7132+
OpMemoryModel Logical GLSL450
7133+
OpEntryPoint Fragment %main "main"
7134+
OpExecutionMode %main OriginUpperLeft
7135+
%void = OpTypeVoid
7136+
%fn = OpTypeFunction %void
7137+
%f32 = OpTypeFloat 32
7138+
%img = OpTypeImage %f32 SubpassData 0 0 0 2 Unknown
7139+
%main = OpFunction %void None %fn
7140+
%entry = OpLabel
7141+
OpReturn
7142+
OpFunctionEnd
7143+
"#;
7144+
let err = assemble_and_validate_with_env(text, TargetEnv::Universal1_6)
7145+
.expect_err("SubpassData should be rejected in non-Vulkan");
7146+
assert!(
7147+
matches!(err, ValidationError::ImageTypeSubpassDataRequiresVulkan { .. }),
7148+
"expected ImageTypeSubpassDataRequiresVulkan, got {err:?}"
7149+
);
7150+
}

0 commit comments

Comments
 (0)