Support the floatBitsToint function at GL_ARB_gpu_shader5 Extension.
authorZhiqianXia <xzq0528@outlook.com>
Fri, 7 Jan 2022 05:50:30 +0000 (13:50 +0800)
committerZhiqianXia <xzq0528@outlook.com>
Fri, 7 Jan 2022 05:50:30 +0000 (13:50 +0800)
Test/baseResults/150.frag.out
Test/baseResults/floatBitsToInt.vert.out [new file with mode: 0644]
Test/floatBitsToInt.vert [new file with mode: 0644]
glslang/MachineIndependent/Initialize.cpp
gtests/AST.FromFile.cpp

index 3e66658..066b8bb 100644 (file)
@@ -8,7 +8,9 @@ ERROR: 0:53: 'double' : Reserved word.
 ERROR: 0:53: 'double' : not supported for this version or the enabled extensions 
 ERROR: 0:53: 'double' : must be qualified as flat in
 ERROR: 0:57: '=' :  cannot convert from ' global double' to ' global int'
-ERROR: 0:80: 'floatBitsToInt' : required extension not requested: GL_ARB_shader_bit_encoding
+ERROR: 0:80: 'floatBitsToInt' : required extension not requested: Possible extensions include:
+GL_ARB_shader_bit_encoding
+GL_ARB_gpu_shader5
 ERROR: 0:100: 'packSnorm2x16' : required extension not requested: GL_ARB_shading_language_packing
 ERROR: 0:114: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod
 ERROR: 0:115: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod
