The goal of this change is to make it so the emitters are not forced to have MIS disabled when shadow linking in used. On the user level it means that lights sources sources which are behind excluded shadow blocker will be visible in sharp glossy reflection. In order to support this an extra shadow ray is traced in the direction of the main path, to gather contribution of emitters behind shadow blockers. This is done in the two new kernels. First kernel performs light intersection to see if the extra shadow ray is needed. It is not needed if, for example, there are no light sources in the direction of the main path. The second kernel shades the light source and generates the actual shadow path. Such separation allows to keep kernels small (so that no intersection and shading happens in the same kernel). It also helps having good occupancy on the GPU: the main path will not wait for the shadow kernels to complete before continuing (the main path is needed by the extra shadow path generation, to have access to direction and shading reading state). Current implementation is limited to lights only: there is no support of mesh lights yet. The MIS weight of the new shadow ray needs to be double-checked. It was verified to give same result as the main path when the same light is hit. To avoid contribution from the same light source counted by the shadow ray and the main path the light source which was chosen to trace the shadow ray to is excluded from intersection via transparent bounces. This seems unideal and feels that it could be done via some MIS wights as well. Doing so is an exercise for later. The kernel naming could be improved. Suggestions are welcome. There are also quiet some TODOs in the code. Not sure how much of those must be resolved prior to merge to the cycles-light-linking branch. Would be cool to have extra eyes on some of the MIS aspects, which is easier in the shared branch. Tested on the CPU and Metal on M2 GPU. Ref #104972 Pull Request: blender/blender#107439