Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2022-02-16 13:13:29 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-02-16 13:14:07 +0300
commit5d9a95370fae0f6234bd3713230f0f484a099b68 (patch)
treeb35932676f36a8a57e66070af4335dc35114b2c3
parent131278458ea8eebe6a6e9c476fbcf71278726e1a (diff)
GLSL: Ensure correct signed integer type for more texture functions.
-rw-r--r--reference/shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag15
-rw-r--r--shaders-no-opt/asm/frag/texel-fetch-ms-uint-sample.asm.frag68
-rw-r--r--spirv_glsl.cpp23
3 files changed, 89 insertions, 17 deletions
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;