From: Rex Xu Date: Wed, 29 Mar 2017 09:12:40 +0000 (+0800) Subject: HLSL: Fix an issue of frexp(). X-Git-Tag: upstream/11.4.0~1235^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=470026f9d7fbd88d6bf8c8bcfbe24d5540cb6e36;p=platform%2Fupstream%2Fglslang.git HLSL: Fix an issue of frexp(). The "exp" parameter is floating-point type in HLSL intrinsic while it is integer type in GLSL built-in function. --- diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index d30432e..a14b2bb 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -4609,6 +4609,9 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: spv::Id typeId0 = 0; if (consumedOperands > 0) typeId0 = builder.getTypeId(operands[0]); + spv::Id typeId1 = 0; + if (consumedOperands > 1) + typeId1 = builder.getTypeId(operands[1]); spv::Id frexpIntType = 0; switch (op) { @@ -4730,13 +4733,22 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: libCall = spv::GLSLstd450Fma; break; case glslang::EOpFrexp: - libCall = spv::GLSLstd450FrexpStruct; - if (builder.getNumComponents(operands[0]) == 1) - frexpIntType = builder.makeIntegerType(32, true); - else - frexpIntType = builder.makeVectorType(builder.makeIntegerType(32, true), builder.getNumComponents(operands[0])); - typeId = builder.makeStructResultType(typeId0, frexpIntType); - consumedOperands = 1; + { + libCall = spv::GLSLstd450FrexpStruct; + assert(builder.isPointerType(typeId1)); + typeId1 = builder.getContainedTypeId(typeId1); +#ifdef AMD_EXTENSIONS + int width = builder.getScalarTypeWidth(typeId1); +#else + int width = 32; +#endif + if (builder.getNumComponents(operands[0]) == 1) + frexpIntType = builder.makeIntegerType(width, true); + else + frexpIntType = builder.makeVectorType(builder.makeIntegerType(width, true), builder.getNumComponents(operands[0])); + typeId = builder.makeStructResultType(typeId0, frexpIntType); + consumedOperands = 1; + } break; case glslang::EOpLdexp: libCall = spv::GLSLstd450Ldexp; @@ -4844,9 +4856,18 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: builder.createStore(builder.createCompositeExtract(id, typeId0, 1), operands[2]); break; case glslang::EOpFrexp: - assert(operands.size() == 2); - builder.createStore(builder.createCompositeExtract(id, frexpIntType, 1), operands[1]); - id = builder.createCompositeExtract(id, typeId0, 0); + { + assert(operands.size() == 2); + if (builder.isFloatType(builder.getScalarTypeId(typeId1))) { + // "exp" is floating-point type (from HLSL intrinsic) + spv::Id member1 = builder.createCompositeExtract(id, frexpIntType, 1); + member1 = builder.createUnaryOp(spv::OpConvertSToF, typeId1, member1); + builder.createStore(member1, operands[1]); + } else + // "exp" is integer type (from GLSL built-in function) + builder.createStore(builder.createCompositeExtract(id, frexpIntType, 1), operands[1]); + id = builder.createCompositeExtract(id, typeId0, 0); + } break; default: break; diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h index 204d3e7..d93174e 100755 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -134,6 +134,9 @@ public: bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); } bool isBoolType(Id typeId) const { return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); } + bool isIntType(Id typeId) const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) != 0; } + bool isUintType(Id typeId) const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) == 0; } + bool isFloatType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat; } bool isPointerType(Id typeId) const { return getTypeClass(typeId) == OpTypePointer; } bool isScalarType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat || getTypeClass(typeId) == OpTypeInt || getTypeClass(typeId) == OpTypeBool; } bool isVectorType(Id typeId) const { return getTypeClass(typeId) == OpTypeVector; } @@ -153,6 +156,13 @@ public: unsigned int getConstantScalar(Id resultId) const { return module.getInstruction(resultId)->getImmediateOperand(0); } StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); } + int getScalarTypeWidth(Id typeId) const + { + Id scalarTypeId = getScalarTypeId(typeId); + assert(getTypeClass(scalarTypeId) == OpTypeInt || getTypeClass(scalarTypeId) == OpTypeFloat); + return module.getInstruction(scalarTypeId)->getImmediateOperand(0); + } + int getTypeNumColumns(Id typeId) const { assert(isMatrixType(typeId)); diff --git a/Test/baseResults/hlsl.intrinsic.frexp.frag.out b/Test/baseResults/hlsl.intrinsic.frexp.frag.out index 971a34e..fc827f8 100644 --- a/Test/baseResults/hlsl.intrinsic.frexp.frag.out +++ b/Test/baseResults/hlsl.intrinsic.frexp.frag.out @@ -191,12 +191,12 @@ gl_FragCoord origin is upper left // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 94 +// Id's are bound by 98 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 91 + EntryPoint Fragment 4 "main" 95 ExecutionMode 4 OriginUpperLeft Name 4 "main" Name 11 "PixelShaderFunctionS(f1;f1;" @@ -216,15 +216,15 @@ gl_FragCoord origin is upper left Name 36 "@main(" Name 38 "r000" Name 41 "ResType" - Name 48 "r000" - Name 51 "ResType" - Name 60 "r000" - Name 63 "ResType" - Name 71 "r000" - Name 74 "ResType" - Name 83 "ps_output" - Name 91 "color" - Decorate 91(color) Location 0 + Name 49 "r000" + Name 52 "ResType" + Name 62 "r000" + Name 65 "ResType" + Name 74 "r000" + Name 77 "ResType" + Name 87 "ps_output" + Name 95 "color" + Decorate 95(color) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -243,30 +243,30 @@ gl_FragCoord origin is upper left 35: TypeFunction 34(PS_OUTPUT) 40: TypeInt 32 1 41(ResType): TypeStruct 6(float) 40(int) - 45: 6(float) Constant 0 - 50: TypeVector 40(int) 2 - 51(ResType): TypeStruct 13(fvec2) 50(ivec2) - 55: 6(float) Constant 1065353216 - 56: 6(float) Constant 1073741824 - 57: 13(fvec2) ConstantComposite 55 56 - 62: TypeVector 40(int) 3 - 63(ResType): TypeStruct 20(fvec3) 62(ivec3) - 67: 6(float) Constant 1077936128 - 68: 20(fvec3) ConstantComposite 55 56 67 - 73: TypeVector 40(int) 4 - 74(ResType): TypeStruct 27(fvec4) 73(ivec4) - 78: 6(float) Constant 1082130432 - 79: 27(fvec4) ConstantComposite 55 56 67 78 - 82: TypePointer Function 34(PS_OUTPUT) - 84: 40(int) Constant 0 - 85: 27(fvec4) ConstantComposite 55 55 55 55 - 90: TypePointer Output 27(fvec4) - 91(color): 90(ptr) Variable Output + 46: 6(float) Constant 0 + 51: TypeVector 40(int) 2 + 52(ResType): TypeStruct 13(fvec2) 51(ivec2) + 57: 6(float) Constant 1065353216 + 58: 6(float) Constant 1073741824 + 59: 13(fvec2) ConstantComposite 57 58 + 64: TypeVector 40(int) 3 + 65(ResType): TypeStruct 20(fvec3) 64(ivec3) + 70: 6(float) Constant 1077936128 + 71: 20(fvec3) ConstantComposite 57 58 70 + 76: TypeVector 40(int) 4 + 77(ResType): TypeStruct 27(fvec4) 76(ivec4) + 82: 6(float) Constant 1082130432 + 83: 27(fvec4) ConstantComposite 57 58 70 82 + 86: TypePointer Function 34(PS_OUTPUT) + 88: 40(int) Constant 0 + 89: 27(fvec4) ConstantComposite 57 57 57 57 + 94: TypePointer Output 27(fvec4) + 95(color): 94(ptr) Variable Output 4(main): 2 Function None 3 5: Label - 92:34(PS_OUTPUT) FunctionCall 36(@main() - 93: 27(fvec4) CompositeExtract 92 0 - Store 91(color) 93 + 96:34(PS_OUTPUT) FunctionCall 36(@main() + 97: 27(fvec4) CompositeExtract 96 0 + Store 95(color) 97 Return FunctionEnd 11(PixelShaderFunctionS(f1;f1;): 6(float) Function None 8 @@ -277,55 +277,59 @@ gl_FragCoord origin is upper left 39: 6(float) Load 9(inF0) 42: 41(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 39 43: 40(int) CompositeExtract 42 1 - Store 10(inF1) 43 - 44: 6(float) CompositeExtract 42 0 - Store 38(r000) 44 - ReturnValue 45 + 44: 6(float) ConvertSToF 43 + Store 10(inF1) 44 + 45: 6(float) CompositeExtract 42 0 + Store 38(r000) 45 + ReturnValue 46 FunctionEnd 18(PixelShaderFunction2(vf2;vf2;): 13(fvec2) Function None 15 16(inF0): 14(ptr) FunctionParameter 17(inF1): 14(ptr) FunctionParameter 19: Label - 48(r000): 14(ptr) Variable Function - 49: 13(fvec2) Load 16(inF0) - 52: 51(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 49 - 53: 50(ivec2) CompositeExtract 52 1 - Store 17(inF1) 53 - 54: 13(fvec2) CompositeExtract 52 0 - Store 48(r000) 54 - ReturnValue 57 + 49(r000): 14(ptr) Variable Function + 50: 13(fvec2) Load 16(inF0) + 53: 52(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 50 + 54: 51(ivec2) CompositeExtract 53 1 + 55: 13(fvec2) ConvertSToF 54 + Store 17(inF1) 55 + 56: 13(fvec2) CompositeExtract 53 0 + Store 49(r000) 56 + ReturnValue 59 FunctionEnd 25(PixelShaderFunction3(vf3;vf3;): 20(fvec3) Function None 22 23(inF0): 21(ptr) FunctionParameter 24(inF1): 21(ptr) FunctionParameter 26: Label - 60(r000): 21(ptr) Variable Function - 61: 20(fvec3) Load 23(inF0) - 64: 63(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 61 - 65: 62(ivec3) CompositeExtract 64 1 - Store 24(inF1) 65 - 66: 20(fvec3) CompositeExtract 64 0 - Store 60(r000) 66 - ReturnValue 68 + 62(r000): 21(ptr) Variable Function + 63: 20(fvec3) Load 23(inF0) + 66: 65(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 63 + 67: 64(ivec3) CompositeExtract 66 1 + 68: 20(fvec3) ConvertSToF 67 + Store 24(inF1) 68 + 69: 20(fvec3) CompositeExtract 66 0 + Store 62(r000) 69 + ReturnValue 71 FunctionEnd 32(PixelShaderFunction(vf4;vf4;): 27(fvec4) Function None 29 30(inF0): 28(ptr) FunctionParameter 31(inF1): 28(ptr) FunctionParameter 33: Label - 71(r000): 28(ptr) Variable Function - 72: 27(fvec4) Load 30(inF0) - 75: 74(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 72 - 76: 73(ivec4) CompositeExtract 75 1 - Store 31(inF1) 76 - 77: 27(fvec4) CompositeExtract 75 0 - Store 71(r000) 77 - ReturnValue 79 + 74(r000): 28(ptr) Variable Function + 75: 27(fvec4) Load 30(inF0) + 78: 77(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 75 + 79: 76(ivec4) CompositeExtract 78 1 + 80: 27(fvec4) ConvertSToF 79 + Store 31(inF1) 80 + 81: 27(fvec4) CompositeExtract 78 0 + Store 74(r000) 81 + ReturnValue 83 FunctionEnd 36(@main():34(PS_OUTPUT) Function None 35 37: Label - 83(ps_output): 82(ptr) Variable Function - 86: 28(ptr) AccessChain 83(ps_output) 84 - Store 86 85 - 87:34(PS_OUTPUT) Load 83(ps_output) - ReturnValue 87 + 87(ps_output): 86(ptr) Variable Function + 90: 28(ptr) AccessChain 87(ps_output) 88 + Store 90 89 + 91:34(PS_OUTPUT) Load 87(ps_output) + ReturnValue 91 FunctionEnd diff --git a/Test/baseResults/hlsl.intrinsic.frexp.vert.out b/Test/baseResults/hlsl.intrinsic.frexp.vert.out index b1df12d..4931b93 100644 --- a/Test/baseResults/hlsl.intrinsic.frexp.vert.out +++ b/Test/baseResults/hlsl.intrinsic.frexp.vert.out @@ -114,7 +114,7 @@ Shader version: 450 // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 74 +// Id's are bound by 78 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -134,9 +134,9 @@ Shader version: 450 Name 30 "inF0" Name 31 "inF1" Name 36 "ResType" - Name 45 "ResType" - Name 56 "ResType" - Name 66 "ResType" + Name 46 "ResType" + Name 58 "ResType" + Name 69 "ResType" 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -153,20 +153,20 @@ Shader version: 450 29: TypeFunction 27(fvec4) 28(ptr) 28(ptr) 35: TypeInt 32 1 36(ResType): TypeStruct 6(float) 35(int) - 40: 6(float) Constant 0 - 44: TypeVector 35(int) 2 - 45(ResType): TypeStruct 13(fvec2) 44(ivec2) - 49: 6(float) Constant 1065353216 - 50: 6(float) Constant 1073741824 - 51: 13(fvec2) ConstantComposite 49 50 - 55: TypeVector 35(int) 3 - 56(ResType): TypeStruct 20(fvec3) 55(ivec3) - 60: 6(float) Constant 1077936128 - 61: 20(fvec3) ConstantComposite 49 50 60 - 65: TypeVector 35(int) 4 - 66(ResType): TypeStruct 27(fvec4) 65(ivec4) - 70: 6(float) Constant 1082130432 - 71: 27(fvec4) ConstantComposite 49 50 60 70 + 41: 6(float) Constant 0 + 45: TypeVector 35(int) 2 + 46(ResType): TypeStruct 13(fvec2) 45(ivec2) + 51: 6(float) Constant 1065353216 + 52: 6(float) Constant 1073741824 + 53: 13(fvec2) ConstantComposite 51 52 + 57: TypeVector 35(int) 3 + 58(ResType): TypeStruct 20(fvec3) 57(ivec3) + 63: 6(float) Constant 1077936128 + 64: 20(fvec3) ConstantComposite 51 52 63 + 68: TypeVector 35(int) 4 + 69(ResType): TypeStruct 27(fvec4) 68(ivec4) + 74: 6(float) Constant 1082130432 + 75: 27(fvec4) ConstantComposite 51 52 63 74 4(VertexShaderFunction): 2 Function None 3 5: Label Return @@ -178,40 +178,44 @@ Shader version: 450 34: 6(float) Load 9(inF0) 37: 36(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 34 38: 35(int) CompositeExtract 37 1 - Store 10(inF1) 38 - 39: 6(float) CompositeExtract 37 0 - ReturnValue 40 + 39: 6(float) ConvertSToF 38 + Store 10(inF1) 39 + 40: 6(float) CompositeExtract 37 0 + ReturnValue 41 FunctionEnd 18(VertexShaderFunction2(vf2;vf2;): 13(fvec2) Function None 15 16(inF0): 14(ptr) FunctionParameter 17(inF1): 14(ptr) FunctionParameter 19: Label - 43: 13(fvec2) Load 16(inF0) - 46: 45(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 43 - 47: 44(ivec2) CompositeExtract 46 1 - Store 17(inF1) 47 - 48: 13(fvec2) CompositeExtract 46 0 - ReturnValue 51 + 44: 13(fvec2) Load 16(inF0) + 47: 46(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 44 + 48: 45(ivec2) CompositeExtract 47 1 + 49: 13(fvec2) ConvertSToF 48 + Store 17(inF1) 49 + 50: 13(fvec2) CompositeExtract 47 0 + ReturnValue 53 FunctionEnd 25(VertexShaderFunction3(vf3;vf3;): 20(fvec3) Function None 22 23(inF0): 21(ptr) FunctionParameter 24(inF1): 21(ptr) FunctionParameter 26: Label - 54: 20(fvec3) Load 23(inF0) - 57: 56(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 54 - 58: 55(ivec3) CompositeExtract 57 1 - Store 24(inF1) 58 - 59: 20(fvec3) CompositeExtract 57 0 - ReturnValue 61 + 56: 20(fvec3) Load 23(inF0) + 59: 58(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 56 + 60: 57(ivec3) CompositeExtract 59 1 + 61: 20(fvec3) ConvertSToF 60 + Store 24(inF1) 61 + 62: 20(fvec3) CompositeExtract 59 0 + ReturnValue 64 FunctionEnd 32(VertexShaderFunction4(vf4;vf4;): 27(fvec4) Function None 29 30(inF0): 28(ptr) FunctionParameter 31(inF1): 28(ptr) FunctionParameter 33: Label - 64: 27(fvec4) Load 30(inF0) - 67: 66(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 64 - 68: 65(ivec4) CompositeExtract 67 1 - Store 31(inF1) 68 - 69: 27(fvec4) CompositeExtract 67 0 - ReturnValue 71 + 67: 27(fvec4) Load 30(inF0) + 70: 69(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 67 + 71: 68(ivec4) CompositeExtract 70 1 + 72: 27(fvec4) ConvertSToF 71 + Store 31(inF1) 72 + 73: 27(fvec4) CompositeExtract 70 0 + ReturnValue 75 FunctionEnd