Merge pull request #817 from steve-lunarg/isfinite
HLSL: Decompose OpIsFinite to avoid capability restrictions
This commit is contained in:
		
						commit
						5ce1e4aff8
					
				
							
								
								
									
										140
									
								
								Test/baseResults/hlsl.isfinite.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								Test/baseResults/hlsl.isfinite.frag.out
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,140 @@
 | 
				
			|||||||
 | 
					hlsl.isfinite.frag
 | 
				
			||||||
 | 
					Shader version: 450
 | 
				
			||||||
 | 
					gl_FragCoord origin is upper left
 | 
				
			||||||
 | 
					0:? Sequence
 | 
				
			||||||
 | 
					0:5  Function Definition: @main( ( temp 4-component vector of float)
 | 
				
			||||||
 | 
					0:5    Function Parameters: 
 | 
				
			||||||
 | 
					0:?     Sequence
 | 
				
			||||||
 | 
					0:6      Sequence
 | 
				
			||||||
 | 
					0:6        move second child to first child ( temp float)
 | 
				
			||||||
 | 
					0:6          '@finitetmp' ( temp float)
 | 
				
			||||||
 | 
					0:6          f: direct index for structure ( uniform float)
 | 
				
			||||||
 | 
					0:6            'anon@0' (layout( row_major std140) uniform block{ uniform float f})
 | 
				
			||||||
 | 
					0:6            Constant:
 | 
				
			||||||
 | 
					0:6              0 (const uint)
 | 
				
			||||||
 | 
					0:6        logical-and ( temp bool)
 | 
				
			||||||
 | 
					0:6          Negate conditional ( temp bool)
 | 
				
			||||||
 | 
					0:6            isnan ( temp bool)
 | 
				
			||||||
 | 
					0:6              '@finitetmp' ( temp float)
 | 
				
			||||||
 | 
					0:6          Negate conditional ( temp bool)
 | 
				
			||||||
 | 
					0:6            isinf ( temp bool)
 | 
				
			||||||
 | 
					0:6              '@finitetmp' ( temp float)
 | 
				
			||||||
 | 
					0:8      Branch: Return with expression
 | 
				
			||||||
 | 
					0:8        Constant:
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:5  Function Definition: main( ( temp void)
 | 
				
			||||||
 | 
					0:5    Function Parameters: 
 | 
				
			||||||
 | 
					0:?     Sequence
 | 
				
			||||||
 | 
					0:5      move second child to first child ( temp 4-component vector of float)
 | 
				
			||||||
 | 
					0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 | 
				
			||||||
 | 
					0:5        Function Call: @main( ( temp 4-component vector of float)
 | 
				
			||||||
 | 
					0:?   Linker Objects
 | 
				
			||||||
 | 
					0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float f})
 | 
				
			||||||
 | 
					0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Linked fragment stage:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Shader version: 450
 | 
				
			||||||
 | 
					gl_FragCoord origin is upper left
 | 
				
			||||||
 | 
					0:? Sequence
 | 
				
			||||||
 | 
					0:5  Function Definition: @main( ( temp 4-component vector of float)
 | 
				
			||||||
 | 
					0:5    Function Parameters: 
 | 
				
			||||||
 | 
					0:?     Sequence
 | 
				
			||||||
 | 
					0:6      Sequence
 | 
				
			||||||
 | 
					0:6        move second child to first child ( temp float)
 | 
				
			||||||
 | 
					0:6          '@finitetmp' ( temp float)
 | 
				
			||||||
 | 
					0:6          f: direct index for structure ( uniform float)
 | 
				
			||||||
 | 
					0:6            'anon@0' (layout( row_major std140) uniform block{ uniform float f})
 | 
				
			||||||
 | 
					0:6            Constant:
 | 
				
			||||||
 | 
					0:6              0 (const uint)
 | 
				
			||||||
 | 
					0:6        logical-and ( temp bool)
 | 
				
			||||||
 | 
					0:6          Negate conditional ( temp bool)
 | 
				
			||||||
 | 
					0:6            isnan ( temp bool)
 | 
				
			||||||
 | 
					0:6              '@finitetmp' ( temp float)
 | 
				
			||||||
 | 
					0:6          Negate conditional ( temp bool)
 | 
				
			||||||
 | 
					0:6            isinf ( temp bool)
 | 
				
			||||||
 | 
					0:6              '@finitetmp' ( temp float)
 | 
				
			||||||
 | 
					0:8      Branch: Return with expression
 | 
				
			||||||
 | 
					0:8        Constant:
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:8          0.000000
 | 
				
			||||||
 | 
					0:5  Function Definition: main( ( temp void)
 | 
				
			||||||
 | 
					0:5    Function Parameters: 
 | 
				
			||||||
 | 
					0:?     Sequence
 | 
				
			||||||
 | 
					0:5      move second child to first child ( temp 4-component vector of float)
 | 
				
			||||||
 | 
					0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 | 
				
			||||||
 | 
					0:5        Function Call: @main( ( temp 4-component vector of float)
 | 
				
			||||||
 | 
					0:?   Linker Objects
 | 
				
			||||||
 | 
					0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float f})
 | 
				
			||||||
 | 
					0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Module Version 10000
 | 
				
			||||||
 | 
					// Generated by (magic number): 80001
 | 
				
			||||||
 | 
					// Id's are bound by 38
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                              Capability Shader
 | 
				
			||||||
 | 
					               1:             ExtInstImport  "GLSL.std.450"
 | 
				
			||||||
 | 
					                              MemoryModel Logical GLSL450
 | 
				
			||||||
 | 
					                              EntryPoint Fragment 4  "main" 36
 | 
				
			||||||
 | 
					                              ExecutionMode 4 OriginUpperLeft
 | 
				
			||||||
 | 
					                              Name 4  "main"
 | 
				
			||||||
 | 
					                              Name 9  "@main("
 | 
				
			||||||
 | 
					                              Name 12  "@finitetmp"
 | 
				
			||||||
 | 
					                              Name 13  "$Global"
 | 
				
			||||||
 | 
					                              MemberName 13($Global) 0  "f"
 | 
				
			||||||
 | 
					                              Name 15  ""
 | 
				
			||||||
 | 
					                              Name 36  "@entryPointOutput"
 | 
				
			||||||
 | 
					                              MemberDecorate 13($Global) 0 Offset 0
 | 
				
			||||||
 | 
					                              Decorate 13($Global) Block
 | 
				
			||||||
 | 
					                              Decorate 15 DescriptorSet 0
 | 
				
			||||||
 | 
					                              Decorate 36(@entryPointOutput) Location 0
 | 
				
			||||||
 | 
					               2:             TypeVoid
 | 
				
			||||||
 | 
					               3:             TypeFunction 2
 | 
				
			||||||
 | 
					               6:             TypeFloat 32
 | 
				
			||||||
 | 
					               7:             TypeVector 6(float) 4
 | 
				
			||||||
 | 
					               8:             TypeFunction 7(fvec4)
 | 
				
			||||||
 | 
					              11:             TypePointer Function 6(float)
 | 
				
			||||||
 | 
					     13($Global):             TypeStruct 6(float)
 | 
				
			||||||
 | 
					              14:             TypePointer Uniform 13($Global)
 | 
				
			||||||
 | 
					              15:     14(ptr) Variable Uniform
 | 
				
			||||||
 | 
					              16:             TypeInt 32 1
 | 
				
			||||||
 | 
					              17:     16(int) Constant 0
 | 
				
			||||||
 | 
					              18:             TypePointer Uniform 6(float)
 | 
				
			||||||
 | 
					              21:             TypeBool
 | 
				
			||||||
 | 
					              31:    6(float) Constant 0
 | 
				
			||||||
 | 
					              32:    7(fvec4) ConstantComposite 31 31 31 31
 | 
				
			||||||
 | 
					              35:             TypePointer Output 7(fvec4)
 | 
				
			||||||
 | 
					36(@entryPointOutput):     35(ptr) Variable Output
 | 
				
			||||||
 | 
					         4(main):           2 Function None 3
 | 
				
			||||||
 | 
					               5:             Label
 | 
				
			||||||
 | 
					              37:    7(fvec4) FunctionCall 9(@main()
 | 
				
			||||||
 | 
					                              Store 36(@entryPointOutput) 37
 | 
				
			||||||
 | 
					                              Return
 | 
				
			||||||
 | 
					                              FunctionEnd
 | 
				
			||||||
 | 
					       9(@main():    7(fvec4) Function None 8
 | 
				
			||||||
 | 
					              10:             Label
 | 
				
			||||||
 | 
					  12(@finitetmp):     11(ptr) Variable Function
 | 
				
			||||||
 | 
					              19:     18(ptr) AccessChain 15 17
 | 
				
			||||||
 | 
					              20:    6(float) Load 19
 | 
				
			||||||
 | 
					                              Store 12(@finitetmp) 20
 | 
				
			||||||
 | 
					              22:    6(float) Load 12(@finitetmp)
 | 
				
			||||||
 | 
					              23:    21(bool) IsNan 22
 | 
				
			||||||
 | 
					              24:    21(bool) LogicalNot 23
 | 
				
			||||||
 | 
					                              SelectionMerge 26 None
 | 
				
			||||||
 | 
					                              BranchConditional 24 25 26
 | 
				
			||||||
 | 
					              25:               Label
 | 
				
			||||||
 | 
					              27:    6(float)   Load 12(@finitetmp)
 | 
				
			||||||
 | 
					              28:    21(bool)   IsInf 27
 | 
				
			||||||
 | 
					              29:    21(bool)   LogicalNot 28
 | 
				
			||||||
 | 
					                                Branch 26
 | 
				
			||||||
 | 
					              26:             Label
 | 
				
			||||||
 | 
					              30:    21(bool) Phi 24 10 29 25
 | 
				
			||||||
 | 
					                              ReturnValue 32
 | 
				
			||||||
 | 
					                              FunctionEnd
 | 
				
			||||||
							
								
								
									
										9
									
								
								Test/hlsl.isfinite.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Test/hlsl.isfinite.frag
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					uniform float f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float4 main() : SV_Target0
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    isfinite(f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -136,6 +136,7 @@ INSTANTIATE_TEST_CASE_P(
 | 
				
			|||||||
        {"hlsl.inoutquals.frag", "main"},
 | 
					        {"hlsl.inoutquals.frag", "main"},
 | 
				
			||||||
        {"hlsl.init.frag", "ShaderFunction"},
 | 
					        {"hlsl.init.frag", "ShaderFunction"},
 | 
				
			||||||
        {"hlsl.init2.frag", "main"},
 | 
					        {"hlsl.init2.frag", "main"},
 | 
				
			||||||
 | 
					        {"hlsl.isfinite.frag", "main"},
 | 
				
			||||||
        {"hlsl.intrinsics.barriers.comp", "ComputeShaderFunction"},
 | 
					        {"hlsl.intrinsics.barriers.comp", "ComputeShaderFunction"},
 | 
				
			||||||
        {"hlsl.intrinsics.comp", "ComputeShaderFunction"},
 | 
					        {"hlsl.intrinsics.comp", "ComputeShaderFunction"},
 | 
				
			||||||
        {"hlsl.intrinsics.evalfns.frag", "main"},
 | 
					        {"hlsl.intrinsics.evalfns.frag", "main"},
 | 
				
			||||||
 | 
				
			|||||||
@ -3867,6 +3867,48 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
 | 
				
			|||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case EOpIsFinite:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // Since OPIsFinite in SPIR-V is only supported with the Kernel capability, we translate
 | 
				
			||||||
 | 
					            // it to !isnan && !isinf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            TIntermTyped* arg0 = node->getAsUnaryNode()->getOperand();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // We'll make a temporary in case the RHS is cmoplex
 | 
				
			||||||
 | 
					            TVariable* tempArg = makeInternalVariable("@finitetmp", arg0->getType());
 | 
				
			||||||
 | 
					            tempArg->getWritableType().getQualifier().makeTemporary();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            TIntermTyped* tmpArgAssign = intermediate.addAssign(EOpAssign,
 | 
				
			||||||
 | 
					                                                                intermediate.addSymbol(*tempArg, loc),
 | 
				
			||||||
 | 
					                                                                arg0, loc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            TIntermAggregate* compoundStatement = intermediate.makeAggregate(tmpArgAssign, loc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            TIntermTyped* isnan = handleUnaryMath(loc, "isnan", EOpIsNan, intermediate.addSymbol(*tempArg, loc));
 | 
				
			||||||
 | 
					            isnan->setType(TType(EbtBool));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            TIntermTyped* notnan = handleUnaryMath(loc, "!", EOpLogicalNot, isnan);
 | 
				
			||||||
 | 
					            notnan->setType(TType(EbtBool));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            TIntermTyped* isinf = handleUnaryMath(loc, "isinf", EOpIsInf, intermediate.addSymbol(*tempArg, loc));
 | 
				
			||||||
 | 
					            isinf->setType(TType(EbtBool));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            TIntermTyped* notinf = handleUnaryMath(loc, "!", EOpLogicalNot, isinf);
 | 
				
			||||||
 | 
					            notinf->setType(TType(EbtBool));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            TIntermTyped* andNode = handleBinaryMath(loc, "and", EOpLogicalAnd, notnan, notinf);
 | 
				
			||||||
 | 
					            andNode->setType(TType(EbtBool));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            compoundStatement = intermediate.growAggregate(compoundStatement, andNode);
 | 
				
			||||||
 | 
					            compoundStatement->setOperator(EOpSequence);
 | 
				
			||||||
 | 
					            compoundStatement->setLoc(loc);
 | 
				
			||||||
 | 
					            compoundStatement->setType(TType(EbtVoid));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            node = compoundStatement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        break; // most pass through unchanged
 | 
					        break; // most pass through unchanged
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user