Parser: Add 64-bit type conversion for specialization constant.
authorRex Xu <rex.xu@amd.com>
Mon, 5 Sep 2016 08:10:14 +0000 (16:10 +0800)
committerRex Xu <rex.xu@amd.com>
Mon, 5 Sep 2016 14:20:28 +0000 (22:20 +0800)
SPIRV/GlslangToSpv.cpp
Test/baseResults/spv.int64.frag.out
Test/baseResults/spv.specConstant.vert.out
Test/baseResults/spv.specConstantOperations.vert.out
Test/spv.int64.frag
Test/spv.specConstantOperations.vert
glslang/MachineIndependent/Intermediate.cpp
glslang/MachineIndependent/ParseHelper.cpp

index 84c9e73..c559142 100755 (executable)
@@ -3761,8 +3761,8 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Dec
     case glslang::EOpConvInt64ToUint64:
         if (builder.isInSpecConstCodeGenMode()) {
             // Build zero scalar or vector for OpIAdd.
-            zero = (op == glslang::EOpConvUintToInt64 ||
-                    op == glslang::EOpConvIntToUint64) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
+            zero = (op == glslang::EOpConvUint64ToInt64 ||
+                    op == glslang::EOpConvInt64ToUint64) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
             zero = makeSmearedConstant(zero, vectorSize);
             // Use OpIAdd, instead of OpBitcast to do the conversion when
             // generating for OpSpecConstantOp instruction.
index fe45013..b7d8ce9 100644 (file)
@@ -8,7 +8,7 @@ Linked fragment stage:
 Missing functionality: shader int64
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 455
+// Id's are bound by 478
 
                               Capability Shader
                               Capability Float64
@@ -64,6 +64,11 @@ Missing functionality: shader int64
                               Decorate 452(Block) Block
                               Decorate 454(block) DescriptorSet 0
                               Decorate 454(block) Binding 1
+                              Decorate 455 SpecId 100
+                              Decorate 456 SpecId 101
+                              Decorate 457 SpecId 102
+                              Decorate 458 SpecId 103
+                              Decorate 459 SpecId 104
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 64 1
@@ -145,6 +150,29 @@ Missing functionality: shader int64
       452(Block):             TypeStruct 134(ivec3) 36(int)
              453:             TypePointer Uniform 452(Block)
       454(block):    453(ptr) Variable Uniform
+             455:     14(int) SpecConstant 4294967286 4294967295
+             456:     36(int) SpecConstant 20 0
+             457:     27(int) SpecConstant 4294967291
+             458:     17(int) SpecConstant 4
+             459:    53(bool) SpecConstantTrue
+             460:    53(bool) SpecConstantOp 171 455 67
+             461:    53(bool) SpecConstantOp 171 456 67
+             462:     14(int) SpecConstantOp 169 459 59 58
+             463:     36(int) SpecConstantOp 169 459 68 67
+             464:     27(int) SpecConstantOp 114 455
+             465:     14(int) SpecConstantOp 114 457
+             466:     17(int) SpecConstantOp 113 456
+             467:     36(int) SpecConstantOp 113 458
+             468:     14(int) SpecConstantOp 128 456 67
+             469:     36(int) SpecConstantOp 128 455 67
+             470:     17(int) SpecConstantOp 113 456
+             471:     27(int) SpecConstantOp 128 470 217
+             472:     14(int) SpecConstantOp 114 457
+             473:     36(int) SpecConstantOp 128 472 67
+             474:     27(int) SpecConstantOp 114 455
+             475:     17(int) SpecConstantOp 128 474 217
+             476:     36(int) SpecConstantOp 113 458
+             477:     14(int) SpecConstantOp 128 476 67
          4(main):           2 Function None 3
                5:             Label
                               Return
index fb7c70a..edda4a7 100644 (file)
@@ -61,6 +61,7 @@ Linked vertex stage:
               38:             TypeFloat 64
               39:   38(float) SpecConstant 1413754136 1074340347
               40:    6(float) SpecConstant 1078523331
+              41:   38(float) SpecConstantOp 115 40
               50:      8(int) SpecConstant 12
               51:             TypeArray 7(fvec4) 50
               52:             TypePointer Input 51
@@ -69,6 +70,7 @@ Linked vertex stage:
               63:     33(int) SpecConstant 2
               67:   38(float) SpecConstant 1413754136 1074340347
               68:    6(float) SpecConstant 1078523331
+              69:   38(float) SpecConstantOp 115 68
               75:             TypePointer Function 8(int)
               77:      8(int) SpecConstant 8
          4(main):           2 Function None 3
@@ -87,7 +89,6 @@ Linked vertex stage:
                                 Store 20(color) 37
                                 Branch 32
               32:             Label
-              41:   38(float) FConvert 40
               42:   38(float) FDiv 39 41
               43:    6(float) FConvert 42
               44:    7(fvec4) Load 20(color)
@@ -119,7 +120,6 @@ Linked vertex stage:
                                 Store 20(color) 66
                                 Branch 62
               62:             Label
-              69:   38(float) FConvert 68
               70:   38(float) FDiv 67 69
               71:    6(float) FConvert 70
               72:    7(fvec4) Load 20(color)
index ea4c69a..ab42558 100644 (file)
@@ -7,9 +7,10 @@ Linked vertex stage:
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 131
+// Id's are bound by 135
 
                               Capability Shader
+                              Capability Float64
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Vertex 4  "main"
@@ -22,6 +23,7 @@ Linked vertex stage:
                               Decorate 40 SpecId 200
                               Decorate 42 SpecId 202
                               Decorate 43 SpecId 203
+                              Decorate 45 SpecId 204
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -43,93 +45,97 @@ Linked vertex stage:
               41:             TypeInt 32 0
               42:     41(int) SpecConstant 100
               43:      6(int) SpecConstant 4294967286
-              44:     41(int) Constant 0
-              45:    22(bool) SpecConstantOp 171 19 44
-              46:    22(bool) SpecConstantOp 171 42 44
-              47:      6(int) SpecConstantOp 169 45 32 12
-              48:     41(int) Constant 1
-              49:     41(int) SpecConstantOp 169 45 48 44
-              50:     41(int) SpecConstantOp 128 43 44
-              51:      6(int) SpecConstantOp 128 42 44
-              52:      6(int) SpecConstantOp 126 19
-              53:      6(int) SpecConstantOp 200 19
-              54:      6(int) SpecConstantOp 128 19 20
-              55:      6(int) SpecConstantOp 128 19 20
-              56:      6(int) Constant 3
-              57:      6(int) SpecConstantOp 130 55 56
-              58:      6(int) Constant 4
-              59:      6(int) SpecConstantOp 130 54 58
-              60:      6(int) SpecConstantOp 132 43 20
-              61:     41(int) Constant 2
-              62:     41(int) SpecConstantOp 132 42 61
-              63:      6(int) Constant 5
-              64:      6(int) SpecConstantOp 135 60 63
-              65:     41(int) Constant 5
-              66:     41(int) SpecConstantOp 134 62 65
-              67:      6(int) SpecConstantOp 139 43 58
-              68:     41(int) Constant 4
-              69:     41(int) SpecConstantOp 137 42 68
-              70:      6(int) SpecConstantOp 132 43 56
-              71:      6(int) SpecConstantOp 135 70 63
-              72:      6(int) Constant 10
-              73:      6(int) SpecConstantOp 195 43 72
-              74:      6(int) Constant 20
-              75:     41(int) SpecConstantOp 194 42 74
-              76:      6(int) SpecConstantOp 196 43 32
-              77:     41(int) SpecConstantOp 196 42 20
-              78:      6(int) Constant 256
-              79:      6(int) SpecConstantOp 197 43 78
-              80:     41(int) Constant 512
-              81:     41(int) SpecConstantOp 198 42 80
-              82:    22(bool) SpecConstantOp 177 19 43
-              83:    22(bool) SpecConstantOp 170 42 42
-              84:    22(bool) SpecConstantOp 173 19 43
-              85:      6(int) Constant 30
-              86:             TypeVector 6(int) 4
-              87:   86(ivec4) SpecConstantComposite 74 85 19 19
-              88:     41(int) Constant 4294967295
-              89:     41(int) Constant 4294967294
-              90:             TypeVector 41(int) 4
-              91:   90(ivec4) SpecConstantComposite 42 42 88 89
-              92:             TypeVector 22(bool) 4
-              93:   90(ivec4) ConstantComposite 44 44 44 44
-              94:   92(bvec4) SpecConstantOp 171 87 93
-              95:   92(bvec4) SpecConstantOp 171 91 93
-              96:   86(ivec4) ConstantComposite 12 12 12 12
-              97:   86(ivec4) ConstantComposite 32 32 32 32
-              98:   86(ivec4) SpecConstantOp 169 94 97 96
-              99:   90(ivec4) ConstantComposite 48 48 48 48
-             100:   90(ivec4) SpecConstantOp 169 94 99 93
-             101:   90(ivec4) SpecConstantOp 128 87 93
-             102:   86(ivec4) SpecConstantOp 128 91 93
-             103:   86(ivec4) SpecConstantOp 200 87
-             104:   86(ivec4) SpecConstantOp 126 87
-             105:   86(ivec4) ConstantComposite 20 20 20 20
-             106:   86(ivec4) SpecConstantOp 128 87 105
-             107:   86(ivec4) SpecConstantOp 128 87 105
-             108:   86(ivec4) ConstantComposite 56 56 56 56
-             109:   86(ivec4) SpecConstantOp 130 107 108
-             110:   86(ivec4) ConstantComposite 58 58 58 58
-             111:   86(ivec4) SpecConstantOp 130 109 110
-             112:   86(ivec4) SpecConstantOp 132 87 105
-             113:   86(ivec4) ConstantComposite 63 63 63 63
-             114:   86(ivec4) SpecConstantOp 135 112 113
-             115:   86(ivec4) SpecConstantOp 139 87 110
-             116:   86(ivec4) ConstantComposite 72 72 72 72
-             117:   86(ivec4) SpecConstantOp 195 87 116
-             118:   86(ivec4) SpecConstantOp 196 87 105
-             119:      6(int) Constant 1024
-             120:   86(ivec4) ConstantComposite 119 119 119 119
-             121:   86(ivec4) SpecConstantOp 197 87 120
-             122:     41(int) Constant 2048
-             123:   90(ivec4) ConstantComposite 122 122 122 122
-             124:   90(ivec4) SpecConstantOp 198 91 123
-             125:      6(int) SpecConstantOp 81 87 0
-             126:             TypeVector 6(int) 2
-             127:  126(ivec2) SpecConstantOp 79 87 87 1(GLSL.std.450) 0
-             128:             TypeVector 6(int) 3
-             129:  128(ivec3) SpecConstantOp 79 87 87 2 1(GLSL.std.450) 0
-             130:   86(ivec4) SpecConstantOp 79 87 87 1(GLSL.std.450) 2 0 3
+              44:             TypeFloat 64
+              45:   44(float) SpecConstant 2333366019 1074118410
+              46:   39(float) SpecConstantOp 115 45
+              47:   44(float) SpecConstantOp 115 40
+              48:     41(int) Constant 0
+              49:    22(bool) SpecConstantOp 171 19 48
+              50:    22(bool) SpecConstantOp 171 42 48
+              51:      6(int) SpecConstantOp 169 49 32 12
+              52:     41(int) Constant 1
+              53:     41(int) SpecConstantOp 169 49 52 48
+              54:     41(int) SpecConstantOp 128 43 48
+              55:      6(int) SpecConstantOp 128 42 48
+              56:      6(int) SpecConstantOp 126 19
+              57:      6(int) SpecConstantOp 200 19
+              58:      6(int) SpecConstantOp 128 19 20
+              59:      6(int) SpecConstantOp 128 19 20
+              60:      6(int) Constant 3
+              61:      6(int) SpecConstantOp 130 59 60
+              62:      6(int) Constant 4
+              63:      6(int) SpecConstantOp 130 58 62
+              64:      6(int) SpecConstantOp 132 43 20
+              65:     41(int) Constant 2
+              66:     41(int) SpecConstantOp 132 42 65
+              67:      6(int) Constant 5
+              68:      6(int) SpecConstantOp 135 64 67
+              69:     41(int) Constant 5
+              70:     41(int) SpecConstantOp 134 66 69
+              71:      6(int) SpecConstantOp 139 43 62
+              72:     41(int) Constant 4
+              73:     41(int) SpecConstantOp 137 42 72
+              74:      6(int) SpecConstantOp 132 43 60
+              75:      6(int) SpecConstantOp 135 74 67
+              76:      6(int) Constant 10
+              77:      6(int) SpecConstantOp 195 43 76
+              78:      6(int) Constant 20
+              79:     41(int) SpecConstantOp 194 42 78
+              80:      6(int) SpecConstantOp 196 43 32
+              81:     41(int) SpecConstantOp 196 42 20
+              82:      6(int) Constant 256
+              83:      6(int) SpecConstantOp 197 43 82
+              84:     41(int) Constant 512
+              85:     41(int) SpecConstantOp 198 42 84
+              86:    22(bool) SpecConstantOp 177 19 43
+              87:    22(bool) SpecConstantOp 170 42 42
+              88:    22(bool) SpecConstantOp 173 19 43
+              89:      6(int) Constant 30
+              90:             TypeVector 6(int) 4
+              91:   90(ivec4) SpecConstantComposite 78 89 19 19
+              92:     41(int) Constant 4294967295
+              93:     41(int) Constant 4294967294
+              94:             TypeVector 41(int) 4
+              95:   94(ivec4) SpecConstantComposite 42 42 92 93
+              96:             TypeVector 22(bool) 4
+              97:   94(ivec4) ConstantComposite 48 48 48 48
+              98:   96(bvec4) SpecConstantOp 171 91 97
+              99:   96(bvec4) SpecConstantOp 171 95 97
+             100:   90(ivec4) ConstantComposite 12 12 12 12
+             101:   90(ivec4) ConstantComposite 32 32 32 32
+             102:   90(ivec4) SpecConstantOp 169 98 101 100
+             103:   94(ivec4) ConstantComposite 52 52 52 52
+             104:   94(ivec4) SpecConstantOp 169 98 103 97
+             105:   94(ivec4) SpecConstantOp 128 91 97
+             106:   90(ivec4) SpecConstantOp 128 95 97
+             107:   90(ivec4) SpecConstantOp 200 91
+             108:   90(ivec4) SpecConstantOp 126 91
+             109:   90(ivec4) ConstantComposite 20 20 20 20
+             110:   90(ivec4) SpecConstantOp 128 91 109
+             111:   90(ivec4) SpecConstantOp 128 91 109
+             112:   90(ivec4) ConstantComposite 60 60 60 60
+             113:   90(ivec4) SpecConstantOp 130 111 112
+             114:   90(ivec4) ConstantComposite 62 62 62 62
+             115:   90(ivec4) SpecConstantOp 130 113 114
+             116:   90(ivec4) SpecConstantOp 132 91 109
+             117:   90(ivec4) ConstantComposite 67 67 67 67
+             118:   90(ivec4) SpecConstantOp 135 116 117
+             119:   90(ivec4) SpecConstantOp 139 91 114
+             120:   90(ivec4) ConstantComposite 76 76 76 76
+             121:   90(ivec4) SpecConstantOp 195 91 120
+             122:   90(ivec4) SpecConstantOp 196 91 109
+             123:      6(int) Constant 1024
+             124:   90(ivec4) ConstantComposite 123 123 123 123
+             125:   90(ivec4) SpecConstantOp 197 91 124
+             126:     41(int) Constant 2048
+             127:   94(ivec4) ConstantComposite 126 126 126 126
+             128:   94(ivec4) SpecConstantOp 198 95 127
+             129:      6(int) SpecConstantOp 81 91 0
+             130:             TypeVector 6(int) 2
+             131:  130(ivec2) SpecConstantOp 79 91 91 1(GLSL.std.450) 0
+             132:             TypeVector 6(int) 3
+             133:  132(ivec3) SpecConstantOp 79 91 91 2 1(GLSL.std.450) 0
+             134:   90(ivec4) SpecConstantOp 79 91 91 1(GLSL.std.450) 2 0 3
          4(main):           2 Function None 3
                5:             Label
                               Return
index 527bfef..c21ce35 100644 (file)
@@ -225,4 +225,37 @@ void builtinFuncs()
     // notEqual()\r
     bv    = notEqual(u64v, u64vec3(u64));\r
     bv.xy = notEqual(i64v, i64vec2(i64));\r
-}
\ No newline at end of file
+}\r
+\r
+// Type conversion for specialization constant\r
+layout(constant_id = 100) const int64_t  si64 = -10L;\r
+layout(constant_id = 101) const uint64_t su64 = 20UL;\r
+layout(constant_id = 102) const int  si = -5;\r
+layout(constant_id = 103) const uint su = 4;\r
+layout(constant_id = 104) const bool sb = true;\r
+\r
+// bool <-> int64/uint64\r
+const bool i64_to_b = bool(si64);\r
+const bool u64_to_b = bool(su64);\r
+const int64_t  b_to_i64 = int64_t(sb);\r
+const uint64_t b_to_u64 = uint64_t(sb);\r
+\r
+// int <-> int64\r
+const int     i64_to_i = int(si64);\r
+const int64_t i_to_i64 = int64_t(si);\r
+\r
+// uint <-> uint64\r
+const uint     u64_to_u = uint(su64);\r
+const uint64_t u_to_u64 = uint64_t(su);\r
+\r
+// int64 <-> uint64\r
+const int64_t  u64_to_i64 = int64_t(su64);\r
+const uint64_t i64_to_u64 = uint64_t(si64);\r
+\r
+// int <-> uint64\r
+const int      u64_to_i = int(su64);\r
+const uint64_t i_to_u64 = uint64_t(si);\r
+\r
+// uint <-> int64\r
+const uint    i64_to_u = uint(si64);\r
+const int64_t u_to_i64 = int64_t(su);
\ No newline at end of file
index b5e46ad..f67561c 100644 (file)
@@ -4,12 +4,16 @@ layout(constant_id = 200) const float sp_float = 3.1415926;
 layout(constant_id = 201) const int sp_int = 10;
 layout(constant_id = 202) const uint sp_uint = 100;
 layout(constant_id = 203) const int sp_sint = -10;
