From: Rex Xu Date: Mon, 5 Sep 2016 08:10:14 +0000 (+0800) Subject: Parser: Add 64-bit type conversion for specialization constant. X-Git-Tag: upstream/11.4.0~1523^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=64bcfdb63293f1b193e7c54658df96ca7033608e;p=platform%2Fupstream%2Fglslang.git Parser: Add 64-bit type conversion for specialization constant. --- diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 84c9e73..c559142 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -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. diff --git a/Test/baseResults/spv.int64.frag.out b/Test/baseResults/spv.int64.frag.out index fe45013..b7d8ce9 100644 --- a/Test/baseResults/spv.int64.frag.out +++ b/Test/baseResults/spv.int64.frag.out @@ -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 diff --git a/Test/baseResults/spv.specConstant.vert.out b/Test/baseResults/spv.specConstant.vert.out index fb7c70a..edda4a7 100644 --- a/Test/baseResults/spv.specConstant.vert.out +++ b/Test/baseResults/spv.specConstant.vert.out @@ -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) diff --git a/Test/baseResults/spv.specConstantOperations.vert.out b/Test/baseResults/spv.specConstantOperations.vert.out index ea4c69a..ab42558 100644 --- a/Test/baseResults/spv.specConstantOperations.vert.out +++ b/Test/baseResults/spv.specConstantOperations.vert.out @@ -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 diff --git a/Test/spv.int64.frag b/Test/spv.int64.frag index 527bfef..c21ce35 100644 --- a/Test/spv.int64.frag +++ b/Test/spv.int64.frag @@ -225,4 +225,37 @@ void builtinFuncs() // notEqual() bv = notEqual(u64v, u64vec3(u64)); bv.xy = notEqual(i64v, i64vec2(i64)); -} \ No newline at end of file +} + +// Type conversion for specialization constant +layout(constant_id = 100) const int64_t si64 = -10L; +layout(constant_id = 101) const uint64_t su64 = 20UL; +layout(constant_id = 102) const int si = -5; +layout(constant_id = 103) const uint su = 4; +layout(constant_id = 104) const bool sb = true; + +// bool <-> int64/uint64 +const bool i64_to_b = bool(si64); +const bool u64_to_b = bool(su64); +const int64_t b_to_i64 = int64_t(sb); +const uint64_t b_to_u64 = uint64_t(sb); + +// int <-> int64 +const int i64_to_i = int(si64); +const int64_t i_to_i64 = int64_t(si); + +// uint <-> uint64 +const uint u64_to_u = uint(su64); +const uint64_t u_to_u64 = uint64_t(su); + +// int64 <-> uint64 +const int64_t u64_to_i64 = int64_t(su64); +const uint64_t i64_to_u64 = uint64_t(si64); + +// int <-> uint64 +const int u64_to_i = int(su64); +const uint64_t i_to_u64 = uint64_t(si); + +// uint <-> int64 +const uint i64_to_u = uint(si64); +const int64_t u_to_i64 = int64_t(su); \ No newline at end of file diff --git a/Test/spv.specConstantOperations.vert b/Test/spv.specConstantOperations.vert index b5e46ad..f67561c 100644 --- a/Test/spv.specConstantOperations.vert +++ b/Test/spv.specConstantOperations.vert @@ -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); diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index 676cf17..677cef3 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -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: diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index efb1baf..297ae15 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -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 “Implicit Conversions” 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