 85244d7486
			
		
	
	
		85244d7486
		
	
	
	
	
		
			
			This PR only changes a few lines of code, but is subtle. In HLSL, comparison operators (<,>,<=,>=,==,!=) operate component-wise when given a vector operand. If a whole vector equality or inequality is desired, then all() or any() can be used on the resulting bool vector. This PR enables this change. Existing shape conversion is used when one of the two arguments is a vector and one is a scalar. Some existing HLSL tests had assumed == and != meant vector-wise instead of component-wise comparisons. These tests have been changed to add an explicit any() or all() to the test source. This verifably does not change the final SPIR-V binary relative to the old behavior for == and !=. The AST does change for the (now explicit, formerly implicit) any() and all(). Also, a few tests changes where they previously had the return type wrong, e.g, from a vec < vec comparison in hlsl.shapeConv.frag. Promotion of comparison opcodes to vector forms (EOpEqual->EOpVectorEqual) is handled in promoteBinary(), as is setting the proper vector type of the result. EOpVectorEqual and EOpVectorNotEqual are now accepted as either aggregate or binary nodes, similar to how the other operators are handled. Partial support already existed for this: it has been fleshed out in the printing functions in intermOut.cpp. There is an existing defect around shape conversion with 1-vectors, but that is orthogonal to this PR and not addressed by it.
		
			
				
	
	
		
			338 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			338 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
| hlsl.if.frag
 | |
| Shader version: 450
 | |
| gl_FragCoord origin is upper left
 | |
| 0:? Sequence
 | |
| 0:2  Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
 | |
| 0:2    Function Parameters: 
 | |
| 0:2      'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:?     Sequence
 | |
| 0:3      Test condition and select (temp void)
 | |
| 0:3        Condition
 | |
| 0:3        all (global bool)
 | |
| 0:3          Equal (temp 4-component vector of bool)
 | |
| 0:3            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:3            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:3        true case
 | |
| 0:4        Sequence
 | |
| 0:4          move second child to first child (temp 4-component vector of float)
 | |
| 0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:4            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:4          Branch: Return
 | |
| 0:6      Test condition and select (temp void)
 | |
| 0:6        Condition
 | |
| 0:6        all (global bool)
 | |
| 0:6          Equal (temp 4-component vector of bool)
 | |
| 0:6            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:6            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:6        true case
 | |
| 0:7        Sequence
 | |
| 0:7          move second child to first child (temp 4-component vector of float)
 | |
| 0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:7            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:7          Branch: Return
 | |
| 0:6        false case
 | |
| 0:9        Sequence
 | |
| 0:9          move second child to first child (temp 4-component vector of float)
 | |
| 0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:9            Negate value (temp 4-component vector of float)
 | |
| 0:9              'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:9          Branch: Return
 | |
| 0:11      Test condition and select (temp void)
 | |
| 0:11        Condition
 | |
| 0:11        all (global bool)
 | |
| 0:11          Equal (temp 4-component vector of bool)
 | |
| 0:11            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:11            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:11        true case is null
 | |
| 0:14      Test condition and select (temp void)
 | |
| 0:14        Condition
 | |
| 0:14        all (global bool)
 | |
| 0:14          Equal (temp 4-component vector of bool)
 | |
| 0:14            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:14            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:14        true case is null
 | |
| 0:19      Test condition and select (temp void)
 | |
| 0:19        Condition
 | |
| 0:19        all (global bool)
 | |
| 0:19          Equal (temp 4-component vector of bool)
 | |
| 0:19            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:19            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:19        true case
 | |
| 0:?         Sequence
 | |
| 0:20          Sequence
 | |
| 0:20            move second child to first child (temp 4-component vector of float)
 | |
| 0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:20              'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:20            Branch: Return
 | |
| 0:23      Test condition and select (temp void)
 | |
| 0:23        Condition
 | |
| 0:23        all (global bool)
 | |
| 0:23          Equal (temp 4-component vector of bool)
 | |
| 0:23            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:23            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:23        true case
 | |
| 0:?         Sequence
 | |
| 0:24          Sequence
 | |
| 0:24            move second child to first child (temp 4-component vector of float)
 | |
| 0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:24              'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:24            Branch: Return
 | |
| 0:23        false case
 | |
| 0:?         Sequence
 | |
| 0:26          Sequence
 | |
| 0:26            move second child to first child (temp 4-component vector of float)
 | |
| 0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:26              Negate value (temp 4-component vector of float)
 | |
| 0:26                'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:26            Branch: Return
 | |
| 0:30      Test condition and select (temp void)
 | |
| 0:30        Condition
 | |
| 0:30        move second child to first child (temp float)
 | |
| 0:30          'ii' (temp float)
 | |
| 0:30          direct index (temp float)
 | |
| 0:30            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:30            Constant:
 | |
| 0:30              2 (const int)
 | |
| 0:30        true case
 | |
| 0:31        Pre-Increment (temp float)
 | |
| 0:31          'ii' (temp float)
 | |
| 0:32      Pre-Increment (temp int)
 | |
| 0:32        'ii' (temp int)
 | |
| 0:?   Linker Objects
 | |
