summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-11-06 16:42:14 -0800
committerGitHub <noreply@github.com>2024-11-06 16:42:14 -0800
commit989847f6a9408b68e90ac242f4a19d3266054c3e (patch)
tree1cfeb1b12f0c6d1de2669936878cce0f4c542709
parentd9cb281f5fd456d6a1df2e8e156810a86f56fc6e (diff)
Fix IntVal unification logic to insert type casts + buffer element lowering regression. (#5508)
* Fix IntVal unification logic to insert type casts. * Fix regression.
-rw-r--r--source/slang/hlsl.meta.slang4
-rw-r--r--source/slang/slang-check-constraint.cpp6
-rw-r--r--source/slang/slang-ir-lower-buffer-element-type.cpp3
-rw-r--r--source/slang/slang-ir-util.cpp11
-rw-r--r--source/slang/slang-ir-util.h2
-rw-r--r--tests/autodiff/bug-1.slang1
-rw-r--r--tests/bindings/nested-parameter-block-3.slang1
-rw-r--r--tests/bugs/array-of-array-in-sb.slang25
-rw-r--r--tests/bugs/generic-type-duplication.slang1
-rw-r--r--tests/expected-failure-github.txt16
-rw-r--r--tests/language-feature/anonymous-struct.slang1
-rw-r--r--tests/language-feature/types/opaque/inout-param-opaque-type-in-struct.slang1
-rw-r--r--tests/language-feature/types/opaque/inout-param-opaque-type.slang1
-rw-r--r--tests/language-feature/types/opaque/out-param-opaque-type-in-struct.slang2
-rw-r--r--tests/language-feature/types/opaque/out-param-opaque-type.slang1
-rw-r--r--tests/language-feature/types/opaque/return-opaque-type-in-struct.slang1
-rw-r--r--tests/language-feature/types/opaque/return-opaque-type.slang1
-rw-r--r--tests/metal/groupshared-threadlocal-same-parameter.slang1
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;