case SpvOpSwitch:
case SpvOpKill:
case SpvOpTerminateInvocation:
+ case SpvOpIgnoreIntersectionKHR:
+ case SpvOpTerminateRayKHR:
case SpvOpReturn:
case SpvOpReturnValue:
case SpvOpUnreachable:
case SpvOpTerminateInvocation:
b->has_early_terminate = true;
- block->branch_type = vtn_branch_type_terminate;
+ block->branch_type = vtn_branch_type_terminate_invocation;
+ return NULL;
+
+ case SpvOpIgnoreIntersectionKHR:
+ b->has_early_terminate = true;
+ block->branch_type = vtn_branch_type_ignore_intersection;
+ return NULL;
+
+ case SpvOpTerminateRayKHR:
+ b->has_early_terminate = true;
+ block->branch_type = vtn_branch_type_terminate_ray;
return NULL;
case SpvOpBranchConditional: {
nir_builder_instr_insert(&b->nb, &discard->instr);
break;
}
- case vtn_branch_type_terminate: {
+ case vtn_branch_type_terminate_invocation: {
nir_intrinsic_instr *terminate =
nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_terminate);
nir_builder_instr_insert(&b->nb, &terminate->instr);
break;
}
+ case vtn_branch_type_ignore_intersection: {
+ nir_intrinsic_instr *ignore =
+ nir_intrinsic_instr_create(b->nb.shader,
+ nir_intrinsic_ignore_ray_intersection);
+ nir_builder_instr_insert(&b->nb, &ignore->instr);
+ break;
+ }
+ case vtn_branch_type_terminate_ray: {
+ nir_intrinsic_instr *terminate =
+ nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_terminate_ray);
+ nir_builder_instr_insert(&b->nb, &terminate->instr);
+ break;
+ }
default:
vtn_fail("Invalid branch type");
}
vtn_branch_type_loop_continue,
vtn_branch_type_loop_back_edge,
vtn_branch_type_discard,
- vtn_branch_type_terminate,
+ vtn_branch_type_terminate_invocation,
+ vtn_branch_type_ignore_intersection,
+ vtn_branch_type_terminate_ray,
vtn_branch_type_return,
};
*
* - OpKill
* - OpTerminateInvocation
+ * - OpIgnoreIntersectionKHR
+ * - OpTerminateRayKHR
*
* However, in NIR, they're represented by regular intrinsics with no
* control-flow semantics. This means that the SSA form from the SPIR-V