[spirv] Make sure asuint() argument is r-value (#3747)
This commit is contained in:
Родитель
320d40bf35
Коммит
3241aa8b68
|
@ -9465,7 +9465,7 @@ SpirvEmitter::processIntrinsicAsType(const CallExpr *callExpr) {
|
||||||
switch (numArgs) {
|
switch (numArgs) {
|
||||||
case 1: {
|
case 1: {
|
||||||
// Handling Method 1, 2, and 3.
|
// Handling Method 1, 2, and 3.
|
||||||
auto *argInstr = doExpr(arg0);
|
auto *argInstr = loadIfGLValue(arg0);
|
||||||
QualType fromElemType = {};
|
QualType fromElemType = {};
|
||||||
uint32_t numRows = 0, numCols = 0;
|
uint32_t numRows = 0, numCols = 0;
|
||||||
// For non-matrix arguments (scalar or vector), just do an OpBitCast.
|
// For non-matrix arguments (scalar or vector), just do an OpBitCast.
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Run: %dxc -T cs_6_0 -E main
|
||||||
|
|
||||||
|
StructuredBuffer<float4> input0;
|
||||||
|
StructuredBuffer<float4x3> input1;
|
||||||
|
|
||||||
|
[numthreads(64,1,1)]
|
||||||
|
void main(uint3 dtID : SV_DispatchThreadID)
|
||||||
|
{
|
||||||
|
// CHECK: [[ptr_input0:%\d+]] = OpAccessChain %_ptr_Uniform_v4float %input0 %int_0 %int_0
|
||||||
|
// CHECK: [[input0:%\d+]] = OpLoad %v4float [[ptr_input0]]
|
||||||
|
// CHECK: OpBitcast %v4uint [[input0]]
|
||||||
|
uint4 val0 = asuint(input0.Load(0));
|
||||||
|
|
||||||
|
// CHECK: [[ptr_input1:%\d+]] = OpAccessChain %_ptr_Uniform_mat4v3float %input1 %int_0 %int_0
|
||||||
|
// CHECK: [[input1:%\d+]] = OpLoad %mat4v3float [[ptr_input1]]
|
||||||
|
// CHECK: [[input1_0:%\d+]] = OpCompositeExtract %v3float [[input1]] 0
|
||||||
|
// CHECK: OpBitcast %v3uint [[input1_0]]
|
||||||
|
// CHECK: OpCompositeExtract %v3float {{%\d+}} 1
|
||||||
|
// CHECK: OpBitcast %v3uint
|
||||||
|
// CHECK: OpCompositeExtract %v3float {{%\d+}} 2
|
||||||
|
// CHECK: OpBitcast %v3uint
|
||||||
|
// CHECK: OpCompositeExtract %v3float {{%\d+}} 3
|
||||||
|
// CHECK: OpBitcast %v3uint
|
||||||
|
uint4x3 val1 = asuint(input1.Load(0));
|
||||||
|
}
|
|
@ -1076,6 +1076,9 @@ TEST_F(FileTest, IntrinsicsAsDouble) {
|
||||||
TEST_F(FileTest, IntrinsicsAsfloat) { runFileTest("intrinsics.asfloat.hlsl"); }
|
TEST_F(FileTest, IntrinsicsAsfloat) { runFileTest("intrinsics.asfloat.hlsl"); }
|
||||||
TEST_F(FileTest, IntrinsicsAsint) { runFileTest("intrinsics.asint.hlsl"); }
|
TEST_F(FileTest, IntrinsicsAsint) { runFileTest("intrinsics.asint.hlsl"); }
|
||||||
TEST_F(FileTest, IntrinsicsAsuint) { runFileTest("intrinsics.asuint.hlsl"); }
|
TEST_F(FileTest, IntrinsicsAsuint) { runFileTest("intrinsics.asuint.hlsl"); }
|
||||||
|
TEST_F(FileTest, IntrinsicsAsuintArgumentMustBeRValue) {
|
||||||
|
runFileTest("intrinsics.asuint.rvalue.hlsl");
|
||||||
|
}
|
||||||
TEST_F(FileTest, IntrinsicsRound) { runFileTest("intrinsics.round.hlsl"); }
|
TEST_F(FileTest, IntrinsicsRound) { runFileTest("intrinsics.round.hlsl"); }
|
||||||
TEST_F(FileTest, IntrinsicsAbs) { runFileTest("intrinsics.abs.hlsl"); }
|
TEST_F(FileTest, IntrinsicsAbs) { runFileTest("intrinsics.abs.hlsl"); }
|
||||||
TEST_F(FileTest, IntrinsicsCross) { runFileTest("intrinsics.cross.hlsl"); }
|
TEST_F(FileTest, IntrinsicsCross) { runFileTest("intrinsics.cross.hlsl"); }
|
||||||
|
|
Загрузка…
Ссылка в новой задаче