[spirv] Make sure asuint() argument is r-value (#3747)

This commit is contained in:
Jaebaek Seo 2021-05-06 10:10:29 -04:00 коммит произвёл GitHub
Родитель 320d40bf35
Коммит 3241aa8b68
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 29 добавлений и 1 удалений

Просмотреть файл

@ -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"); }