From f9af788554db0d246627c3b2f2b0d0bea6b9b128 Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 25 May 2026 17:26:24 -0300 Subject: [PATCH] [shader_env] add termination detection for MESA nv50_ir like homebrews --- src/video_core/shader_environment.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/video_core/shader_environment.cpp b/src/video_core/shader_environment.cpp index 5f5633d4d1..0f22f49620 100644 --- a/src/video_core/shader_environment.cpp +++ b/src/video_core/shader_environment.cpp @@ -254,6 +254,9 @@ std::optional GenericEnvironment::TryFindSize() { static constexpr u64 SELF_BRANCH_A = 0xE2400FFFFF87000FULL; static constexpr u64 SELF_BRANCH_B = 0xE2400FFFFF07000FULL; + static constexpr u64 MESA_EXIT_MASK = 0xFFF00000000F001FULL; + static constexpr u64 MESA_EXIT_VALUE = (0xE30ULL << 52) | (0x7ULL << 16) | 0xFULL; + GPUVAddr guest_addr{program_base + start_address}; size_t offset{0}; size_t size{BLOCK_SIZE}; @@ -266,6 +269,9 @@ std::optional GenericEnvironment::TryFindSize() { if (inst == SELF_BRANCH_A || inst == SELF_BRANCH_B) { return offset + index; } + if ((inst & MESA_EXIT_MASK) == MESA_EXIT_VALUE) { + return offset + index + INST_SIZE; + } } guest_addr += BLOCK_SIZE; size += BLOCK_SIZE;