From 39435acbc7ef0ecb3cb2a10bbe336ccb043bdaae Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Sun, 5 Apr 2026 00:30:56 -0400 Subject: [PATCH] fix spy vs spy hitman metal slug etc. --- android/app/src/main/cpp/CMakeLists.txt | 19 +++++++++- .../app/src/main/cpp/nv2a_vsh_emulator_stub.c | 36 ------------------- .../java/com/izzy2lost/x1box/MainActivity.kt | 3 ++ hw/xbox/nv2a/pgraph/glsl/psh.c | 2 +- hw/xbox/nv2a/pgraph/vk/texture.c | 16 ++++++++- 5 files changed, 37 insertions(+), 39 deletions(-) delete mode 100644 android/app/src/main/cpp/nv2a_vsh_emulator_stub.c diff --git a/android/app/src/main/cpp/CMakeLists.txt b/android/app/src/main/cpp/CMakeLists.txt index 38ff746131..c23af65968 100644 --- a/android/app/src/main/cpp/CMakeLists.txt +++ b/android/app/src/main/cpp/CMakeLists.txt @@ -76,6 +76,17 @@ FetchContent_Declare( ) FetchContent_MakeAvailable(tomlplusplus) +# --- nv2a_vsh_cpu --- +set(NV2A_VSH_CPU_GIT_REV "1115255708c10c4841b65dcd2223262e7a316598") +set(nv2a_vsh_cpu_UNIT_TEST OFF CACHE BOOL "" FORCE) +FetchContent_Declare( + nv2a_vsh_cpu + GIT_REPOSITORY "https://github.com/xemu-project/nv2a_vsh_cpu.git" + GIT_TAG "${NV2A_VSH_CPU_GIT_REV}" + GIT_SHALLOW FALSE +) +FetchContent_MakeAvailable(nv2a_vsh_cpu) + if(XEMU_ENABLE_VULKAN) # --- adrenotools (custom GPU driver loading on Adreno) --- FetchContent_Declare( @@ -630,7 +641,6 @@ list(APPEND XEMU_CORE_SOURCES "${REPO_ROOT}/ui/vnc-stubs.c" "${REPO_ROOT}/target/i386/kvm/hyperv-stub.c" "${CMAKE_CURRENT_LIST_DIR}/kvmclock_stub.c" - "${CMAKE_CURRENT_LIST_DIR}/nv2a_vsh_emulator_stub.c" "${CMAKE_CURRENT_LIST_DIR}/samplerate_stub.c" "${CMAKE_CURRENT_LIST_DIR}/fast_hash_stub.c" "${CMAKE_CURRENT_LIST_DIR}/libintl_stub.c" @@ -888,6 +898,7 @@ target_compile_options(xemu_core PRIVATE -g1 ) target_include_directories(xemu_core PRIVATE + "${nv2a_vsh_cpu_SOURCE_DIR}/src" "${REPO_ROOT}" "${REPO_ROOT}/include" "${REPO_ROOT}/ui" @@ -912,6 +923,12 @@ target_include_directories(xemu_core PRIVATE add_dependencies(xemu_core glib_ep) +target_link_libraries(xemu_core PRIVATE + nv2a_vsh_emulator + nv2a_vsh_cpu + nv2a_vsh_disassembler +) + if(TARGET SDL2::SDL2) target_link_libraries(xemu_core PRIVATE SDL2::SDL2) endif() diff --git a/android/app/src/main/cpp/nv2a_vsh_emulator_stub.c b/android/app/src/main/cpp/nv2a_vsh_emulator_stub.c deleted file mode 100644 index d06d142ee9..0000000000 --- a/android/app/src/main/cpp/nv2a_vsh_emulator_stub.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "nv2a_vsh_emulator.h" - -Nv2aVshParseResult nv2a_vsh_parse_program(Nv2aVshProgram *program, - const uint32_t *code, - uint32_t code_length) -{ - (void)program; - (void)code; - (void)code_length; - return NV2AVPR_SUCCESS; -} - -void nv2a_vsh_program_destroy(Nv2aVshProgram *program) -{ - (void)program; -} - -Nv2aVshExecutionState nv2a_vsh_emu_initialize_xss_execution_state( - Nv2aVshCPUXVSSExecutionState *linkage, - float *constants) -{ - Nv2aVshExecutionState state; - state.linkage = linkage; - state.constants = constants; - return state; -} - -void nv2a_vsh_emu_execute_track_context_writes( - Nv2aVshExecutionState *state, - const Nv2aVshProgram *program, - bool *constants_dirty) -{ - (void)state; - (void)program; - (void)constants_dirty; -} diff --git a/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt b/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt index 08fd0fecfb..05351e0b91 100644 --- a/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt +++ b/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt @@ -101,6 +101,9 @@ class MainActivity : SDLActivity(), InputManager.InputDeviceListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) DebugLog.initialize(this) + val rendererPref = getSharedPreferences("x1box_prefs", Context.MODE_PRIVATE) + .getString("setting_renderer", "vulkan") ?: "vulkan" + nativeSetenv("XEMU_RENDERER", rendererPref) OrientationLocker(this, landscapeOnly = true).enable() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) val requestedSlot = intent?.getIntExtra(EXTRA_AUTO_LOAD_SNAPSHOT_SLOT, 0) ?: 0 diff --git a/hw/xbox/nv2a/pgraph/glsl/psh.c b/hw/xbox/nv2a/pgraph/glsl/psh.c index af422e02e5..6d16bc4318 100644 --- a/hw/xbox/nv2a/pgraph/glsl/psh.c +++ b/hw/xbox/nv2a/pgraph/glsl/psh.c @@ -1774,7 +1774,7 @@ void pgraph_glsl_set_psh_uniform_values(PGRAPHState *pg, } } if (locs[PshUniform_texScale] != -1) { - values->texScale[0] = 1.0; /* Renderer will override this */ + values->texScale[i] = 1.0; /* Renderer will override this */ } } diff --git a/hw/xbox/nv2a/pgraph/vk/texture.c b/hw/xbox/nv2a/pgraph/vk/texture.c index 1885118ea8..493a1d7b11 100644 --- a/hw/xbox/nv2a/pgraph/vk/texture.c +++ b/hw/xbox/nv2a/pgraph/vk/texture.c @@ -440,9 +440,23 @@ void pgraph_vk_mark_textures_possibly_dirty(NV2AState *d, static bool check_texture_dirty(NV2AState *d, hwaddr addr, hwaddr size) { + hwaddr vram_size = memory_region_size(d->vram); + + if (size == 0 || addr >= vram_size) { + return false; + } + if (size > vram_size - addr) { + size = vram_size - addr; + } + hwaddr end = TARGET_PAGE_ALIGN(addr + size); addr &= TARGET_PAGE_MASK; - assert(end < memory_region_size(d->vram)); + if (end > vram_size) { + end = vram_size; + } + if (end <= addr) { + return false; + } return memory_region_test_and_clear_dirty(d->vram, addr, end - addr, DIRTY_MEMORY_NV2A_TEX); }