From 27e4ba59e4918494fca1e4cc2222a2dfdaa4a888 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Fri, 13 Aug 2021 00:37:02 -0400 Subject: [PATCH] Validate that SampleLevel::Exact isn't used for comparisons --- src/back/msl/writer.rs | 2 +- src/front/spv/image.rs | 7 ++++++- src/valid/expression.rs | 6 ++++++ tests/out/analysis/shadow.info.ron | 2 +- tests/out/ir/shadow.ron | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index 465992d82a..f206973b1e 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -2625,7 +2625,7 @@ fn test_stack_size() { let stack_size = addresses.end - addresses.start; // check the size (in debug only) // last observed macOS value: 17504 - if stack_size < 14000 || stack_size > 19000 { + if stack_size < 13000 || stack_size > 19000 { panic!("`put_block` stack size {} has changed!", stack_size); } } diff --git a/src/front/spv/image.rs b/src/front/spv/image.rs index 72c10c1231..fac750ddb9 100644 --- a/src/front/spv/image.rs +++ b/src/front/spv/image.rs @@ -449,7 +449,12 @@ impl> super::Parser { spirv::ImageOperands::LOD => { let lod_expr = self.next()?; let lod_handle = self.lookup_expression.lookup(lod_expr)?.handle; - level = crate::SampleLevel::Exact(lod_handle); + level = if options.compare { + log::debug!("Assuming {:?} is zero", lod_handle); + crate::SampleLevel::Zero + } else { + crate::SampleLevel::Exact(lod_handle) + }; words_left -= 1; } spirv::ImageOperands::GRAD => { diff --git a/src/valid/expression.rs b/src/valid/expression.rs index 73cc0d1322..2324fb5184 100644 --- a/src/valid/expression.rs +++ b/src/valid/expression.rs @@ -93,6 +93,8 @@ pub enum ExpressionError { InvalidSampleOffset(crate::ImageDimension, Handle), #[error("Depth reference {0:?} is not a scalar float")] InvalidDepthReference(Handle), + #[error("Depth sample level can only be Auto or Zero")] + InvalidDepthSampleLevel, #[error("Sample level (exact) type {0:?} is not a scalar float")] InvalidSampleLevelExactType(Handle), #[error("Sample level (bias) type {0:?} is not a scalar float")] @@ -451,6 +453,10 @@ impl super::Validator { } => {} _ => return Err(ExpressionError::InvalidDepthReference(expr)), } + match level { + crate::SampleLevel::Auto | crate::SampleLevel::Zero => {} + _ => return Err(ExpressionError::InvalidDepthSampleLevel), + } } // check level properties diff --git a/tests/out/analysis/shadow.info.ron b/tests/out/analysis/shadow.info.ron index 142cdb0781..f5695163b2 100644 --- a/tests/out/analysis/shadow.info.ron +++ b/tests/out/analysis/shadow.info.ron @@ -385,7 +385,7 @@ bits: 0, ), ), - ref_count: 1, + ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Float, diff --git a/tests/out/ir/shadow.ron b/tests/out/ir/shadow.ron index 52fa481c86..c71064af86 100644 --- a/tests/out/ir/shadow.ron +++ b/tests/out/ir/shadow.ron @@ -1039,7 +1039,7 @@ coordinate: 72, array_index: Some(74), offset: None, - level: Exact(25), + level: Zero, depth_ref: Some(69), ), ],