-
+layout(constant_id = 204) const double sp_double = 2.718281828459;
 
 //
 // Scalars
 //
 
+// float <-> double conversion
+const float float_from_double = float(sp_double);
+const double double_from_float = double(sp_float);
+
 // uint/int <-> bool conversion
 const bool bool_from_int = bool(sp_int);
 const bool bool_from_uint = bool(sp_uint);
index 676cf17..677cef3 100644 (file)
@@ -1444,6 +1444,8 @@ bool TIntermediate::isSpecializationOperation(const TIntermOperator& node) const
         case EOpIndexIndirect:
         case EOpIndexDirectStruct:
         case EOpVectorSwizzle:
+        case EOpConvFloatToDouble:
+        case EOpConvDoubleToFloat:
             return true;
         default:
             return false;
@@ -1474,6 +1476,20 @@ bool TIntermediate::isSpecializationOperation(const TIntermOperator& node) const
     case EOpConvBoolToInt:
     case EOpConvIntToUint:
     case EOpConvBoolToUint:
+    case EOpConvInt64ToBool:
+    case EOpConvBoolToInt64:
+    case EOpConvUint64ToBool:
+    case EOpConvBoolToUint64:
+    case EOpConvInt64ToInt:
+    case EOpConvIntToInt64:
+    case EOpConvUint64ToUint:
+    case EOpConvUintToUint64:
+    case EOpConvInt64ToUint64:
+    case EOpConvUint64ToInt64:
+    case EOpConvInt64ToUint:
+    case EOpConvUintToInt64:
+    case EOpConvUint64ToInt:
+    case EOpConvIntToUint64:
 
     // unary operations
     case EOpNegative:
index efb1baf..297ae15 100644 (file)
@@ -4942,7 +4942,7 @@ const TFunction* TParseContext::findFunction120(const TSourceLoc& loc, const TFu
 // "When function calls are resolved, an exact type match for all the arguments
 // is sought. If an exact match is found, all other functions are ignored, and
 // the exact match is used. If no exact match is found, then the implicit
-// conversions in section 4.1.10 \93Implicit Conversions\94 will be applied to find
+// conversions in section 4.1.10 Implicit Conversions will be applied to find
 // a match. Mismatched types on input parameters (in or inout or default) must
 // have a conversion from the calling argument type to the formal parameter type.
 // Mismatched types on output parameters (out or inout) must have a conversion