Safari choisit automatiquement une résolution de filtre incorrecte, probablement parce que personne n'a pris la peine de mettre à jour le code pour les écrans rétina. Vous pouvez inciter Safari à faire "presque" ce qu'il faut en ajoutant filterRes="200" à l'élément de filtre, car il n'a pas encore abandonné la prise en charge de filterRes.
Cela dit, aujourd'hui, la bonne chose à faire pour tous les navigateurs est de renoncer complètement aux sources de lumière et d'utiliser simplement un rectangle rempli d'un dégradé radial noir/blanc importé en tant que data:URI avec feImage (pour la compatibilité avec Firefox et Edge). Un screen blend ajoutera la haute lumière blanche à l'original, comme je pense que vous le souhaitiez. Comme ceci :
svg {
background: red;
}
<svg width="400px" height="200px" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<radialGradient id="lightHack">
<stop offset="35%" stop-color="white"/>
<stop offset="80%" stop-color="black"/>
</radialGradient>
<filter id="customPointLight">
<feSpecularLighting result="lightBuffer" specularConstant="1.5"
specularExponent="80" lighting-color="#fff">
<fePointLight x="100" y="100" z="80"/>
</feSpecularLighting>
<feComposite in="SourceGraphic" in2="lightBuffer" operator="out"
k1="0" k2="1" k3="1" k4="0"/>
</filter>
<filter id="pointLightHack" x="0%" y="0%" width="100%" height="100%">
<feImage width="100" height="100" xlink:href="data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiDQogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KDQogIDxkZWZzPg0KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZXhhbXBsZUdyYWRpZW50Ij4NCiAgICAgIDxzdG9wIG9mZnNldD0iNDAlIiBzdG9wLWNvbG9yPSJ3aGl0ZSIvPg0KICAgICAgPHN0b3Agb2Zmc2V0PSI3NSUiIHN0b3AtY29sb3I9ImJsYWNrIi8+DQogICAgPC9yYWRpYWxHcmFkaWVudD4NCiAgPC9kZWZzPg0KICA8Y2lyY2xlIGZpbGw9InVybCgjZXhhbXBsZUdyYWRpZW50KSIgY3g9IjUwIiBjeT0iNTAiIHI9IjUwIi8+DQo8L3N2Zz4="/>
<feBlend mode="screen" in="SourceGraphic"/>
</filter>
</defs>
<rect x="50" y="50" width="100" height="100" fill="blue" filter="url(#customPointLight)"/>
<rect x="250" y="50" height="100" width="100" fill="blue" filter="url(#pointLightHack)"/>
</svg>
<!-- SVG source of the base64 encoded feImage -->
<svg width="100" height="100" viewBox="0 0 100 100"
xmlns="http://www.w3.org/2000/svg">
<defs>
<radialGradient id="exampleGradient">
<stop offset="40%" stop-color="white"/>
<stop offset="75%" stop-color="black"/>
</radialGradient>
</defs>
<circle fill="url(#exampleGradient)" cx="50" cy="50" r="50"/>
</svg>
Par ailleurs, vous n'utilisez pas l'effet d'éclairage correctement, l'éclairage spéculaire est censé ajouter des reflets "brillants", donc l'utilisation correcte est de composer le résultat au-dessus de la source. L'éclairage diffus est censé ajouter une lumière "normale" et doit être multiplié par le graphique d'origine. Dans les deux cas, vous ne devez pas utiliser une opération composite "out", qui consiste à percer un trou transparent dans votre rectangle, comme vous pouvez le voir lorsque vous ajoutez le fond rouge ci-dessus.