| 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:?     'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 
 | |
| 
 | |
| Linked fragment stage:
 | |
| 
 | |
| 
 | |
| Shader version: 450
 | |
| gl_FragCoord origin is upper left
 | |
| 0:? Sequence
 | |
| 0:2  Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
 | |
| 0:2    Function Parameters: 
 | |
| 0:2      'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:?     Sequence
 | |
| 0:3      Test condition and select (temp void)
 | |
| 0:3        Condition
 | |
| 0:3        all (global bool)
 | |
| 0:3          Equal (temp 4-component vector of bool)
 | |
| 0:3            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:3            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:3        true case
 | |
| 0:4        Sequence
 | |
| 0:4          move second child to first child (temp 4-component vector of float)
 | |
| 0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:4            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:4          Branch: Return
 | |
| 0:6      Test condition and select (temp void)
 | |
| 0:6        Condition
 | |
| 0:6        all (global bool)
 | |
| 0:6          Equal (temp 4-component vector of bool)
 | |
| 0:6            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:6            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:6        true case
 | |
| 0:7        Sequence
 | |
| 0:7          move second child to first child (temp 4-component vector of float)
 | |
| 0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:7            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:7          Branch: Return
 | |
| 0:6        false case
 | |
| 0:9        Sequence
 | |
| 0:9          move second child to first child (temp 4-component vector of float)
 | |
| 0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:9            Negate value (temp 4-component vector of float)
 | |
| 0:9              'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:9          Branch: Return
 | |
| 0:11      Test condition and select (temp void)
 | |
| 0:11        Condition
 | |
| 0:11        all (global bool)
 | |
| 0:11          Equal (temp 4-component vector of bool)
 | |
| 0:11            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:11            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:11        true case is null
 | |
| 0:14      Test condition and select (temp void)
 | |
| 0:14        Condition
 | |
| 0:14        all (global bool)
 | |
| 0:14          Equal (temp 4-component vector of bool)
 | |
| 0:14            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:14            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:14        true case is null
 | |
| 0:19      Test condition and select (temp void)
 | |
| 0:19        Condition
 | |
| 0:19        all (global bool)
 | |
| 0:19          Equal (temp 4-component vector of bool)
 | |
| 0:19            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:19            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:19        true case
 | |
| 0:?         Sequence
 | |
| 0:20          Sequence
 | |
| 0:20            move second child to first child (temp 4-component vector of float)
 | |
| 0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:20              'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:20            Branch: Return
 | |
| 0:23      Test condition and select (temp void)
 | |
| 0:23        Condition
 | |
| 0:23        all (global bool)
 | |
| 0:23          Equal (temp 4-component vector of bool)
 | |
| 0:23            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:23            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:23        true case
 | |
| 0:?         Sequence
 | |
| 0:24          Sequence
 | |
| 0:24            move second child to first child (temp 4-component vector of float)
 | |
| 0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:24              'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:24            Branch: Return
 | |
| 0:23        false case
 | |
| 0:?         Sequence
 | |
| 0:26          Sequence
 | |
| 0:26            move second child to first child (temp 4-component vector of float)
 | |
| 0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:26              Negate value (temp 4-component vector of float)
 | |
| 0:26                'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:26            Branch: Return
 | |
| 0:30      Test condition and select (temp void)
 | |
| 0:30        Condition
 | |
| 0:30        move second child to first child (temp float)
 | |
| 0:30          'ii' (temp float)
 | |
| 0:30          direct index (temp float)
 | |
| 0:30            'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 0:30            Constant:
 | |
| 0:30              2 (const int)
 | |
| 0:30        true case
 | |
| 0:31        Pre-Increment (temp float)
 | |
| 0:31          'ii' (temp float)
 | |
| 0:32      Pre-Increment (temp int)
 | |
| 0:32        'ii' (temp int)
 | |
| 0:?   Linker Objects
 | |
| 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 | |
| 0:?     'input' (layout(location=0 ) in 4-component vector of float)
 | |
| 
 | |
| // Module Version 10000
 | |
| // Generated by (magic number): 80001
 | |
| // Id's are bound by 84
 | |
| 
 | |
|                               Capability Shader
 | |
|                1:             ExtInstImport  "GLSL.std.450"
 | |
|                               MemoryModel Logical GLSL450
 | |
|                               EntryPoint Fragment 4  "PixelShaderFunction" 9 19
 | |
|                               ExecutionMode 4 OriginUpperLeft
 | |
|                               Name 4  "PixelShaderFunction"
 | |
|                               Name 9  "input"
 | |
|                               Name 19  "@entryPointOutput"
 | |
|                               Name 67  "ii"
 | |
|                               Name 80  "ii"
 | |
|                               Decorate 9(input) Location 0
 | |
|                               Decorate 19(@entryPointOutput) Location 0
 | |
|                2:             TypeVoid
 | |
|                3:             TypeFunction 2
 | |
|                6:             TypeFloat 32
 | |
|                7:             TypeVector 6(float) 4
 | |
|                8:             TypePointer Input 7(fvec4)
 | |
|         9(input):      8(ptr) Variable Input
 | |
