rayQuery test cases added
diff --git a/Test/baseResults/rayQuery-allOps.Error.rgen.out b/Test/baseResults/rayQuery-allOps.Error.rgen.out
new file mode 100644
index 0000000..98101c3
--- /dev/null
+++ b/Test/baseResults/rayQuery-allOps.Error.rgen.out
@@ -0,0 +1,26 @@
+rayQuery-allOps.Error.rgen
+ERROR: 0:47: '==' : wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:49: '=' : cannot convert from ' global uint' to ' temp highp int'
+ERROR: 0:59: '==' : wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:64: '==' : wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global 2-component vector of float' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:69: '' : boolean expression expected
+ERROR: 0:74: '' : boolean expression expected
+ERROR: 0:79: '>' : wrong operand types: no operation '>' exists that takes a left-hand operand of type ' global 3-component vector of float' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:84: '>' : wrong operand types: no operation '>' exists that takes a left-hand operand of type ' global 3-component vector of float' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:89: '' : boolean expression expected
+ERROR: 0:94: '' : boolean expression expected
+ERROR: 0:99: '' : boolean expression expected
+ERROR: 0:127: '=' : cannot convert from ' global uint' to ' temp highp int'
+ERROR: 0:145: '==' : wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global 2-component vector of float' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:158: '' : boolean expression expected
+ERROR: 0:163: '' : boolean expression expected
+ERROR: 0:168: '>' : wrong operand types: no operation '>' exists that takes a left-hand operand of type ' global 3-component vector of float' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:173: '>' : wrong operand types: no operation '>' exists that takes a left-hand operand of type ' global 3-component vector of float' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:178: '' : boolean expression expected
+ERROR: 0:183: '' : boolean expression expected
+ERROR: 0:195: '' : boolean expression expected
+ERROR: 0:200: '' : boolean expression expected
+ERROR: 21 compilation errors. No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/rayQuery-allOps.comp.out b/Test/baseResults/rayQuery-allOps.comp.out
new file mode 100644
index 0000000..d130122
--- /dev/null
+++ b/Test/baseResults/rayQuery-allOps.comp.out
@@ -0,0 +1,438 @@
+rayQuery-allOps.comp
+// Module Version 10000
+// Generated by (magic number): 80008
+// Id's are bound by 265
+
+ Capability Shader
+ Capability RayQueryProvisionalKHR
+ Extension "SPV_KHR_ray_query"
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint GLCompute 4 "main"
+ ExecutionMode 4 LocalSize 1 1 1
+ Source GLSL 460
+ SourceExtension "GL_EXT_ray_query"
+ SourceExtension "GL_NV_ray_tracing"
+ Name 4 "main"
+ Name 6 "doSomething("
+ Name 10 "Ray"
+ MemberName 10(Ray) 0 "pos"
+ MemberName 10(Ray) 1 "tmin"
+ MemberName 10(Ray) 2 "dir"
+ MemberName 10(Ray) 3 "tmax"
+ Name 12 "makeRayDesc("
+ Name 15 "Log"
+ MemberName 15(Log) 0 "x"
+ MemberName 15(Log) 1 "y"
+ Name 17 ""
+ Name 26 "ray"
+ Name 45 "rayQuery"
+ Name 48 "rtas"
+ Name 51 "ray"
+ Name 69 "candidateType"
+ Name 79 "_mat4x3"
+ Name 84 "_mat3x4"
+ Name 146 "t"
+ Name 160 "committedStatus"
+ Name 246 "o"
+ Name 249 "d"
+ Name 260 "Ray"
+ MemberName 260(Ray) 0 "pos"
+ MemberName 260(Ray) 1 "tmin"
+ MemberName 260(Ray) 2 "dir"
+ MemberName 260(Ray) 3 "tmax"
+ Name 262 "Rays"
+ MemberName 262(Rays) 0 "rays"
+ Name 264 ""
+ MemberDecorate 15(Log) 0 Offset 0
+ MemberDecorate 15(Log) 1 Offset 4
+ Decorate 15(Log) BufferBlock
+ Decorate 17 DescriptorSet 0
+ Decorate 17 Binding 0
+ Decorate 48(rtas) DescriptorSet 0
+ Decorate 48(rtas) Binding 1
+ MemberDecorate 260(Ray) 0 Offset 0
+ MemberDecorate 260(Ray) 1 Offset 12
+ MemberDecorate 260(Ray) 2 Offset 16
+ MemberDecorate 260(Ray) 3 Offset 28
+ Decorate 261 ArrayStride 32
+ MemberDecorate 262(Rays) 0 Offset 0
+ Decorate 262(Rays) BufferBlock
+ Decorate 264 DescriptorSet 0
+ Decorate 264 Binding 2
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 8: TypeFloat 32
+ 9: TypeVector 8(float) 3
+ 10(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float)
+ 11: TypeFunction 10(Ray)
+ 14: TypeInt 32 0
+ 15(Log): TypeStruct 14(int) 14(int)
+ 16: TypePointer Uniform 15(Log)
+ 17: 16(ptr) Variable Uniform
+ 18: TypeInt 32 1
+ 19: 18(int) Constant 0
+ 20: 14(int) Constant 0
+ 21: TypePointer Uniform 14(int)
+ 23: 18(int) Constant 1
+ 25: TypePointer Function 10(Ray)
+ 27: 8(float) Constant 0
+ 28: 9(fvec3) ConstantComposite 27 27 27
+ 29: TypePointer Function 9(fvec3)
+ 31: 18(int) Constant 2
+ 32: 8(float) Constant 1065353216
+ 33: 9(fvec3) ConstantComposite 32 27 27
+ 35: TypePointer Function 8(float)
+ 37: 18(int) Constant 3
+ 38: 8(float) Constant 1176255488
+ 43: TypeRayQueryProvisionalKHR
+ 44: TypePointer Function 43
+ 46: TypeAccelerationStructureKHR
+ 47: TypePointer UniformConstant 46
+ 48(rtas): 47(ptr) Variable UniformConstant
+ 50: 14(int) Constant 255
+ 66: TypeBool
+ 68: TypePointer Function 14(int)
+ 70: 66(bool) ConstantFalse
+ 77: TypeMatrix 9(fvec3) 4
+ 78: TypePointer Function 77
+ 81: TypeVector 8(float) 4
+ 82: TypeMatrix 81(fvec4) 3
+ 83: TypePointer Function 82
+ 88: 66(bool) ConstantTrue
+ 93: TypeVector 8(float) 2
+ 147: 8(float) Constant 1056964608
+ 179: 14(int) Constant 1
+ 202: 14(int) Constant 2
+ 260(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float)
+ 261: TypeRuntimeArray 260(Ray)
+ 262(Rays): TypeStruct 261
+ 263: TypePointer Uniform 262(Rays)
+ 264: 263(ptr) Variable Uniform
+ 4(main): 2 Function None 3
+ 5: Label
+ 45(rayQuery): 44(ptr) Variable Function
+ 51(ray): 25(ptr) Variable Function
+69(candidateType): 68(ptr) Variable Function
+ 79(_mat4x3): 78(ptr) Variable Function
+ 84(_mat3x4): 83(ptr) Variable Function
+ 146(t): 35(ptr) Variable Function
+160(committedStatus): 68(ptr) Variable Function
+ 246(o): 29(ptr) Variable Function
+ 249(d): 29(ptr) Variable Function
+ 49: 46 Load 48(rtas)
+ 52: 29(ptr) AccessChain 51(ray) 19
+ 53: 9(fvec3) Load 52
+ 54: 35(ptr) AccessChain 51(ray) 23
+ 55: 8(float) Load 54
+ 56: 29(ptr) AccessChain 51(ray) 31
+ 57: 9(fvec3) Load 56
+ 58: 35(ptr) AccessChain 51(ray) 37
+ 59: 8(float) Load 58
+ RayQueryInitializeKHR 45(rayQuery) 49 20 50 53 55 57 59
+ Branch 60
+ 60: Label
+ LoopMerge 62 63 None
+ Branch 64
+ 64: Label
+ 65: 43 Load 45(rayQuery)
+ 67: 66(bool) RayQueryProceedKHR 65
+ BranchConditional 67 61 62
+ 61: Label
+ 71: 14(int) RayQueryGetIntersectionTypeKHR 45(rayQuery) 19
+ Store 69(candidateType) 71
+ 72: 14(int) Load 69(candidateType)
+ SelectionMerge 75 None
+ Switch 72 75
+ case 0: 73
+ case 1: 74
+ 73: Label
+ 76: 43 Load 45(rayQuery)
+ RayQueryTerminateKHR 76
+ 80: 77 RayQueryGetIntersectionObjectToWorldKHR 45(rayQuery) 19
+ Store 79(_mat4x3) 80
+ 85: 77 Load 79(_mat4x3)
+ 86: 82 Transpose 85
+ Store 84(_mat3x4) 86
+ 87: 43 Load 45(rayQuery)
+ RayQueryConfirmIntersectionKHR 87
+ 89: 66(bool) RayQueryGetIntersectionFrontFaceKHR 45(rayQuery) 23
+ SelectionMerge 91 None
+ BranchConditional 89 90 91
+ 90: Label
+ 92: 2 FunctionCall 6(doSomething()
+ Branch 91
+ 91: Label
+ 94: 93(fvec2) RayQueryGetIntersectionBarycentricsKHR 45(rayQuery) 23
+ 95: 8(float) CompositeExtract 94 0
+ 96: 66(bool) FOrdEqual 95 27
+ SelectionMerge 98 None
+ BranchConditional 96 97 98
+ 97: Label
+ 99: 2 FunctionCall 6(doSomething()
+ Branch 98
+ 98: Label
+ 100: 18(int) RayQueryGetIntersectionInstanceCustomIndexKHR 45(rayQuery) 23
+ 101: 66(bool) SGreaterThan 100 19
+ SelectionMerge 103 None
+ BranchConditional 101 102 103
+ 102: Label
+ 104: 2 FunctionCall 6(doSomething()
+ Branch 103
+ 103: Label
+ 105: 18(int) RayQueryGetIntersectionInstanceIdKHR 45(rayQuery) 23
+ 106: 66(bool) SGreaterThan 105 19
+ SelectionMerge 108 None
+ BranchConditional 106 107 108
+ 107: Label
+ 109: 2 FunctionCall 6(doSomething()
+ Branch 108
+ 108: Label
+ 110: 9(fvec3) RayQueryGetIntersectionObjectRayDirectionKHR 45(rayQuery) 23
+ 111: 8(float) CompositeExtract 110 0
+ 112: 66(bool) FOrdGreaterThan 111 27
+ SelectionMerge 114 None
+ BranchConditional 112 113 114
+ 113: Label
+ 115: 2 FunctionCall 6(doSomething()
+ Branch 114
+ 114: Label
+ 116: 9(fvec3) RayQueryGetIntersectionObjectRayOriginKHR 45(rayQuery) 23
+ 117: 8(float) CompositeExtract 116 0
+ 118: 66(bool) FOrdGreaterThan 117 27
+ SelectionMerge 120 None
+ BranchConditional 118 119 120
+ 119: Label
+ 121: 2 FunctionCall 6(doSomething()
+ Branch 120
+ 120: Label
+ 122: 18(int) RayQueryGetIntersectionPrimitiveIndexKHR 45(rayQuery) 23
+ 123: 66(bool) SGreaterThan 122 19
+ SelectionMerge 125 None
+ BranchConditional 123 124 125
+ 124: Label
+ 126: 2 FunctionCall 6(doSomething()
+ Branch 125
+ 125: Label
+ 127: 8(float) RayQueryGetIntersectionTKHR 45(rayQuery) 23
+ 128: 66(bool) FOrdGreaterThan 127 27
+ SelectionMerge 130 None
+ BranchConditional 128 129 130
+ 129: Label
+ 131: 2 FunctionCall 6(doSomething()
+ Branch 130
+ 130: Label
+ 132: 18(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 45(rayQuery) 23
+ 133: 66(bool) UGreaterThan 132 20
+ SelectionMerge 135 None
+ BranchConditional 133 134 135
+ 134: Label
+ 136: 2 FunctionCall 6(doSomething()
+ Branch 135
+ 135: Label
+ Branch 75
+ 74: Label
+ 138: 77 RayQueryGetIntersectionObjectToWorldKHR 45(rayQuery) 19
+ Store 79(_mat4x3) 138
+ 139: 77 Load 79(_mat4x3)
+ 140: 82 Transpose 139
+ Store 84(_mat3x4) 140
+ 141: 43 Load 45(rayQuery)
+ 142: 66(bool) RayQueryGetIntersectionCandidateAABBOpaqueKHR 141
+ SelectionMerge 144 None
+ BranchConditional 142 143 144
+ 143: Label
+ 145: 2 FunctionCall 6(doSomething()
+ Branch 144
+ 144: Label
+ Store 146(t) 147
+ 148: 8(float) Load 146(t)
+ RayQueryGenerateIntersectionKHR 45(rayQuery) 148
+ 149: 43 Load 45(rayQuery)
+ RayQueryTerminateKHR 149
+ Branch 75
+ 75: Label
+ Branch 63
+ 63: Label
+ Branch 60
+ 62: Label
+ 152: 35(ptr) AccessChain 84(_mat3x4) 19 20
+ 153: 8(float) Load 152
+ 154: 35(ptr) AccessChain 79(_mat4x3) 19 20
+ 155: 8(float) Load 154
+ 156: 66(bool) FOrdEqual 153 155
+ SelectionMerge 158 None
+ BranchConditional 156 157 158
+ 157: Label
+ 159: 2 FunctionCall 6(doSomething()
+ Branch 158
+ 158: Label
+ 161: 14(int) RayQueryGetIntersectionTypeKHR 45(rayQuery) 23
+ Store 160(committedStatus) 161
+ 162: 14(int) Load 160(committedStatus)
+ SelectionMerge 166 None
+ Switch 162 166
+ case 0: 163
+ case 1: 164
+ case 2: 165
+ 163: Label
+ 167: 77 RayQueryGetIntersectionWorldToObjectKHR 45(rayQuery) 19
+ Store 79(_mat4x3) 167
+ 168: 77 Load 79(_mat4x3)
+ 169: 82 Transpose 168
+ Store 84(_mat3x4) 169
+ Branch 166
+ 164: Label
+ 171: 77 RayQueryGetIntersectionWorldToObjectKHR 45(rayQuery) 23
+ Store 79(_mat4x3) 171
+ 172: 77 Load 79(_mat4x3)
+ 173: 82 Transpose 172
+ Store 84(_mat3x4) 173
+ 174: 66(bool) RayQueryGetIntersectionFrontFaceKHR 45(rayQuery) 23
+ SelectionMerge 176 None
+ BranchConditional 174 175 176
+ 175: Label
+ 177: 2 FunctionCall 6(doSomething()
+ Branch 176
+ 176: Label
+ 178: 93(fvec2) RayQueryGetIntersectionBarycentricsKHR 45(rayQuery) 23
+ 180: 8(float) CompositeExtract 178 1
+ 181: 66(bool) FOrdEqual 180 27
+ SelectionMerge 183 None
+ BranchConditional 181 182 183
+ 182: Label
+ 184: 2 FunctionCall 6(doSomething()
+ Branch 183
+ 183: Label
+ Branch 166
+ 165: Label
+ 186: 18(int) RayQueryGetIntersectionGeometryIndexKHR 45(rayQuery) 23
+ 187: 66(bool) SGreaterThan 186 19
+ SelectionMerge 189 None
+ BranchConditional 187 188 189
+ 188: Label
+ 190: 2 FunctionCall 6(doSomething()
+ Branch 189
+ 189: Label
+ 191: 18(int) RayQueryGetIntersectionInstanceIdKHR 45(rayQuery) 23
+ 192: 66(bool) SGreaterThan 191 19
+ SelectionMerge 194 None
+ BranchConditional 192 193 194
+ 193: Label
+ 195: 2 FunctionCall 6(doSomething()
+ Branch 194
+ 194: Label
+ 196: 18(int) RayQueryGetIntersectionInstanceCustomIndexKHR 45(rayQuery) 23
+ 197: 66(bool) SGreaterThan 196 19
+ SelectionMerge 199 None
+ BranchConditional 197 198 199
+ 198: Label
+ 200: 2 FunctionCall 6(doSomething()
+ Branch 199
+ 199: Label
+ 201: 9(fvec3) RayQueryGetIntersectionObjectRayDirectionKHR 45(rayQuery) 23
+ 203: 8(float) CompositeExtract 201 2
+ 204: 66(bool) FOrdGreaterThan 203 27
+ SelectionMerge 206 None
+ BranchConditional 204 205 206
+ 205: Label
+ 207: 2 FunctionCall 6(doSomething()
+ Branch 206
+ 206: Label
+ 208: 9(fvec3) RayQueryGetIntersectionObjectRayOriginKHR 45(rayQuery) 23
+ 209: 8(float) CompositeExtract 208 0
+ 210: 66(bool) FOrdGreaterThan 209 27
+ SelectionMerge 212 None
+ BranchConditional 210 211 212
+ 211: Label
+ 213: 2 FunctionCall 6(doSomething()
+ Branch 212
+ 212: Label
+ 214: 18(int) RayQueryGetIntersectionPrimitiveIndexKHR 45(rayQuery) 23
+ 215: 66(bool) SGreaterThan 214 19
+ SelectionMerge 217 None
+ BranchConditional 215 216 217
+ 216: Label
+ 218: 2 FunctionCall 6(doSomething()
+ Branch 217
+ 217: Label
+ 219: 8(float) RayQueryGetIntersectionTKHR 45(rayQuery) 23
+ 220: 66(bool) FOrdGreaterThan 219 27
+ SelectionMerge 222 None
+ BranchConditional 220 221 222
+ 221: Label
+ 223: 2 FunctionCall 6(doSomething()
+ Branch 222
+ 222: Label
+ Branch 166
+ 166: Label
+ 226: 35(ptr) AccessChain 84(_mat3x4) 19 20
+ 227: 8(float) Load 226
+ 228: 35(ptr) AccessChain 79(_mat4x3) 19 20
+ 229: 8(float) Load 228
+ 230: 66(bool) FOrdEqual 227 229
+ SelectionMerge 232 None
+ BranchConditional 230 231 232
+ 231: Label
+ 233: 2 FunctionCall 6(doSomething()
+ Branch 232
+ 232: Label
+ 234: 43 Load 45(rayQuery)
+ 235: 14(int) RayQueryGetRayFlagsKHR 234
+ 236: 66(bool) UGreaterThan 235 20
+ SelectionMerge 238 None
+ BranchConditional 236 237 238
+ 237: Label
+ 239: 2 FunctionCall 6(doSomething()
+ Branch 238
+ 238: Label
+ 240: 43 Load 45(rayQuery)
+ 241: 8(float) RayQueryGetRayTMinKHR 240
+ 242: 66(bool) FOrdGreaterThan 241 27
+ SelectionMerge 244 None
+ BranchConditional 242 243 244
+ 243: Label
+ 245: 2 FunctionCall 6(doSomething()
+ Branch 244
+ 244: Label
+ 247: 43 Load 45(rayQuery)
+ 248: 9(fvec3) RayQueryGetWorldRayOriginKHR 247
+ Store 246(o) 248
+ 250: 43 Load 45(rayQuery)
+ 251: 9(fvec3) RayQueryGetWorldRayDirectionKHR 250
+ Store 249(d) 251
+ 252: 35(ptr) AccessChain 246(o) 20
+ 253: 8(float) Load 252
+ 254: 35(ptr) AccessChain 249(d) 202
+ 255: 8(float) Load 254
+ 256: 66(bool) FOrdEqual 253 255
+ SelectionMerge 258 None
+ BranchConditional 256 257 258
+ 257: Label
+ 259: 2 FunctionCall 6(doSomething()
+ Branch 258
+ 258: Label
+ Return
+ FunctionEnd
+ 6(doSomething(): 2 Function None 3
+ 7: Label
+ 22: 21(ptr) AccessChain 17 19
+ Store 22 20
+ 24: 21(ptr) AccessChain 17 23
+ Store 24 20
+ Return
+ FunctionEnd
+12(makeRayDesc(): 10(Ray) Function None 11
+ 13: Label
+ 26(ray): 25(ptr) Variable Function
+ 30: 29(ptr) AccessChain 26(ray) 19
+ Store 30 28
+ 34: 29(ptr) AccessChain 26(ray) 31
+ Store 34 33
+ 36: 35(ptr) AccessChain 26(ray) 23
+ Store 36 27
+ 39: 35(ptr) AccessChain 26(ray) 37
+ Store 39 38
+ 40: 10(Ray) Load 26(ray)
+ ReturnValue 40
+ FunctionEnd
diff --git a/Test/baseResults/rayQuery-allOps.frag.out b/Test/baseResults/rayQuery-allOps.frag.out
new file mode 100644
index 0000000..87706a8
--- /dev/null
+++ b/Test/baseResults/rayQuery-allOps.frag.out
@@ -0,0 +1,438 @@
+rayQuery-allOps.frag
+// Module Version 10000
+// Generated by (magic number): 80008
+// Id's are bound by 265
+
+ Capability Shader
+ Capability RayQueryProvisionalKHR
+ Extension "SPV_KHR_ray_query"
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Fragment 4 "main"
+ ExecutionMode 4 OriginUpperLeft
+ Source GLSL 460
+ SourceExtension "GL_EXT_ray_query"
+ SourceExtension "GL_NV_ray_tracing"
+ Name 4 "main"
+ Name 6 "doSomething("
+ Name 10 "Ray"
+ MemberName 10(Ray) 0 "pos"
+ MemberName 10(Ray) 1 "tmin"
+ MemberName 10(Ray) 2 "dir"
+ MemberName 10(Ray) 3 "tmax"
+ Name 12 "makeRayDesc("
+ Name 15 "Log"
+ MemberName 15(Log) 0 "x"
+ MemberName 15(Log) 1 "y"
+ Name 17 ""
+ Name 26 "ray"
+ Name 45 "rayQuery"
+ Name 48 "rtas"
+ Name 51 "ray"
+ Name 69 "candidateType"
+ Name 79 "_mat4x3"
+ Name 84 "_mat3x4"
+ Name 146 "t"
+ Name 160 "committedStatus"
+ Name 246 "o"
+ Name 249 "d"
+ Name 260 "Ray"
+ MemberName 260(Ray) 0 "pos"
+ MemberName 260(Ray) 1 "tmin"
+ MemberName 260(Ray) 2 "dir"
+ MemberName 260(Ray) 3 "tmax"
+ Name 262 "Rays"
+ MemberName 262(Rays) 0 "rays"
+ Name 264 ""
+ MemberDecorate 15(Log) 0 Offset 0
+ MemberDecorate 15(Log) 1 Offset 4
+ Decorate 15(Log) BufferBlock
+ Decorate 17 DescriptorSet 0
+ Decorate 17 Binding 0
+ Decorate 48(rtas) DescriptorSet 0
+ Decorate 48(rtas) Binding 1
+ MemberDecorate 260(Ray) 0 Offset 0
+ MemberDecorate 260(Ray) 1 Offset 12
+ MemberDecorate 260(Ray) 2 Offset 16
+ MemberDecorate 260(Ray) 3 Offset 28
+ Decorate 261 ArrayStride 32
+ MemberDecorate 262(Rays) 0 Offset 0
+ Decorate 262(Rays) BufferBlock
+ Decorate 264 DescriptorSet 0
+ Decorate 264 Binding 2
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 8: TypeFloat 32
+ 9: TypeVector 8(float) 3
+ 10(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float)
+ 11: TypeFunction 10(Ray)
+ 14: TypeInt 32 0
+ 15(Log): TypeStruct 14(int) 14(int)
+ 16: TypePointer Uniform 15(Log)
+ 17: 16(ptr) Variable Uniform
+ 18: TypeInt 32 1
+ 19: 18(int) Constant 0
+ 20: 14(int) Constant 0
+ 21: TypePointer Uniform 14(int)
+ 23: 18(int) Constant 1
+ 25: TypePointer Function 10(Ray)
+ 27: 8(float) Constant 0
+ 28: 9(fvec3) ConstantComposite 27 27 27
+ 29: TypePointer Function 9(fvec3)
+ 31: 18(int) Constant 2
+ 32: 8(float) Constant 1065353216
+ 33: 9(fvec3) ConstantComposite 32 27 27
+ 35: TypePointer Function 8(float)
+ 37: 18(int) Constant 3
+ 38: 8(float) Constant 1176255488
+ 43: TypeRayQueryProvisionalKHR
+ 44: TypePointer Function 43
+ 46: TypeAccelerationStructureKHR
+ 47: TypePointer UniformConstant 46
+ 48(rtas): 47(ptr) Variable UniformConstant
+ 50: 14(int) Constant 255
+ 66: TypeBool
+ 68: TypePointer Function 14(int)
+ 70: 66(bool) ConstantFalse
+ 77: TypeMatrix 9(fvec3) 4
+ 78: TypePointer Function 77
+ 81: TypeVector 8(float) 4
+ 82: TypeMatrix 81(fvec4) 3
+ 83: TypePointer Function 82
+ 88: 66(bool) ConstantTrue
+ 93: TypeVector 8(float) 2
+ 147: 8(float) Constant 1056964608
+ 179: 14(int) Constant 1
+ 202: 14(int) Constant 2
+ 260(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float)
+ 261: TypeRuntimeArray 260(Ray)
+ 262(Rays): TypeStruct 261
+ 263: TypePointer Uniform 262(Rays)
+ 264: 263(ptr) Variable Uniform
+ 4(main): 2 Function None 3
+ 5: Label
+ 45(rayQuery): 44(ptr) Variable Function
+ 51(ray): 25(ptr) Variable Function
+69(candidateType): 68(ptr) Variable Function
+ 79(_mat4x3): 78(ptr) Variable Function
+ 84(_mat3x4): 83(ptr) Variable Function
+ 146(t): 35(ptr) Variable Function
+160(committedStatus): 68(ptr) Variable Function
+ 246(o): 29(ptr) Variable Function
+ 249(d): 29(ptr) Variable Function
+ 49: 46 Load 48(rtas)
+ 52: 29(ptr) AccessChain 51(ray) 19
+ 53: 9(fvec3) Load 52
+ 54: 35(ptr) AccessChain 51(ray) 23
+ 55: 8(float) Load 54
+ 56: 29(ptr) AccessChain 51(ray) 31
+ 57: 9(fvec3) Load 56
+ 58: 35(ptr) AccessChain 51(ray) 37
+ 59: 8(float) Load 58
+ RayQueryInitializeKHR 45(rayQuery) 49 20 50 53 55 57 59
+ Branch 60
+ 60: Label
+ LoopMerge 62 63 None
+ Branch 64
+ 64: Label
+ 65: 43 Load 45(rayQuery)
+ 67: 66(bool) RayQueryProceedKHR 65
+ BranchConditional 67 61 62
+ 61: Label
+ 71: 14(int) RayQueryGetIntersectionTypeKHR 45(rayQuery) 19
+ Store 69(candidateType) 71
+ 72: 14(int) Load 69(candidateType)
+ SelectionMerge 75 None
+ Switch 72 75
+ case 0: 73
+ case 1: 74
+ 73: Label
+ 76: 43 Load 45(rayQuery)
+ RayQueryTerminateKHR 76
+ 80: 77 RayQueryGetIntersectionObjectToWorldKHR 45(rayQuery) 19
+ Store 79(_mat4x3) 80
+ 85: 77 Load 79(_mat4x3)
+ 86: 82 Transpose 85
+ Store 84(_mat3x4) 86
+ 87: 43 Load 45(rayQuery)
+ RayQueryConfirmIntersectionKHR 87
+ 89: 66(bool) RayQueryGetIntersectionFrontFaceKHR 45(rayQuery) 23
+ SelectionMerge 91 None
+ BranchConditional 89 90 91
+ 90: Label
+ 92: 2 FunctionCall 6(doSomething()
+ Branch 91
+ 91: Label
+ 94: 93(fvec2) RayQueryGetIntersectionBarycentricsKHR 45(rayQuery) 23
+ 95: 8(float) CompositeExtract 94 0
+ 96: 66(bool) FOrdEqual 95 27
+ SelectionMerge 98 None
+ BranchConditional 96 97 98
+ 97: Label
+ 99: 2 FunctionCall 6(doSomething()
+ Branch 98
+ 98: Label
+ 100: 18(int) RayQueryGetIntersectionInstanceCustomIndexKHR 45(rayQuery) 23
+ 101: 66(bool) SGreaterThan 100 19
+ SelectionMerge 103 None
+ BranchConditional 101 102 103
+ 102: Label
+ 104: 2 FunctionCall 6(doSomething()
+ Branch 103
+ 103: Label
+ 105: 18(int) RayQueryGetIntersectionInstanceIdKHR 45(rayQuery) 23
+ 106: 66(bool) SGreaterThan 105 19
+ SelectionMerge 108 None
+ BranchConditional 106 107 108
+ 107: Label
+ 109: 2 FunctionCall 6(doSomething()
+ Branch 108
+ 108: Label
+ 110: 9(fvec3) RayQueryGetIntersectionObjectRayDirectionKHR 45(rayQuery) 23
+ 111: 8(float) CompositeExtract 110 0
+ 112: 66(bool) FOrdGreaterThan 111 27
+ SelectionMerge 114 None
+ BranchConditional 112 113 114
+ 113: Label
+ 115: 2 FunctionCall 6(doSomething()
+ Branch 114
+ 114: Label
+ 116: 9(fvec3) RayQueryGetIntersectionObjectRayOriginKHR 45(rayQuery) 23
+ 117: 8(float) CompositeExtract 116 0
+ 118: 66(bool) FOrdGreaterThan 117 27
+ SelectionMerge 120 None
+ BranchConditional 118 119 120
+ 119: Label
+ 121: 2 FunctionCall 6(doSomething()
+ Branch 120
+ 120: Label
+ 122: 18(int) RayQueryGetIntersectionPrimitiveIndexKHR 45(rayQuery) 23
+ 123: 66(bool) SGreaterThan 122 19
+ SelectionMerge 125 None
+ BranchConditional 123 124 125
+ 124: Label
+ 126: 2 FunctionCall 6(doSomething()
+ Branch 125
+ 125: Label
+ 127: 8(float) RayQueryGetIntersectionTKHR 45(rayQuery) 23
+ 128: 66(bool) FOrdGreaterThan 127 27
+ SelectionMerge 130 None
+ BranchConditional 128 129 130
+ 129: Label
+ 131: 2 FunctionCall 6(doSomething()
+ Branch 130
+ 130: Label
+ 132: 18(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 45(rayQuery) 23
+ 133: 66(bool) UGreaterThan 132 20
+ SelectionMerge 135 None
+ BranchConditional 133 134 135
+ 134: Label
+ 136: 2 FunctionCall 6(doSomething()
+ Branch 135
+ 135: Label
+ Branch 75
+ 74: Label
+ 138: 77 RayQueryGetIntersectionObjectToWorldKHR 45(rayQuery) 19
+ Store 79(_mat4x3) 138
+ 139: 77 Load 79(_mat4x3)
+ 140: 82 Transpose 139
+ Store 84(_mat3x4) 140
+ 141: 43 Load 45(rayQuery)
+ 142: 66(bool) RayQueryGetIntersectionCandidateAABBOpaqueKHR 141
+ SelectionMerge 144 None
+ BranchConditional 142 143 144
+ 143: Label
+ 145: 2 FunctionCall 6(doSomething()
+ Branch 144
+ 144: Label
+ Store 146(t) 147
+ 148: 8(float) Load 146(t)
+ RayQueryGenerateIntersectionKHR 45(rayQuery) 148
+ 149: 43 Load 45(rayQuery)
+ RayQueryTerminateKHR 149
+ Branch 75
+ 75: Label
+ Branch 63
+ 63: Label
+ Branch 60
+ 62: Label
+ 152: 35(ptr) AccessChain 84(_mat3x4) 19 20
+ 153: 8(float) Load 152
+ 154: 35(ptr) AccessChain 79(_mat4x3) 19 20
+ 155: 8(float) Load 154
+ 156: 66(bool) FOrdEqual 153 155
+ SelectionMerge 158 None
+ BranchConditional 156 157 158
+ 157: Label
+ 159: 2 FunctionCall 6(doSomething()
+ Branch 158
+ 158: Label
+ 161: 14(int) RayQueryGetIntersectionTypeKHR 45(rayQuery) 23
+ Store 160(committedStatus) 161
+ 162: 14(int) Load 160(committedStatus)
+ SelectionMerge 166 None
+ Switch 162 166
+ case 0: 163
+ case 1: 164
+ case 2: 165
+ 163: Label
+ 167: 77 RayQueryGetIntersectionWorldToObjectKHR 45(rayQuery) 19
+ Store 79(_mat4x3) 167
+ 168: 77 Load 79(_mat4x3)
+ 169: 82 Transpose 168
+ Store 84(_mat3x4) 169
+ Branch 166
+ 164: Label
+ 171: 77 RayQueryGetIntersectionWorldToObjectKHR 45(rayQuery) 23
+ Store 79(_mat4x3) 171
+ 172: 77 Load 79(_mat4x3)
+ 173: 82 Transpose 172
+ Store 84(_mat3x4) 173
+ 174: 66(bool) RayQueryGetIntersectionFrontFaceKHR 45(rayQuery) 23
+ SelectionMerge 176 None
+ BranchConditional 174 175 176
+ 175: Label
+ 177: 2 FunctionCall 6(doSomething()
+ Branch 176
+ 176: Label
+ 178: 93(fvec2) RayQueryGetIntersectionBarycentricsKHR 45(rayQuery) 23
+ 180: 8(float) CompositeExtract 178 1
+ 181: 66(bool) FOrdEqual 180 27
+ SelectionMerge 183 None
+ BranchConditional 181 182 183
+ 182: Label
+ 184: 2 FunctionCall 6(doSomething()
+ Branch 183
+ 183: Label
+ Branch 166
+ 165: Label
+ 186: 18(int) RayQueryGetIntersectionGeometryIndexKHR 45(rayQuery) 23
+ 187: 66(bool) SGreaterThan 186 19
+ SelectionMerge 189 None
+ BranchConditional 187 188 189
+ 188: Label
+ 190: 2 FunctionCall 6(doSomething()
+ Branch 189
+ 189: Label
+ 191: 18(int) RayQueryGetIntersectionInstanceIdKHR 45(rayQuery) 23
+ 192: 66(bool) SGreaterThan 191 19
+ SelectionMerge 194 None
+ BranchConditional 192 193 194
+ 193: Label
+ 195: 2 FunctionCall 6(doSomething()
+ Branch 194
+ 194: Label
+ 196: 18(int) RayQueryGetIntersectionInstanceCustomIndexKHR 45(rayQuery) 23
+ 197: 66(bool) SGreaterThan 196 19
+ SelectionMerge 199 None
+ BranchConditional 197 198 199
+ 198: Label
+ 200: 2 FunctionCall 6(doSomething()
+ Branch 199
+ 199: Label
+ 201: 9(fvec3) RayQueryGetIntersectionObjectRayDirectionKHR 45(rayQuery) 23
+ 203: 8(float) CompositeExtract 201 2
+ 204: 66(bool) FOrdGreaterThan 203 27
+ SelectionMerge 206 None
+ BranchConditional 204 205 206
+ 205: Label
+ 207: 2 FunctionCall 6(doSomething()
+ Branch 206
+ 206: Label
+ 208: 9(fvec3) RayQueryGetIntersectionObjectRayOriginKHR 45(rayQuery) 23
+ 209: 8(float) CompositeExtract 208 0
+ 210: 66(bool) FOrdGreaterThan 209 27
+ SelectionMerge 212 None
+ BranchConditional 210 211 212
+ 211: Label
+ 213: 2 FunctionCall 6(doSomething()
+ Branch 212
+ 212: Label
+ 214: 18(int) RayQueryGetIntersectionPrimitiveIndexKHR 45(rayQuery) 23
+ 215: 66(bool) SGreaterThan 214 19
+ SelectionMerge 217 None
+ BranchConditional 215 216 217
+ 216: Label
+ 218: 2 FunctionCall 6(doSomething()
+ Branch 217
+ 217: Label
+ 219: 8(float) RayQueryGetIntersectionTKHR 45(rayQuery) 23
+ 220: 66(bool) FOrdGreaterThan 219 27
+ SelectionMerge 222 None
+ BranchConditional 220 221 222
+ 221: Label
+ 223: 2 FunctionCall 6(doSomething()
+ Branch 222
+ 222: Label
+ Branch 166
+ 166: Label
+ 226: 35(ptr) AccessChain 84(_mat3x4) 19 20
+ 227: 8(float) Load 226
+ 228: 35(ptr) AccessChain 79(_mat4x3) 19 20
+ 229: 8(float) Load 228
+ 230: 66(bool) FOrdEqual 227 229
+ SelectionMerge 232 None
+ BranchConditional 230 231 232
+ 231: Label
+ 233: 2 FunctionCall 6(doSomething()
+ Branch 232
+ 232: Label
+ 234: 43 Load 45(rayQuery)
+ 235: 14(int) RayQueryGetRayFlagsKHR 234
+ 236: 66(bool) UGreaterThan 235 20
+ SelectionMerge 238 None
+ BranchConditional 236 237 238
+ 237: Label
+ 239: 2 FunctionCall 6(doSomething()
+ Branch 238
+ 238: Label
+ 240: 43 Load 45(rayQuery)
+ 241: 8(float) RayQueryGetRayTMinKHR 240
+ 242: 66(bool) FOrdGreaterThan 241 27
+ SelectionMerge 244 None
+ BranchConditional 242 243 244
+ 243: Label
+ 245: 2 FunctionCall 6(doSomething()
+ Branch 244
+ 244: Label
+ 247: 43 Load 45(rayQuery)
+ 248: 9(fvec3) RayQueryGetWorldRayOriginKHR 247
+ Store 246(o) 248
+ 250: 43 Load 45(rayQuery)
+ 251: 9(fvec3) RayQueryGetWorldRayDirectionKHR 250
+ Store 249(d) 251
+ 252: 35(ptr) AccessChain 246(o) 20
+ 253: 8(float) Load 252
+ 254: 35(ptr) AccessChain 249(d) 202
+ 255: 8(float) Load 254
+ 256: 66(bool) FOrdEqual 253 255
+ SelectionMerge 258 None
+ BranchConditional 256 257 258
+ 257: Label
+ 259: 2 FunctionCall 6(doSomething()
+ Branch 258
+ 258: Label
+ Return
+ FunctionEnd
+ 6(doSomething(): 2 Function None 3
+ 7: Label
+ 22: 21(ptr) AccessChain 17 19
+ Store 22 20
+ 24: 21(ptr) AccessChain 17 23
+ Store 24 20
+ Return
+ FunctionEnd
+12(makeRayDesc(): 10(Ray) Function None 11
+ 13: Label
+ 26(ray): 25(ptr) Variable Function
+ 30: 29(ptr) AccessChain 26(ray) 19
+ Store 30 28
+ 34: 29(ptr) AccessChain 26(ray) 31
+ Store 34 33
+ 36: 35(ptr) AccessChain 26(ray) 23
+ Store 36 27
+ 39: 35(ptr) AccessChain 26(ray) 37
+ Store 39 38
+ 40: 10(Ray) Load 26(ray)
+ ReturnValue 40
+ FunctionEnd
diff --git a/Test/baseResults/rayQuery-committed.Error.rgen.out b/Test/baseResults/rayQuery-committed.Error.rgen.out
new file mode 100644
index 0000000..037f692
--- /dev/null
+++ b/Test/baseResults/rayQuery-committed.Error.rgen.out
@@ -0,0 +1,19 @@
+rayQuery-committed.Error.rgen
+ERROR: 0:48: 'committed' : argument must be compile-time constant
+ERROR: 0:53: 'committed' : argument must be compile-time constant
+ERROR: 0:54: 'committed' : argument must be compile-time constant
+ERROR: 0:58: 'committed' : argument must be compile-time constant
+ERROR: 0:62: 'committed' : argument must be compile-time constant
+ERROR: 0:66: 'committed' : argument must be compile-time constant
+ERROR: 0:70: 'committed' : argument must be compile-time constant
+ERROR: 0:74: 'committed' : argument must be compile-time constant
+ERROR: 0:78: 'committed' : argument must be compile-time constant
+ERROR: 0:82: 'committed' : argument must be compile-time constant
+ERROR: 0:86: 'committed' : argument must be compile-time constant
+ERROR: 0:90: 'committed' : argument must be compile-time constant
+ERROR: 0:97: 'committed' : argument must be compile-time constant
+ERROR: 0:100: 'committed' : argument must be compile-time constant
+ERROR: 14 compilation errors. No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/rayQuery-allOps.Error.rgen b/Test/rayQuery-allOps.Error.rgen
new file mode 100644
index 0000000..a33cece
--- /dev/null
+++ b/Test/rayQuery-allOps.Error.rgen
@@ -0,0 +1,212 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+#extension GL_EXT_ray_query : enable
+
+struct Ray
+{
+ vec3 pos;
+ float tmin;
+ vec3 dir;
+ float tmax;
+};
+
+layout(std430, set = 0, binding = 0) buffer Log
+{
+ uint x;
+ uint y;
+};
+
+layout(binding = 1, set = 0) uniform accelerationStructureNV rtas;
+layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
+
+void doSomething()
+{
+ x = 0;
+ y = 0;
+}
+
+Ray makeRayDesc()
+{
+ Ray ray;
+ ray.pos= vec3(0,0,0);
+ ray.dir = vec3(1,0,0);
+ ray.tmin = 0.0f;
+ ray.tmax = 9999.0;
+ return ray;
+}
+
+void main()
+{
+ Ray ray = makeRayDesc();
+ rayQueryEXT rayQuery;
+ rayQueryInitializeEXT(rayQuery, rtas, 0, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax);
+
+ mat4x3 _mat4x3;
+ mat3x4 _mat3x4;
+
+ while (rayQueryProceedEXT(rayQuery) == 1)
+ {
+ int candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false);
+ switch(candidateType)
+ {
+ case gl_RayQueryCandidateIntersectionTriangleEXT:
+
+ rayQueryTerminateEXT(rayQuery);
+ _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ rayQueryConfirmIntersectionEXT(rayQuery);
+
+ if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true) == 1)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true) == 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionTEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+ break;
+
+ case gl_RayQueryCandidateIntersectionAABBEXT:
+ {
+ _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery))
+ {
+ doSomething();
+ }
+
+ int t = 1;
+ rayQueryGenerateIntersectionEXT(rayQuery, t);
+ rayQueryTerminateEXT(rayQuery);
+ break;
+ }
+ }
+ }
+
+ if(_mat3x4[0][0] == _mat4x3[0][0])
+ {
+ doSomething();
+ }
+
+ int committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);
+
+ switch(committedStatus)
+ {
+ case gl_RayQueryCommittedIntersectionNoneEXT :
+ _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ break;
+
+ case gl_RayQueryCommittedIntersectionTriangleEXT :
+ _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
+ _mat3x4 = transpose(_mat4x3);
+
+ if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true) == 0)
+ {
+ doSomething();
+ }
+ break;
+
+ case gl_RayQueryCommittedIntersectionGeneratedEXT :
+
+ if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionTEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+ break;
+ }
+
+ if (_mat3x4[0][0] == _mat4x3[0][0])
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetRayFlagsEXT(rayQuery))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetRayTMinEXT(rayQuery))
+ {
+ doSomething();
+ }
+
+ vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery);
+ vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery);
+
+ if (o.x == d.z)
+ {
+ doSomething();
+ }
+}
diff --git a/Test/rayQuery-allOps.comp b/Test/rayQuery-allOps.comp
new file mode 100644
index 0000000..7c62a64
--- /dev/null
+++ b/Test/rayQuery-allOps.comp
@@ -0,0 +1,212 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+#extension GL_EXT_ray_query : enable
+
+struct Ray
+{
+ vec3 pos;
+ float tmin;
+ vec3 dir;
+ float tmax;
+};
+
+layout(std430, set = 0, binding = 0) buffer Log
+{
+ uint x;
+ uint y;
+};
+
+layout(binding = 1, set = 0) uniform accelerationStructureNV rtas;
+layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
+
+void doSomething()
+{
+ x = 0;
+ y = 0;
+}
+
+Ray makeRayDesc()
+{
+ Ray ray;
+ ray.pos= vec3(0,0,0);
+ ray.dir = vec3(1,0,0);
+ ray.tmin = 0.0f;
+ ray.tmax = 9999.0;
+ return ray;
+}
+
+void main()
+{
+ Ray ray;// = makeRayDesc();
+ rayQueryEXT rayQuery;
+ rayQueryInitializeEXT(rayQuery, rtas, 0, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax);
+
+ mat4x3 _mat4x3;
+ mat3x4 _mat3x4;
+
+ while (rayQueryProceedEXT(rayQuery))
+ {
+ uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false);
+ switch(candidateType)
+ {
+ case gl_RayQueryCandidateIntersectionTriangleEXT:
+
+ rayQueryTerminateEXT(rayQuery);
+ _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ rayQueryConfirmIntersectionEXT(rayQuery);
+
+ if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+ break;
+
+ case gl_RayQueryCandidateIntersectionAABBEXT:
+ {
+ _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery))
+ {
+ doSomething();
+ }
+
+ float t = 0.5;
+ rayQueryGenerateIntersectionEXT(rayQuery, t);
+ rayQueryTerminateEXT(rayQuery);
+ break;
+ }
+ }
+ }
+
+ if(_mat3x4[0][0] == _mat4x3[0][0])
+ {
+ doSomething();
+ }
+
+ uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);
+
+ switch(committedStatus)
+ {
+ case gl_RayQueryCommittedIntersectionNoneEXT :
+ _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ break;
+
+ case gl_RayQueryCommittedIntersectionTriangleEXT :
+ _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
+ _mat3x4 = transpose(_mat4x3);
+
+ if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0)
+ {
+ doSomething();
+ }
+ break;
+
+ case gl_RayQueryCommittedIntersectionGeneratedEXT :
+
+ if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
+ {
+ doSomething();
+ }
+ break;
+ }
+
+ if (_mat3x4[0][0] == _mat4x3[0][0])
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetRayFlagsEXT(rayQuery) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetRayTMinEXT(rayQuery) > 0.0)
+ {
+ doSomething();
+ }
+
+ vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery);
+ vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery);
+
+ if (o.x == d.z)
+ {
+ doSomething();
+ }
+}
diff --git a/Test/rayQuery-allOps.frag b/Test/rayQuery-allOps.frag
new file mode 100644
index 0000000..7c62a64
--- /dev/null
+++ b/Test/rayQuery-allOps.frag
@@ -0,0 +1,212 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+#extension GL_EXT_ray_query : enable
+
+struct Ray
+{
+ vec3 pos;
+ float tmin;
+ vec3 dir;
+ float tmax;
+};
+
+layout(std430, set = 0, binding = 0) buffer Log
+{
+ uint x;
+ uint y;
+};
+
+layout(binding = 1, set = 0) uniform accelerationStructureNV rtas;
+layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
+
+void doSomething()
+{
+ x = 0;
+ y = 0;
+}
+
+Ray makeRayDesc()
+{
+ Ray ray;
+ ray.pos= vec3(0,0,0);
+ ray.dir = vec3(1,0,0);
+ ray.tmin = 0.0f;
+ ray.tmax = 9999.0;
+ return ray;
+}
+
+void main()
+{
+ Ray ray;// = makeRayDesc();
+ rayQueryEXT rayQuery;
+ rayQueryInitializeEXT(rayQuery, rtas, 0, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax);
+
+ mat4x3 _mat4x3;
+ mat3x4 _mat3x4;
+
+ while (rayQueryProceedEXT(rayQuery))
+ {
+ uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false);
+ switch(candidateType)
+ {
+ case gl_RayQueryCandidateIntersectionTriangleEXT:
+
+ rayQueryTerminateEXT(rayQuery);
+ _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ rayQueryConfirmIntersectionEXT(rayQuery);
+
+ if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+ break;
+
+ case gl_RayQueryCandidateIntersectionAABBEXT:
+ {
+ _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery))
+ {
+ doSomething();
+ }
+
+ float t = 0.5;
+ rayQueryGenerateIntersectionEXT(rayQuery, t);
+ rayQueryTerminateEXT(rayQuery);
+ break;
+ }
+ }
+ }
+
+ if(_mat3x4[0][0] == _mat4x3[0][0])
+ {
+ doSomething();
+ }
+
+ uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);
+
+ switch(committedStatus)
+ {
+ case gl_RayQueryCommittedIntersectionNoneEXT :
+ _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false);
+ _mat3x4 = transpose(_mat4x3);
+ break;
+
+ case gl_RayQueryCommittedIntersectionTriangleEXT :
+ _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
+ _mat3x4 = transpose(_mat4x3);
+
+ if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0)
+ {
+ doSomething();
+ }
+ break;
+
+ case gl_RayQueryCommittedIntersectionGeneratedEXT :
+
+ if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
+ {
+ doSomething();
+ }
+
+ if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
+ {
+ doSomething();
+ }
+ break;
+ }
+
+ if (_mat3x4[0][0] == _mat4x3[0][0])
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetRayFlagsEXT(rayQuery) > 0)
+ {
+ doSomething();
+ }
+
+ if (rayQueryGetRayTMinEXT(rayQuery) > 0.0)
+ {
+ doSomething();
+ }
+
+ vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery);
+ vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery);
+
+ if (o.x == d.z)
+ {
+ doSomething();
+ }
+}
diff --git a/Test/rayQuery-committed.Error.rgen b/Test/rayQuery-committed.Error.rgen
new file mode 100644
index 0000000..7d444dd
--- /dev/null
+++ b/Test/rayQuery-committed.Error.rgen
@@ -0,0 +1,105 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+#extension GL_EXT_ray_query : enable
+
+struct Ray
+{
+ vec3 pos;
+ float tmin;
+ vec3 dir;
+ float tmax;
+};
+
+layout(std430, set = 0, binding = 0) buffer Log
+{
+ uint x;
+ uint y;
+};
+
+layout(binding = 1, set = 0) uniform accelerationStructureNV rtas;
+layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
+
+void doSomething()
+{
+ x = 0;
+ y = 0;
+}
+
+uint launchIndex()
+{
+ return gl_LaunchIDNV.z*gl_LaunchSizeNV.x*gl_LaunchSizeNV.y + gl_LaunchIDNV.y*gl_LaunchSizeNV.x + gl_LaunchIDNV.x;
+}
+
+void main()
+{
+ uint index = launchIndex();
+ Ray ray = rays[index];
+ rayQueryEXT rayQuery;
+
+ bool committed_true = true;
+ bool committed_false = false;
+
+ rayQueryInitializeEXT(rayQuery, rtas, 1, 2, ray.pos, ray.tmin, ray.dir, ray.tmax);
+ while (rayQueryProceedEXT(rayQuery))
+ {
+ mat4x3 mat_o2w;
+ mat4x3 mat_w2o;
+
+ uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, committed_false);
+ if (candidateType == gl_RayQueryCandidateIntersectionTriangleEXT)
+ {
+ rayQueryTerminateEXT(rayQuery);
+
+ mat_o2w = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, committed_false);
+ mat_w2o = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, committed_false);
+
+ rayQueryConfirmIntersectionEXT(rayQuery);
+
+ if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, committed_true))
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, committed_true).x == 0)
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, committed_true) > 0)
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, committed_true) > 0)
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, committed_true).x > 0)
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, committed_true).x > 0)
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, committed_true) > 0)
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionTEXT(rayQuery, committed_true) > 0.f)
+ {
+ doSomething();
+ }
+ if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, committed_true) > 0)
+ {
+ doSomething();
+ }
+ }
+ }
+
+ uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, committed_true);
+ if (committedStatus == gl_RayQueryCommittedIntersectionGeneratedEXT)
+ {
+ if (rayQueryGetIntersectionGeometryIndexEXT(rayQuery, committed_true) > 0)
+ {
+ doSomething();
+ }
+ }
+}
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 5433841..dcafb7b 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -230,12 +230,16 @@
"spv.while-continue-break.vert",
"spv.while-simple.vert",
// vulkan-specific tests
- //"rayQuery.rgen",
- //"rayQuery-array-2d-dynamic.rgen",
- //"rayQuery-decls.rgen",
- //"rayQuery-no-cse.rgen",
- //"rayQuery-initialize.rgen",
- //"rayQuery-allOps.rgen",
+ "rayQuery.rgen",
+ "rayQuery-array-2d-dynamic.rgen",
+ "rayQuery-decls.rgen",
+ "rayQuery-no-cse.rgen",
+ "rayQuery-initialize.rgen",
+ "rayQuery-allOps.rgen",
+ "rayQuery-allOps.Error.rgen",
+ "rayQuery-committed.Error.rgen",
+ //"rayQuery-allOps.comp",
+ //"rayQuery-allOps.frag",
"spv.set.vert",
"spv.double.comp",
"spv.100ops.frag",
@@ -454,7 +458,6 @@
FileNameAsCustomTestSuffix
);
-
// Cases with deliberately unreachable code.
// By default the compiler will aggressively eliminate
// unreachable merges and continues.