spirv: add an options to lower SpvOpTerminateInvocation to OpKill

To workaround game bugs like Indiana Jones.

Original workaround found by Hans-Kristian.

Cc: mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32606>
This commit is contained in:
Samuel Pitoiset
2024-12-12 09:48:04 +01:00
committed by Marge Bot
parent 976eb6825e
commit 4d4418dbb3
2 changed files with 9 additions and 1 deletions
+5
View File
@@ -136,6 +136,11 @@ struct spirv_to_nir_options {
/* Force SSBO accesses to be non-uniform. */
bool force_ssbo_non_uniform;
/* Whether OpTerminateInvocation should be lowered to OpKill to workaround
* game bugs.
*/
bool lower_terminate_to_discard;
/* In Debug Builds, instead of emitting an OS break on failure, just return NULL from
* spirv_to_nir(). This is useful for the unit tests that want to report a test failed
* but continue executing other tests.
+4 -1
View File
@@ -976,7 +976,10 @@ branch_type_for_terminator(struct vtn_builder *b, struct vtn_block *block)
case SpvOpKill:
return vtn_branch_type_discard;
case SpvOpTerminateInvocation:
return vtn_branch_type_terminate_invocation;
if (b->options->lower_terminate_to_discard)
return vtn_branch_type_discard;
else
return vtn_branch_type_terminate_invocation;
case SpvOpIgnoreIntersectionKHR:
return vtn_branch_type_ignore_intersection;
case SpvOpTerminateRayKHR: