[wgsl-in] Generate no code for trivial vector/matrix construction. (#2576)

Do not emit an `Expression::As` conversion for WGSL like `vec3(v)`
where `v` is already a `vec3`, or `mat2x3(m)` where `m` is already a
2x3 matrix. This doesn't fix any bugs, but it makes it clearer to the
reader of `Lowerer::construct` that no conversion can actually take
place in this case.

Some snapshots are affected because `As` expressions whose `width` is
`None` are bitcast expressions, which the constant evaluator does not
yet support. When this commit removes those `As` expressions, the
constant evaluator can reduce the expression to a `Literal` or
`ZeroValue`, which is then concealed by #2539.
This commit is contained in:
Jim Blandy
2023-10-23 05:48:18 -07:00
committed by GitHub
parent 17dfdb9365
commit 509ea4c857
6 changed files with 14 additions and 26 deletions

View File

@@ -239,20 +239,16 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
(
Components::One {
component,
ty_inner:
&crate::TypeInner::Vector {
size: src_size,
kind: src_kind,
..
},
ty_inner: &crate::TypeInner::Vector { size: src_size, .. },
..
},
ConcreteConstructor::PartialVector { size: dst_size },
) if dst_size == src_size => crate::Expression::As {
expr: component,
kind: src_kind,
convert: None,
},
) if dst_size == src_size => {
// This is a trivial conversion: the sizes match, and a Partial
// constructor doesn't specify a scalar type, so nothing can
// possibly happen.
return Ok(component);
}
// Matrix conversion (matrix -> matrix)
(
@@ -296,11 +292,12 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
columns: dst_columns,
rows: dst_rows,
},
) if dst_columns == src_columns && dst_rows == src_rows => crate::Expression::As {
expr: component,
kind: crate::ScalarKind::Float,
convert: None,
},
) if dst_columns == src_columns && dst_rows == src_rows => {
// This is a trivial conversion: the sizes match, and a Partial
// constructor doesn't specify a scalar type, so nothing can
// possibly happen.
return Ok(component);
}
// Vector constructor (splat) - infer type
(

View File

@@ -34,7 +34,5 @@ void main() {
bool ic0_ = bool(false);
uvec2 ic4_ = uvec2(0u, 0u);
mat2x3 ic5_ = mat2x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0));
uvec2 ic6_ = uvec2(0u);
mat2x3 ic7_ = mat2x3(0.0);
}

View File

@@ -52,6 +52,4 @@ void main()
bool ic0_ = bool((bool)0);
uint2 ic4_ = uint2(0u, 0u);
float2x3 ic5_ = float2x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0));
uint2 ic6_ = asuint((uint2)0);
float2x3 ic7_ = asfloat((float2x3)0);
}

View File

@@ -42,6 +42,4 @@ kernel void main_(
bool ic0_ = static_cast<bool>(bool {});
metal::uint2 ic4_ = metal::uint2(0u, 0u);
metal::float2x3 ic5_ = metal::float2x3(metal::float3(0.0, 0.0, 0.0), metal::float3(0.0, 0.0, 0.0));
metal::uint2 ic6_ = as_type<metal::uint2>(metal::uint2 {});
metal::float2x3 ic7_ = metal::float2x3(metal::float2x3 {});
}

View File

@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.1
; Generator: rspirv
; Bound: 70
; Bound: 68
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
@@ -79,6 +79,5 @@ OpDecorate %17 ArrayStride 4
OpBranch %66
%66 = OpLabel
OpStore %63 %47
%69 = OpCopyObject %20 %62
OpReturn
OpFunctionEnd

View File

@@ -29,6 +29,4 @@ fn main() {
let ic0_ = bool(bool());
let ic4_ = vec2<u32>(0u, 0u);
let ic5_ = mat2x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
let ic6_ = bitcast<vec2<u32>>(vec2<u32>());
let ic7_ = mat2x3<f32>(mat2x3<f32>());
}