diff options
| author | Yong He <yonghe@outlook.com> | 2024-11-06 16:42:14 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-06 16:42:14 -0800 |
| commit | 989847f6a9408b68e90ac242f4a19d3266054c3e (patch) | |
| tree | 1cfeb1b12f0c6d1de2669936878cce0f4c542709 | |
| parent | d9cb281f5fd456d6a1df2e8e156810a86f56fc6e (diff) | |
Fix IntVal unification logic to insert type casts + buffer element lowering regression. (#5508)
* Fix IntVal unification logic to insert type casts.
* Fix regression.
18 files changed, 48 insertions, 31 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index b3a8ec4cf..e35dc1eee 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -4160,7 +4160,7 @@ struct StructuredBuffer /// If any values were taken from an unmapped tile, `CheckAccessFullyMapped` returns FALSE. __intrinsic_op($(kIROp_StructuredBufferLoad)) [__readNone] - [require(cpp_cuda_glsl_hlsl_spirv, structuredbuffer)] + [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer)] T Load<TIndex : __BuiltinIntegerType>(TIndex location); __intrinsic_op($(kIROp_StructuredBufferLoadStatus)) @@ -5299,7 +5299,7 @@ for(auto item : kMutableStructuredBufferCases) { __generic<T, L:IBufferDataLayout=DefaultDataLayout> __magic_type(HLSL$(item.name)Type) __intrinsic_type($(item.op)) -[require(cpp_cuda_glsl_hlsl_metal_spirv, structuredbuffer_rw)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer_rw)] /** Represents an opaque handle to a mutable structured buffer allocated in global memory. A structured buffer can be viewed as an array of the specified element type. diff --git a/source/slang/slang-check-constraint.cpp b/source/slang/slang-check-constraint.cpp index 13e3e4be6..872d2616c 100644 --- a/source/slang/slang-check-constraint.cpp +++ b/source/slang/slang-check-constraint.cpp @@ -925,6 +925,12 @@ bool SemanticsVisitor::TryUnifyIntParam( // We want to constrain the given parameter to equal the given value. Constraint constraint; constraint.decl = paramDecl; + // If `val` is of different type than `paramDecl`, we want to insert a type cast. + if (val->getType() != paramDecl->getType()) + { + auto cast = m_astBuilder->getTypeCastIntVal(paramDecl->getType(), val); + val = cast; + } constraint.val = val; constraints.constraints.add(constraint); diff --git a/source/slang/slang-ir-lower-buffer-element-type.cpp b/source/slang/slang-ir-lower-buffer-element-type.cpp index f9017ebe1..2f8631e18 100644 --- a/source/slang/slang-ir-lower-buffer-element-type.cpp +++ b/source/slang/slang-ir-lower-buffer-element-type.cpp @@ -999,7 +999,8 @@ struct LoweredElementTypeContext // the base array. // We should setup loweredElementTypeInfo so the remaining logic can handle // this case and insert proper packing/unpacking logic around it. - if (arrayType->getElementType() != originalElementType) + if (arrayType->getElementType() != originalElementType && + isScalarOrVectorType(originalElementType)) { loweredElementTypeInfo.loweredType = arrayType->getElementType(); loweredElementTypeInfo.originalType = (IRType*)originalElementType; diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index c7b40da8b..3d2a539a6 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -221,6 +221,17 @@ bool isValueType(IRInst* dataType) } } +bool isScalarOrVectorType(IRInst* type) +{ + switch (type->getOp()) + { + case kIROp_VectorType: + return true; + default: + return as<IRBasicType>(type) != nullptr; + } +} + bool isSimpleDataType(IRType* type) { type = (IRType*)unwrapAttributedType(type); diff --git a/source/slang/slang-ir-util.h b/source/slang/slang-ir-util.h index b483d950c..9a712ba96 100644 --- a/source/slang/slang-ir-util.h +++ b/source/slang/slang-ir-util.h @@ -98,6 +98,8 @@ inline bool isScalarIntegerType(IRType* type) // No side effect can take place through a value of a "Value" type. bool isValueType(IRInst* type); +bool isScalarOrVectorType(IRInst* type); + bool isSimpleDataType(IRType* type); bool isSimpleHLSLDataType(IRInst* inst); diff --git a/tests/autodiff/bug-1.slang b/tests/autodiff/bug-1.slang index b92c84098..deb7e8461 100644 --- a/tests/autodiff/bug-1.slang +++ b/tests/autodiff/bug-1.slang @@ -1,5 +1,4 @@ //TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK): -slang -compute -shaderobj -output-using-type -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu #define DO_FLOOR #define MANUAL_DERIVATIVE diff --git a/tests/bindings/nested-parameter-block-3.slang b/tests/bindings/nested-parameter-block-3.slang index 5e7150921..a9cfcfdaa 100644 --- a/tests/bindings/nested-parameter-block-3.slang +++ b/tests/bindings/nested-parameter-block-3.slang @@ -7,7 +7,6 @@ //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -use-dxil -shaderobj -output-using-type //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -metal -shaderobj -output-using-type -render-features argument-buffer-tier-2 -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu struct CB diff --git a/tests/bugs/array-of-array-in-sb.slang b/tests/bugs/array-of-array-in-sb.slang new file mode 100644 index 000000000..a449ce671 --- /dev/null +++ b/tests/bugs/array-of-array-in-sb.slang @@ -0,0 +1,25 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk + +struct S +{ + int vertices[3][3]; +} + +//TEST_INPUT:set cs = cbuffer(data=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]) +ConstantBuffer<S> cs; + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0], stride=4),name=s_buf +RWStructuredBuffer<S> s_buf; + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +// CHECK: 6 + +[numthreads(1, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + s_buf[0].vertices[1][1] = 5; + outputBuffer[0] = s_buf[0].vertices[1][1] + cs.vertices[1][0]; +}
\ No newline at end of file diff --git a/tests/bugs/generic-type-duplication.slang b/tests/bugs/generic-type-duplication.slang index 9c5a0ae67..4117a7f81 100644 --- a/tests/bugs/generic-type-duplication.slang +++ b/tests/bugs/generic-type-duplication.slang @@ -2,7 +2,6 @@ //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST(compute,vulkan):COMPARE_COMPUTE_EX:-vk -slang -compute -shaderobj -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu struct MyGeneric<let addOne: bool> { diff --git a/tests/expected-failure-github.txt b/tests/expected-failure-github.txt index 8fa260227..645f526c9 100644 --- a/tests/expected-failure-github.txt +++ b/tests/expected-failure-github.txt @@ -14,21 +14,16 @@ tests/autodiff/existential-2.slang.2 syn (wgpu) tests/autodiff/material/diff-bwd-falcor-material-system.slang.2 syn (wgpu) tests/autodiff/material2/diff-bwd-falcor-material-system.slang.2 syn (wgpu) tests/autodiff/matrix-arithmetic-fwd.slang.2 syn (wgpu) -tests/autodiff/no-diff-strip.slang.3 syn (wgpu) -tests/autodiff/reverse-loop-checkpoint-test.slang.3 syn (wgpu) -tests/bindings/nested-parameter-block-3.slang.4 syn (wgpu) tests/bugs/atomic-coerce.slang.3 syn (wgpu) tests/bugs/buffer-swizzle-store.slang.3 syn (wgpu) tests/bugs/dxbc-double-problem.slang.6 syn (wgpu) tests/bugs/frexp-double.slang.7 syn (wgpu) tests/bugs/frexp.slang.7 syn (wgpu) -tests/bugs/generic-type-duplication.slang.2 syn (wgpu) tests/bugs/gh-2959.slang.2 syn (wgpu) tests/bugs/gh-3980.slang.7 syn (wgpu) tests/bugs/gh-471.slang.1 syn (wgpu) tests/bugs/gh-518.slang.2 syn (wgpu) tests/bugs/gh-566.slang.1 syn (wgpu) -tests/bugs/nested-switch.slang.3 syn (wgpu) tests/bugs/obfuscate-specialization-naming.slang.2 syn (wgpu) tests/bugs/op-assignment-unify-mat.slang.4 syn (wgpu) tests/bugs/shadowed-lookup.slang.1 syn (wgpu) @@ -47,7 +42,6 @@ tests/compute/func-param-legalize.slang.1 syn (wgpu) tests/compute/interface-shader-param-in-struct.slang.4 syn (wgpu) tests/compute/interface-shader-param.slang.5 syn (wgpu) tests/compute/loop-unroll.slang.7 syn (wgpu) -tests/compute/parameter-block (wgpu) tests/compute/texture-get-dimensions (wgpu) tests/compute/texture-sampling (wgpu) tests/compute/texture-simple (wgpu) @@ -63,9 +57,6 @@ tests/hlsl-intrinsic/classify-float.slang.5 syn (wgpu) tests/hlsl-intrinsic/matrix-float.slang.6 syn (wgpu) tests/hlsl-intrinsic/matrix-int.slang.6 syn (wgpu) tests/hlsl-intrinsic/scalar-double-simple.slang.7 syn (wgpu) -tests/ir/string-literal-hash.slang.2 syn (wgpu) -tests/language-feature/anonymous-struct.slang.1 syn (wgpu) -tests/language-feature/constants/constexpr-loop.slang.2 syn (wgpu) tests/language-feature/constants/static-const-in-generic-interface.slang.1 syn (wgpu) tests/language-feature/enums/nested-enum.slang.1 syn (wgpu) tests/language-feature/enums/strongly-typed-id.slang.1 syn (wgpu) @@ -79,12 +70,5 @@ tests/language-feature/swizzles/matrix-swizzle-write-array.slang.3 syn (wgpu) tests/language-feature/swizzles/matrix-swizzle-write-single.slang.3 syn (wgpu) tests/language-feature/swizzles/matrix-swizzle-write-swizzle.slang.3 syn (wgpu) tests/language-feature/swizzles/matrix-swizzle-write.slang.3 syn (wgpu) -tests/language-feature/types/opaque/inout-param-opaque-type-in-struct.slang.2 syn (wgpu) -tests/language-feature/types/opaque/inout-param-opaque-type.slang.2 syn (wgpu) -tests/language-feature/types/opaque/out-param-opaque-type-in-struct.slang.2 syn (wgpu) -tests/language-feature/types/opaque/out-param-opaque-type.slang.2 syn (wgpu) -tests/language-feature/types/opaque/return-opaque-type-in-struct.slang.2 syn (wgpu) -tests/language-feature/types/opaque/return-opaque-type.slang.1 syn (wgpu) -tests/metal/groupshared-threadlocal-same-parameter.slang.4 syn (wgpu) tests/optimization/func-resource-result/func-resource-result-complex.slang.2 syn (wgpu) tests/pipeline/compute/compute-system-values.slang.3 syn (wgpu) diff --git a/tests/language-feature/anonymous-struct.slang b/tests/language-feature/anonymous-struct.slang index 3413a75af..35b002b5b 100644 --- a/tests/language-feature/anonymous-struct.slang +++ b/tests/language-feature/anonymous-struct.slang @@ -1,5 +1,4 @@ //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF): -shaderobj -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu //TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer RWStructuredBuffer<int> outputBuffer; diff --git a/tests/language-feature/types/opaque/inout-param-opaque-type-in-struct.slang b/tests/language-feature/types/opaque/inout-param-opaque-type-in-struct.slang index aa3433440..37e2585cd 100644 --- a/tests/language-feature/types/opaque/inout-param-opaque-type-in-struct.slang +++ b/tests/language-feature/types/opaque/inout-param-opaque-type-in-struct.slang @@ -5,7 +5,6 @@ //TEST(compute):COMPARE_COMPUTE: //TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu struct Things { diff --git a/tests/language-feature/types/opaque/inout-param-opaque-type.slang b/tests/language-feature/types/opaque/inout-param-opaque-type.slang index e296177c0..5da1e57e8 100644 --- a/tests/language-feature/types/opaque/inout-param-opaque-type.slang +++ b/tests/language-feature/types/opaque/inout-param-opaque-type.slang @@ -4,7 +4,6 @@ //TEST(compute):COMPARE_COMPUTE: //TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu //TEST_INPUT:set gX = ubuffer(data=[16 17 18 19], stride=4) RWStructuredBuffer<int> gX; diff --git a/tests/language-feature/types/opaque/out-param-opaque-type-in-struct.slang b/tests/language-feature/types/opaque/out-param-opaque-type-in-struct.slang index 20890f463..a7e49e5b5 100644 --- a/tests/language-feature/types/opaque/out-param-opaque-type-in-struct.slang +++ b/tests/language-feature/types/opaque/out-param-opaque-type-in-struct.slang @@ -5,8 +5,6 @@ //TEST(compute):COMPARE_COMPUTE: //TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu - struct Things { int first; diff --git a/tests/language-feature/types/opaque/out-param-opaque-type.slang b/tests/language-feature/types/opaque/out-param-opaque-type.slang index 770a052dc..572481eb2 100644 --- a/tests/language-feature/types/opaque/out-param-opaque-type.slang +++ b/tests/language-feature/types/opaque/out-param-opaque-type.slang @@ -4,7 +4,6 @@ //TEST(compute):COMPARE_COMPUTE: //TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu //TEST_INPUT:set gThings = ubuffer(data=[16 17 18 19], stride=4) RWStructuredBuffer<int> gThings; diff --git a/tests/language-feature/types/opaque/return-opaque-type-in-struct.slang b/tests/language-feature/types/opaque/return-opaque-type-in-struct.slang index cabecabd4..3af17a0b4 100644 --- a/tests/language-feature/types/opaque/return-opaque-type-in-struct.slang +++ b/tests/language-feature/types/opaque/return-opaque-type-in-struct.slang @@ -5,7 +5,6 @@ //TEST(compute):COMPARE_COMPUTE: //TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu struct Things { diff --git a/tests/language-feature/types/opaque/return-opaque-type.slang b/tests/language-feature/types/opaque/return-opaque-type.slang index ba0f27d63..e14ff8616 100644 --- a/tests/language-feature/types/opaque/return-opaque-type.slang +++ b/tests/language-feature/types/opaque/return-opaque-type.slang @@ -3,7 +3,6 @@ // Test that a function/method can return a value of an opaque type. //TEST(compute):COMPARE_COMPUTE: -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu struct Stuff { diff --git a/tests/metal/groupshared-threadlocal-same-parameter.slang b/tests/metal/groupshared-threadlocal-same-parameter.slang index 57db42edc..1249d4703 100644 --- a/tests/metal/groupshared-threadlocal-same-parameter.slang +++ b/tests/metal/groupshared-threadlocal-same-parameter.slang @@ -2,7 +2,6 @@ //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF): -vk -shaderobj -output-using-type //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF): -vk -emit-spirv-directly -shaderobj -output-using-type //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF):-slang -shaderobj -mtl -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu //TEST_INPUT:ubuffer(data=[0 0], stride=4):out,name outputBuffer RWStructuredBuffer<uint> outputBuffer; |