diff --git a/Test/baseResults/floatBitsToInt.vert.out b/Test/baseResults/floatBitsToInt.vert.out
new file mode 100644 (file)
index 0000000..6d5185c
--- /dev/null
@@ -0,0 +1,217 @@
+floatBitsToInt.vert
+WARNING: 0:2: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'result' ( smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      Sequence
+0:9        move second child to first child ( temp int)
+0:9          'ret_val' ( temp int)
+0:9          floatBitsToInt ( global int)
+0:9            'value' ( uniform float)
+0:10      Test condition and select ( temp void)
+0:10        Condition
+0:10        Compare Not Equal ( temp bool)
+0:10          'expected_value' ( uniform int)
+0:10          'ret_val' ( temp int)
+0:10        true case
+0:10        Sequence
+0:10          move second child to first child ( temp 4-component vector of float)
+0:10            'result' ( smooth out 4-component vector of float)
+0:10            Constant:
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:12      switch
+0:12      condition
+0:12        'gl_VertexID' ( gl_VertexId int VertexId)
+0:12      body
+0:12        Sequence
+0:13          case:  with expression
+0:13            Constant:
+0:13              0 (const int)
+0:?           Sequence
+0:13            move second child to first child ( temp 4-component vector of float)
+0:13              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:13                Constant:
+0:13                  0 (const uint)
+0:13              Constant:
+0:13                -1.000000
+0:13                1.000000
+0:13                0.000000
+0:13                1.000000
+0:13            Branch: Break
+0:14          case:  with expression
+0:14            Constant:
+0:14              1 (const int)
+0:?           Sequence
+0:14            move second child to first child ( temp 4-component vector of float)
+0:14              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:14                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              Constant:
+0:14                1.000000
+0:14                1.000000
+0:14                0.000000
+0:14                1.000000
+0:14            Branch: Break
+0:15          case:  with expression
+0:15            Constant:
+0:15              2 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp 4-component vector of float)
+0:15              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:15                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              Constant:
+0:15                -1.000000
+0:15                -1.000000
+0:15                0.000000
+0:15                1.000000
+0:15            Branch: Break
+0:16          case:  with expression
+0:16            Constant:
+0:16              3 (const int)
+0:?           Sequence
+0:16            move second child to first child ( temp 4-component vector of float)
+0:16              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:16                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              Constant:
+0:16                1.000000
+0:16                -1.000000
+0:16                0.000000
+0:16                1.000000
+0:16            Branch: Break
+0:?   Linker Objects
+0:?     'expected_value' ( uniform int)
+0:?     'value' ( uniform float)
+0:?     'result' ( smooth out 4-component vector of float)
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'result' ( smooth out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      Sequence
+0:9        move second child to first child ( temp int)
+0:9          'ret_val' ( temp int)
+0:9          floatBitsToInt ( global int)
+0:9            'value' ( uniform float)
+0:10      Test condition and select ( temp void)
+0:10        Condition
+0:10        Compare Not Equal ( temp bool)
+0:10          'expected_value' ( uniform int)
+0:10          'ret_val' ( temp int)
+0:10        true case
+0:10        Sequence
+0:10          move second child to first child ( temp 4-component vector of float)
+0:10            'result' ( smooth out 4-component vector of float)
+0:10            Constant:
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:10              0.000000
+0:12      switch
+0:12      condition
+0:12        'gl_VertexID' ( gl_VertexId int VertexId)
+0:12      body
+0:12        Sequence
+0:13          case:  with expression
+0:13            Constant:
+0:13              0 (const int)
+0:?           Sequence
+0:13            move second child to first child ( temp 4-component vector of float)
+0:13              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance})
+0:13                Constant:
+0:13                  0 (const uint)
+0:13              Constant:
+0:13                -1.000000
+0:13                1.000000
+0:13                0.000000
+0:13                1.000000
+0:13            Branch: Break
+0:14          case:  with expression
+0:14            Constant:
+0:14              1 (const int)
+0:?           Sequence
+0:14            move second child to first child ( temp 4-component vector of float)
+0:14              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:14                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              Constant:
+0:14                1.000000
+0:14                1.000000
+0:14                0.000000
+0:14                1.000000
+0:14            Branch: Break
+0:15          case:  with expression
+0:15            Constant:
+0:15              2 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp 4-component vector of float)
+0:15              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:15                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              Constant:
+0:15                -1.000000
+0:15                -1.000000
+0:15                0.000000
+0:15                1.000000
+0:15            Branch: Break
+0:16          case:  with expression
+0:16            Constant:
+0:16              3 (const int)
+0:?           Sequence
+0:16            move second child to first child ( temp 4-component vector of float)
+0:16              gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:16                'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              Constant:
+0:16                1.000000
+0:16                -1.000000
+0:16                0.000000
+0:16                1.000000
+0:16            Branch: Break
+0:?   Linker Objects
+0:?     'expected_value' ( uniform int)
+0:?     'value' ( uniform float)
+0:?     'result' ( smooth out 4-component vector of float)
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/floatBitsToInt.vert b/Test/floatBitsToInt.vert
new file mode 100644 (file)
index 0000000..a6bb18a
--- /dev/null
@@ -0,0 +1,18 @@
+#version 150
+#extension GL_ARB_gpu_shader5 : require
+uniform int expected_value;
+uniform float value;
+out     vec4 result;
+void main()
+{
+    result = vec4(1.0, 1.0, 1.0, 1.0);
+    int ret_val = floatBitsToInt(value);
+    if (expected_value != ret_val){  result = vec4(0.0, 0.0, 0.0, 0.0); }
+
+    switch (gl_VertexID)  {
+      case 0: gl_Position = vec4(-1.0, 1.0, 0.0, 1.0); break;
+      case 1: gl_Position = vec4( 1.0, 1.0, 0.0, 1.0); break;
+      case 2: gl_Position = vec4(-1.0,-1.0, 0.0, 1.0); break;
+      case 3: gl_Position = vec4( 1.0,-1.0, 0.0, 1.0); break;
+    }
+}
\ No newline at end of file
index 3e586c8..19e12a0 100644 (file)
@@ -8353,10 +8353,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
         }
 
         if (profile != EEsProfile && version < 330 ) {
-            symbolTable.setFunctionExtensions("floatBitsToInt", 1, &E_GL_ARB_shader_bit_encoding);
-            symbolTable.setFunctionExtensions("floatBitsToUint", 1, &E_GL_ARB_shader_bit_encoding);
-            symbolTable.setFunctionExtensions("intBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
-            symbolTable.setFunctionExtensions("uintBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
+            const char* bitsConvertExt[2] = {E_GL_ARB_shader_bit_encoding, E_GL_ARB_gpu_shader5};
+            symbolTable.setFunctionExtensions("floatBitsToInt", 2, bitsConvertExt);
+            symbolTable.setFunctionExtensions("floatBitsToUint", 2, bitsConvertExt);
+            symbolTable.setFunctionExtensions("intBitsToFloat", 2, bitsConvertExt);
+            symbolTable.setFunctionExtensions("uintBitsToFloat", 2, bitsConvertExt);
         }
 
         if (profile != EEsProfile && version < 430 ) {
index d15107d..5dc14bb 100644 (file)
@@ -292,6 +292,7 @@ INSTANTIATE_TEST_SUITE_P(
         "GL_ARB_draw_instanced.vert",
         "GL_ARB_fragment_coord_conventions.vert",
         "BestMatchFunction.vert",
+        "floatBitsToInt.vert",
     })),
     FileNameAsCustomTestSuffix
 );