From 5d9a95370fae0f6234bd3713230f0f484a099b68 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 16 Feb 2022 11:13:29 +0100 Subject: [PATCH] GLSL: Ensure correct signed integer type for more texture functions. --- .../frag/texel-fetch-ms-uint-sample.asm.frag | 15 ++++ .../frag/texel-fetch-ms-uint-sample.asm.frag | 68 +++++++++++++++++++ spirv_glsl.cpp | 23 ++----- 3 files changed, 89 insertions(+), 17 deletions(-) create mode 100644 reference/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag create mode 100644 shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag diff --git a/reference/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag b/reference/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag new file mode 100644 index 00000000..d62ccb83 --- /dev/null +++ b/reference/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag @@ -0,0 +1,15 @@ +#version 450 + +layout(binding = 0) uniform sampler2DMS uSamp; + +layout(location = 0) out vec4 FragColor; + +void main() +{ + ivec2 _28 = ivec2(gl_FragCoord.xy); + FragColor.x = texelFetch(uSamp, _28, int(0u)).x; + FragColor.y = texelFetch(uSamp, _28, int(1u)).x; + FragColor.z = texelFetch(uSamp, _28, int(2u)).x; + FragColor.w = texelFetch(uSamp, _28, int(3u)).x; +} + diff --git a/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag b/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag new file mode 100644 index 00000000..6f198079 --- /dev/null +++ b/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag @@ -0,0 +1,68 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 10 +; Bound: 61 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColor %gl_FragCoord + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 450 + OpName %main "main" + OpName %FragColor "FragColor" + OpName %uSamp "uSamp" + OpName %gl_FragCoord "gl_FragCoord" + OpDecorate %FragColor Location 0 + OpDecorate %uSamp DescriptorSet 0 + OpDecorate %uSamp Binding 0 + OpDecorate %gl_FragCoord BuiltIn FragCoord + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Output_v4float = OpTypePointer Output %v4float + %FragColor = OpVariable %_ptr_Output_v4float Output + %10 = OpTypeImage %float 2D 0 0 1 1 Unknown + %11 = OpTypeSampledImage %10 +%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11 + %uSamp = OpVariable %_ptr_UniformConstant_11 UniformConstant +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input + %v2float = OpTypeVector %float 2 + %uint = OpTypeInt 32 0 + %int = OpTypeInt 32 1 + %v2int = OpTypeVector %int 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Output_float = OpTypePointer Output %float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %main = OpFunction %void None %3 + %5 = OpLabel + %14 = OpLoad %11 %uSamp + %18 = OpLoad %v4float %gl_FragCoord + %19 = OpVectorShuffle %v2float %18 %18 0 1 + %22 = OpConvertFToS %v2int %19 + %24 = OpImage %10 %14 + %25 = OpImageFetch %v4float %24 %22 Sample %uint_0 + %28 = OpCompositeExtract %float %25 0 + %30 = OpAccessChain %_ptr_Output_float %FragColor %uint_0 + OpStore %30 %28 + %36 = OpImage %10 %14 + %37 = OpImageFetch %v4float %36 %22 Sample %uint_1 + %38 = OpCompositeExtract %float %37 0 + %40 = OpAccessChain %_ptr_Output_float %FragColor %uint_1 + OpStore %40 %38 + %46 = OpImage %10 %14 + %47 = OpImageFetch %v4float %46 %22 Sample %uint_2 + %48 = OpCompositeExtract %float %47 0 + %50 = OpAccessChain %_ptr_Output_float %FragColor %uint_2 + OpStore %50 %48 + %56 = OpImage %10 %14 + %57 = OpImageFetch %v4float %56 %22 Sample %uint_3 + %58 = OpCompositeExtract %float %57 0 + %60 = OpAccessChain %_ptr_Output_float %FragColor %uint_3 + OpStore %60 %58 + OpReturn + OpFunctionEnd diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index 3cdb742f..60fb8507 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -7237,18 +7237,11 @@ string CompilerGLSL::to_function_args(const TextureFunctionArguments &args, bool forward = forward && should_forward(args.lod); farg_str += ", "; - auto &lod_expr_type = expression_type(args.lod); - // Lod expression for TexelFetch in GLSL must be int, and only int. - if (args.base.is_fetch && imgtype.image.dim != DimBuffer && !imgtype.image.ms && - lod_expr_type.basetype != SPIRType::Int) - { - farg_str += join("int(", to_expression(args.lod), ")"); - } + if (args.base.is_fetch && imgtype.image.dim != DimBuffer && !imgtype.image.ms) + farg_str += bitcast_expression(SPIRType::Int, args.lod); else - { farg_str += to_expression(args.lod); - } } } else if (args.base.is_fetch && imgtype.image.dim != DimBuffer && !imgtype.image.ms) @@ -7261,19 +7254,19 @@ string CompilerGLSL::to_function_args(const TextureFunctionArguments &args, bool { forward = forward && should_forward(args.coffset); farg_str += ", "; - farg_str += to_expression(args.coffset); + farg_str += bitcast_expression(SPIRType::Int, args.coffset); } else if (args.offset) { forward = forward && should_forward(args.offset); farg_str += ", "; - farg_str += to_expression(args.offset); + farg_str += bitcast_expression(SPIRType::Int, args.offset); } if (args.sample) { farg_str += ", "; - farg_str += to_expression(args.sample); + farg_str += bitcast_expression(SPIRType::Int, args.sample); } if (args.min_lod) @@ -7300,11 +7293,7 @@ string CompilerGLSL::to_function_args(const TextureFunctionArguments &args, bool { forward = forward && should_forward(args.component); farg_str += ", "; - auto &component_type = expression_type(args.component); - if (component_type.basetype == SPIRType::Int) - farg_str += to_expression(args.component); - else - farg_str += join("int(", to_expression(args.component), ")"); + farg_str += bitcast_expression(SPIRType::Int, args.component); } *p_forward = forward;