spirv-reader: convert unsigned ConstOffset Bug: tint:109 Fixed: tint:348 Change-Id: Ie3d1a6b6276ccb5184c5138d38931f7674324d59 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35580 Commit-Queue: David Neto <dneto@google.com> Reviewed-by: Ben Clayton <bclayton@google.com> Auto-Submit: David Neto <dneto@google.com>
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc index effad4f..29907df 100644 --- a/src/reader/spirv/function.cc +++ b/src/reader/spirv/function.cc
@@ -4052,8 +4052,7 @@ } if (arg_index < num_args && (image_operands_mask & SpvImageOperandsConstOffsetMask)) { - // TODO(dneto): convert to signed integer if needed - params.push_back(MakeOperand(inst, arg_index).expr); + params.push_back(ToSignedIfUnsigned(MakeOperand(inst, arg_index)).expr); image_operands_mask ^= SpvImageOperandsConstOffsetMask; arg_index++; }
diff --git a/src/reader/spirv/parser_impl_handle_test.cc b/src/reader/spirv/parser_impl_handle_test.cc index e170a28..e0ee403 100644 --- a/src/reader/spirv/parser_impl_handle_test.cc +++ b/src/reader/spirv/parser_impl_handle_test.cc
@@ -1244,6 +1244,7 @@ OpName %coords123 "coords123" OpName %coords1234 "coords1234" OpName %offsets2d "offsets2d" + OpName %u_offsets2d "u_offsets2d" OpDecorate %10 DescriptorSet 0 OpDecorate %10 Binding 0 OpDecorate %20 DescriptorSet 2 @@ -1289,6 +1290,9 @@ %value_offset = OpCompositeConstruct %v2int %int_3 %int_4 %offsets2d = OpCopyObject %v2int %value_offset + %u_value_offset = OpCompositeConstruct %v2uint %uint_3 %uint_4 + %u_offsets2d = OpCopyObject %v2uint %u_value_offset + %sam = OpLoad %sampler %10 %im = OpLoad %im_ty %20 %sampled_image = OpSampledImage %si_ty %im %sam @@ -1575,9 +1579,7 @@ ) })"}, - // OpImageSampleImplicitLod with Bias and ConstOffset - // TODO(dneto): OpImageSampleImplicitLod with Bias and unsigned - // ConstOffset + // OpImageSampleImplicitLod with Bias and signed ConstOffset ImageAccessCase{"%float 2D 0 0 0 1 Unknown", "%result = OpImageSampleImplicitLod " "%v4float %sampled_image %coords12 Bias|ConstOffset " @@ -1612,6 +1614,46 @@ Identifier[not set]{offsets2d} ) })"}, + + // OpImageSampleImplicitLod with Bias and unsigned ConstOffset + // Convert ConstOffset to signed + ImageAccessCase{"%float 2D 0 0 0 1 Unknown", + "%result = OpImageSampleImplicitLod " + "%v4float %sampled_image %coords12 Bias|ConstOffset " + "%float_7 %u_offsets2d", + R"( + Variable{ + Decorations{ + SetDecoration{0} + BindingDecoration{0} + } + x_10 + uniform_constant + __sampler_sampler + } + Variable{ + Decorations{ + SetDecoration{2} + BindingDecoration{1} + } + x_20 + uniform_constant + __sampled_texture_2d__f32 + })", + R"( + Call[not set]{ + Identifier[not set]{textureSampleBias} + ( + Identifier[not set]{x_20} + Identifier[not set]{x_10} + Identifier[not set]{coords12} + ScalarConstructor[not set]{7.000000} + TypeConstructor[not set]{ + __vec_2__i32 + Identifier[not set]{u_offsets2d} + } + ) + })"}, // OpImageSampleImplicitLod arrayed with Bias ImageAccessCase{"%float 2D 0 1 0 1 Unknown", "%result = OpImageSampleImplicitLod " @@ -1984,8 +2026,6 @@ })"}, // OpImageSampleExplicitLod - using Lod and ConstOffset - // TODO(dneto) OpImageSampleExplicitLod - using Lod and unsigned - // ConstOffset ImageAccessCase{"%float 2D 0 0 0 1 Unknown", "%result = OpImageSampleExplicitLod " "%v4float %sampled_image %coords12 Lod|ConstOffset " @@ -2021,6 +2061,46 @@ ) })"}, + // OpImageSampleExplicitLod - using Lod and unsigned ConstOffset + // Convert the ConstOffset operand to signed + ImageAccessCase{"%float 2D 0 0 0 1 Unknown", + "%result = OpImageSampleExplicitLod " + "%v4float %sampled_image %coords12 Lod|ConstOffset " + "%float_null %u_offsets2d", + R"( + Variable{ + Decorations{ + SetDecoration{0} + BindingDecoration{0} + } + x_10 + uniform_constant + __sampler_sampler + } + Variable{ + Decorations{ + SetDecoration{2} + BindingDecoration{1} + } + x_20 + uniform_constant + __sampled_texture_2d__f32 + })", + R"( + Call[not set]{ + Identifier[not set]{textureSampleLevel} + ( + Identifier[not set]{x_20} + Identifier[not set]{x_10} + Identifier[not set]{coords12} + ScalarConstructor[not set]{0.000000} + TypeConstructor[not set]{ + __vec_2__i32 + Identifier[not set]{u_offsets2d} + } + ) + })"}, + // OpImageSampleExplicitLod arrayed - using Lod and ConstOffset ImageAccessCase{"%float 2D 0 1 0 1 Unknown", "%result = OpImageSampleExplicitLod " @@ -2150,8 +2230,6 @@ })"}, // OpImageSampleExplicitLod - using Grad and ConstOffset - // TODO(dneto): OpImageSampleExplicitLod - using Grad and unsigned - // ConstOffset ImageAccessCase{"%float 2D 0 0 0 1 Unknown", "%result = OpImageSampleExplicitLod " "%v4float %sampled_image %coords12 Grad|ConstOffset " @@ -2187,9 +2265,48 @@ Identifier[not set]{offsets2d} ) })"}, + + // OpImageSampleExplicitLod - using Grad and unsigned ConstOffset + ImageAccessCase{"%float 2D 0 0 0 1 Unknown", + "%result = OpImageSampleExplicitLod " + "%v4float %sampled_image %coords12 Grad|ConstOffset " + "%float_7 %float_null %u_offsets2d", + R"( + Variable{ + Decorations{ + SetDecoration{0} + BindingDecoration{0} + } + x_10 + uniform_constant + __sampler_sampler + } + Variable{ + Decorations{ + SetDecoration{2} + BindingDecoration{1} + } + x_20 + uniform_constant + __sampled_texture_2d__f32 + })", + R"( + Call[not set]{ + Identifier[not set]{textureSampleGrad} + ( + Identifier[not set]{x_20} + Identifier[not set]{x_10} + Identifier[not set]{coords12} + ScalarConstructor[not set]{7.000000} + ScalarConstructor[not set]{0.000000} + TypeConstructor[not set]{ + __vec_2__i32 + Identifier[not set]{u_offsets2d} + } + ) + })"}, + // OpImageSampleExplicitLod arrayed - using Grad and ConstOffset - // TODO(dneto): OpImageSampleExplicitLod - using Grad and unsigned - // ConstOffset ImageAccessCase{"%float 2D 0 1 0 1 Unknown", "%result = OpImageSampleExplicitLod " "%v4float %sampled_image %coords123 Grad|ConstOffset " @@ -2234,6 +2351,57 @@ ScalarConstructor[not set]{0.000000} Identifier[not set]{offsets2d} ) + })"}, + + // OpImageSampleExplicitLod arrayed - using Grad and unsigned + // ConstOffset + ImageAccessCase{"%float 2D 0 1 0 1 Unknown", + "%result = OpImageSampleExplicitLod " + "%v4float %sampled_image %coords123 Grad|ConstOffset " + "%float_7 %float_null %u_offsets2d", + R"( + Variable{ + Decorations{ + SetDecoration{0} + BindingDecoration{0} + } + x_10 + uniform_constant + __sampler_sampler + } + Variable{ + Decorations{ + SetDecoration{2} + BindingDecoration{1} + } + x_20 + uniform_constant + __sampled_texture_2d_array__f32 + })", + R"( + Call[not set]{ + Identifier[not set]{textureSampleGrad} + ( + Identifier[not set]{x_20} + Identifier[not set]{x_10} + MemberAccessor[not set]{ + Identifier[not set]{coords123} + Identifier[not set]{xy} + } + TypeConstructor[not set]{ + __i32 + MemberAccessor[not set]{ + Identifier[not set]{coords123} + Identifier[not set]{z} + } + } + ScalarConstructor[not set]{7.000000} + ScalarConstructor[not set]{0.000000} + TypeConstructor[not set]{ + __vec_2__i32 + Identifier[not set]{u_offsets2d} + } + ) })"})); // Test crbug.com/378: