From 84cd57a10102e66a621752dfa377a9c64219d013 Mon Sep 17 00:00:00 2001 From: teoxoy <28601907+teoxoy@users.noreply.github.com> Date: Tue, 26 Sep 2023 19:15:09 +0200 Subject: [PATCH 1/2] [valid] make sure `textureSampleBias` is only used in the fragment stage --- src/valid/expression.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/valid/expression.rs b/src/valid/expression.rs index f9b77b1297..3426bf008e 100644 --- a/src/valid/expression.rs +++ b/src/valid/expression.rs @@ -492,7 +492,7 @@ impl super::Validator { } => {} _ => return Err(ExpressionError::InvalidSampleLevelBiasType(expr)), } - ShaderStages::all() + ShaderStages::FRAGMENT } crate::SampleLevel::Gradient { x, y } => { match resolver[x] { From 879e8f4a0addb35d8926a2b87194cfb19527aeab Mon Sep 17 00:00:00 2001 From: teoxoy <28601907+teoxoy@users.noreply.github.com> Date: Tue, 26 Sep 2023 19:22:34 +0200 Subject: [PATCH 2/2] disable uniformity analysis for the fragment stage --- src/valid/analyzer.rs | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/valid/analyzer.rs b/src/valid/analyzer.rs index e4162e15f5..9b21b7f732 100644 --- a/src/valid/analyzer.rs +++ b/src/valid/analyzer.rs @@ -16,6 +16,10 @@ use std::ops; pub type NonUniformResult = Option>; +// Remove this once we update our uniformity analysis and +// add support for the `derivative_uniformity` diagnostic +const DISABLE_UNIFORMITY_REQ_FOR_FRAGMENT_STAGE: bool = true; + bitflags::bitflags! { /// Kinds of expressions that require uniform control flow. #[cfg_attr(feature = "serialize", derive(serde::Serialize))] @@ -23,8 +27,8 @@ bitflags::bitflags! { #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct UniformityRequirements: u8 { const WORK_GROUP_BARRIER = 0x1; - const DERIVATIVE = 0x2; - const IMPLICIT_LEVEL = 0x4; + const DERIVATIVE = if DISABLE_UNIFORMITY_REQ_FOR_FRAGMENT_STAGE { 0 } else { 0x2 }; + const IMPLICIT_LEVEL = if DISABLE_UNIFORMITY_REQ_FOR_FRAGMENT_STAGE { 0 } else { 0x4 }; } } @@ -1185,21 +1189,28 @@ fn uniform_control_flow() { .into(), reject: crate::Block::new(), }; - assert_eq!( - info.process_block( + { + let block_info = info.process_block( &vec![stmt_emit2, stmt_if_non_uniform].into(), &[], None, - &expressions - ), - Err(FunctionError::NonUniformControlFlow( - UniformityRequirements::DERIVATIVE, - derivative_expr, - UniformityDisruptor::Expression(non_uniform_global_expr) - ) - .with_span()), - ); - assert_eq!(info[derivative_expr].ref_count, 1); + &expressions, + ); + if DISABLE_UNIFORMITY_REQ_FOR_FRAGMENT_STAGE { + assert_eq!(info[derivative_expr].ref_count, 2); + } else { + assert_eq!( + block_info, + Err(FunctionError::NonUniformControlFlow( + UniformityRequirements::DERIVATIVE, + derivative_expr, + UniformityDisruptor::Expression(non_uniform_global_expr) + ) + .with_span()), + ); + assert_eq!(info[derivative_expr].ref_count, 1); + } + } assert_eq!(info[non_uniform_global], GlobalUse::READ); let stmt_emit3 = S::Emit(emit_range_globals);