|               12:             TypeBool
 | |
|               13:             TypeVector 12(bool) 4
 | |
|               18:             TypePointer Output 7(fvec4)
 | |
| 19(@entryPointOutput):     18(ptr) Variable Output
 | |
|               66:             TypePointer Function 6(float)
 | |
|               68:             TypeInt 32 0
 | |
|               69:     68(int) Constant 2
 | |
|               70:             TypePointer Input 6(float)
 | |
|               76:    6(float) Constant 1065353216
 | |
|               78:             TypeInt 32 1
 | |
|               79:             TypePointer Function 78(int)
 | |
|               82:     78(int) Constant 1
 | |
| 4(PixelShaderFunction):           2 Function None 3
 | |
|                5:             Label
 | |
|           67(ii):     66(ptr) Variable Function
 | |
|           80(ii):     79(ptr) Variable Function
 | |
|               10:    7(fvec4) Load 9(input)
 | |
|               11:    7(fvec4) Load 9(input)
 | |
|               14:   13(bvec4) FOrdEqual 10 11
 | |
|               15:    12(bool) All 14
 | |
|                               SelectionMerge 17 None
 | |
|                               BranchConditional 15 16 17
 | |
|               16:               Label
 | |
|               20:    7(fvec4)   Load 9(input)
 | |
|                                 Store 19(@entryPointOutput) 20
 | |
|                                 Return
 | |
|               17:             Label
 | |
|               22:    7(fvec4) Load 9(input)
 | |
|               23:    7(fvec4) Load 9(input)
 | |
|               24:   13(bvec4) FOrdEqual 22 23
 | |
|               25:    12(bool) All 24
 | |
|                               SelectionMerge 27 None
 | |
|                               BranchConditional 25 26 30
 | |
|               26:               Label
 | |
|               28:    7(fvec4)   Load 9(input)
 | |
|                                 Store 19(@entryPointOutput) 28
 | |
|                                 Return
 | |
|               30:               Label
 | |
|               31:    7(fvec4)   Load 9(input)
 | |
|               32:    7(fvec4)   FNegate 31
 | |
|                                 Store 19(@entryPointOutput) 32
 | |
|                                 Return
 | |
|               27:             Label
 | |
|               34:    7(fvec4) Load 9(input)
 | |
|               35:    7(fvec4) Load 9(input)
 | |
|               36:   13(bvec4) FOrdEqual 34 35
 | |
|               37:    12(bool) All 36
 | |
|                               SelectionMerge 39 None
 | |
|                               BranchConditional 37 38 39
 | |
|               38:               Label
 | |
|                                 Branch 39
 | |
|               39:             Label
 | |
|               40:    7(fvec4) Load 9(input)
 | |
|               41:    7(fvec4) Load 9(input)
 | |
|               42:   13(bvec4) FOrdEqual 40 41
 | |
|               43:    12(bool) All 42
 | |
|                               SelectionMerge 45 None
 | |
|                               BranchConditional 43 44 45
 | |
|               44:               Label
 | |
|                                 Branch 45
 | |
|               45:             Label
 | |
|               46:    7(fvec4) Load 9(input)
 | |
|               47:    7(fvec4) Load 9(input)
 | |
|               48:   13(bvec4) FOrdEqual 46 47
 | |
|               49:    12(bool) All 48
 | |
|                               SelectionMerge 51 None
 | |
|                               BranchConditional 49 50 51
 | |
|               50:               Label
 | |
|               52:    7(fvec4)   Load 9(input)
 | |
|                                 Store 19(@entryPointOutput) 52
 | |
|                                 Return
 | |
|               51:             Label
 | |
|               54:    7(fvec4) Load 9(input)
 | |
|               55:    7(fvec4) Load 9(input)
 | |
|               56:   13(bvec4) FOrdEqual 54 55
 | |
|               57:    12(bool) All 56
 | |
|                               SelectionMerge 59 None
 | |
|                               BranchConditional 57 58 62
 | |
|               58:               Label
 | |
|               60:    7(fvec4)   Load 9(input)
 | |
|                                 Store 19(@entryPointOutput) 60
 | |
|                                 Return
 | |
|               62:               Label
 | |
|               63:    7(fvec4)   Load 9(input)
 | |
|               64:    7(fvec4)   FNegate 63
 | |
|                                 Store 19(@entryPointOutput) 64
 | |
|                                 Return
 | |
|               59:             Label
 | |
|               71:     70(ptr) AccessChain 9(input) 69
 | |
|               72:    6(float) Load 71
 | |
|                               Store 67(ii) 72
 | |
|                               SelectionMerge 74 None
 | |
|                               BranchConditional 72 73 74
 | |
|               73:               Label
 | |
|               75:    6(float)   Load 67(ii)
 | |
|               77:    6(float)   FAdd 75 76
 | |
|                                 Store 67(ii) 77
 | |
|                                 Branch 74
 | |
|               74:             Label
 | |
|               81:     78(int) Load 80(ii)
 | |
|               83:     78(int) IAdd 81 82
 | |
|                               Store 80(ii) 83
 | |
|                               Return
 | |
|                               FunctionEnd
 |