hrydgard / ppsspp

A PSP emulator for Android, Windows, Mac and Linux, written in C++. Want to contribute? Join us on Discord at https://discord.gg/5NJB6dD or just send pull requests / issues. For discussion use the forums at forums.ppsspp.org.
https://www.ppsspp.org
Other
11.33k stars 2.18k forks source link

SOCOM U.S. Navy Seals Fireteam Bravo 2 UCES00543. DOES NOT start #18842

Open Sapelain opened 9 months ago

Sapelain commented 9 months ago

Game or games this happens in

UCES00543

What area of the game / PPSSPP

The game does not start and used to work well. The version I use PPSSPP 1.17.1-4.

What should happen

The game does not start and used to work well. The version I use PPSSPP 1.17.1-4.

Logs

ppsspplog.txt

Platform

Windows

Mobile device model or graphics card (GPU)

Nvidia RTX 3060 TI

PPSSPP version affected

PPSSPP 1.17.1-4

Last working version

PPSSPP 16.5

Graphics backend (3D API)

Vulkan

Checklist

sum2012 commented 9 months ago

@Sapelain What is last working version ? I try PPSSPP v1.16.5 same black screen

anr2me commented 9 months ago

Is this only happened on the Europe version? The US version seems to be okay image

sum2012 commented 9 months ago

I do think so .But Jpcsp emulator can run the game edit:add picture 3

anr2me commented 8 months ago

I wondered whether this red line on UCES00543 was really a crash or not ... image

Display also being disabled not long after that red line apparently image

It keeps looping on this, Next HLE didn't goes anywhere else :( image

Edit: Comparing it with the logs from US version, seems to have the red line too but less lines before it image

And display didn't get disabled image

PS: i'm using 1.6.5-86-gcd0b4fce4 to test these

sum2012 commented 8 months ago

(https://github.com/jpcsp/jpcsp/blob/dbaa4a00b9801fe111e540ba5b73489a39247d6b/src/jpcsp/HLE/modules/sceGe_user.java#L654) https://github.com/hrydgard/ppsspp/blob/25689c36d9c2f3f1b7aa612d89b86caf1809e376/Core/HLE/sceGe.cpp#L387 Our ppsspp code of sceGeListSync doesn't have this check if (mode == 0 && IntrManager.getInstance().isInsideInterrupt()) { log.debug("sceGeListSync (mode==0) cannot be called inside an interrupt handler!"); return SceKernelErrors.ERROR_KERNEL_CANNOT_BE_CALLED_FROM_INTERRUPT; }

I don't know how to translate it

anr2me commented 8 months ago

(https://github.com/jpcsp/jpcsp/blob/dbaa4a00b9801fe111e540ba5b73489a39247d6b/src/jpcsp/HLE/modules/sceGe_user.java#L654)

https://github.com/hrydgard/ppsspp/blob/25689c36d9c2f3f1b7aa612d89b86caf1809e376/Core/HLE/sceGe.cpp#L387

Our ppsspp code of sceGeListSync doesn't have this check if (mode == 0 && IntrManager.getInstance().isInsideInterrupt()) { log.debug("sceGeListSync (mode==0) cannot be called inside an interrupt handler!"); return SceKernelErrors.ERROR_KERNEL_CANNOT_BE_CALLED_FROM_INTERRUPT; }

I don't know how to translate it

You can check whether it's inside interrupt or not like this isn't? https://github.com/hrydgard/ppsspp/blob/25689c36d9c2f3f1b7aa612d89b86caf1809e376/Core/HLE/sceDisplay.cpp#L904

sum2012 commented 8 months ago

if (mode == 0 && __IsInInterrupt()) { unlucky don't fix

anr2me commented 8 months ago

I think the main problem is this invalid argument:

20:23:822 user_main    D[SCEGE]: HLE\sceGe.cpp:339 sceGeListEnQueue(addr=08c99f98, stall=00000000, cbid=ffffffff, param=00000000)
20:23:822 user_main    D[SCEGE]: HLE\sceGe.cpp:348 35000002=sceGeListEnQueue(08c99f98, 00000000, -1, 00000000[invalid])
20:23:822 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceGeListSync
20:23:822 user_main    D[SCEGE]: HLE\sceGe.cpp:385 sceGeListSync(dlid=35000002, mode=00000000)
20:23:822 idle0        D[FRAMEBUF]: Common\FramebufferManagerCommon.cpp:1 Display disabled, displaying only black
20:23:835 idle0        D[FRAMEBUF]: Common\FramebufferManagerCommon.cpp:1 Display disabled, displaying only black
(Repeated for the rest of the logs)

Edit: Nevermind, the US version also have invalid arg (but different error code or was it id) and disabling the display, but after creating FBO (EU version didn't create the FBO)

31:55:087 user_main    D[SCEGE]: HLE\sceGe.cpp:339 sceGeListEnQueue(addr=08c8b918, stall=00000000, cbid=ffffffff, param=00000000)
31:55:087 user_main    D[G3D]: GPU\GPUCommon.cpp:844 Starting DL execution at 08c8b918 - stall = 00000000
31:55:087 user_main    D[G3D]: Common\FramebufferManagerCommon.cpp:312 Est: 04000000 V: 0x0, R: 1x1, S: 1x1, STR: 4, THR:0, Z:44600000 = 1x1
31:55:087 user_main    W[FRAMEBUF]: Common\FramebufferManagerCommon.cpp:1 Creating 565 FBO at 04000000/00000000 stride=0 1x1 (force=1)
31:55:089 user_main    I[FRAMEBUF]: Common\FramebufferManagerCommon.cpp:5 Creating FBO for 04000000 (z: 00000000) : 1 x 1 x 565
31:55:089 user_main    D[G3D]: Common\VertexDecoderCommon.cpp:1099 VTYPE: THRU=1 TC=3 COL=7 POS=3 NRM=0 WT=0 NW=1 IDX=0 MC=1
31:55:089 user_main    D[G3D]: Common\VertexDecoderCommon.cpp:1274 SVT : size = 24, aligned to biggest 4
31:55:089 user_main    D[SCEGE]: HLE\sceGe.cpp:348 35000000=sceGeListEnQueue(08c8b918, 00000000, -1, 00000000[invalid])
31:55:089 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceGeListSync
31:55:089 user_main    D[SCEGE]: HLE\sceGe.cpp:385 sceGeListSync(dlid=35000000, mode=00000000)
31:55:089 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceGeDrawSync
31:55:089 user_main    D[SCEGE]: HLE\sceGe.cpp:396 sceGeDrawSync(mode=0)  (0=wait for completion, 1=peek)
31:55:090 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceDisplaySetFrameBuf
31:55:090 user_main    D[SCEDISP]: HLE\sceDisplay.cpp:901 0=sceDisplaySetFrameBuf(00000000, 0, 0, 1): disabling display
31:55:090 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceDisplaySetMode
31:55:090 user_main    D[SCEDISP]: HLE\sceDisplay.cpp:793 0=sceDisplaySetMode(0, 480, 272)
31:55:090 user_main    D[SCEDISP]: HLE\sceDisplay.cpp:535 Setting latched framebuffer 00000000 (prev: 04000000)
31:55:090 user_main    D[FRAMEBUF]: Common\FramebufferManagerCommon.cpp:1 Display disabled, displaying only black
31:55:102 user_main    I[CPU]: MIPS\MIPSVFPUUtils.cpp:826 Loading 'vfpu/vfpu_asin_lut65536.dat'...
31:55:102 user_main    I[CPU]: MIPS\MIPSVFPUUtils.cpp:835 Successfully loaded 'vfpu/vfpu_asin_lut65536.dat'
31:55:102 user_main    I[CPU]: MIPS\MIPSVFPUUtils.cpp:826 Loading 'vfpu/vfpu_asin_lut_indices.dat'...
31:55:103 user_main    I[CPU]: MIPS\MIPSVFPUUtils.cpp:835 Successfully loaded 'vfpu/vfpu_asin_lut_indices.dat'
31:55:104 user_main    I[CPU]: MIPS\MIPSVFPUUtils.cpp:826 Loading 'vfpu/vfpu_asin_lut_deltas.dat'...
31:55:105 user_main    I[CPU]: MIPS\MIPSVFPUUtils.cpp:835 Successfully loaded 'vfpu/vfpu_asin_lut_deltas.dat'
31:55:107 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceKernelDcacheWritebackAll
31:55:107 user_main    D[SCEGE]: HLE\sceGe.cpp:339 sceGeListEnQueue(addr=08400000, stall=00000000, cbid=00000000, param=09ffdd30)
31:55:107 user_main    D[G3D]: GPU\GPUCommon.cpp:844 Starting DL execution at 08400000 - stall = 00000000
31:55:108 user_main    D[SCEGE]: HLE\sceGe.cpp:348 35000001=sceGeListEnQueue(08400000, 00000000, 0, 09ffdd30[00000010])
31:55:108 idle0        D[CPU]: HLE\sceGe.cpp:121 Entering GE interrupt handler 088193b8
31:55:108 idle0        D[HLE]: HLE\HLE.cpp:694 Compiling syscall to __KernelReturnFromInterrupt
31:55:108 user_main    D[SCEGE]: HLE\sceGe.cpp:396 sceGeDrawSync(mode=0)  (0=wait for completion, 1=peek)
31:55:108 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceKernelVolatileMemUnlock
31:55:108 user_main    D[HLE]: HLE\scePower.cpp:377 0=sceKernelVolatileMemUnlock(0)
31:55:108 user_main    D[HLE]: HLE\scePower.cpp:319 sceKernelVolatileMemTryLock(0, 08d1908c, 08d19088) - success
31:55:108 user_main    D[SCEDISP]: HLE\sceDisplay.cpp:903 0=sceDisplaySetFrameBuf(04000000, 512, 0, 1)
31:55:108 user_main    D[SCEGE]: HLE\sceGe.cpp:339 sceGeListEnQueue(addr=08400000, stall=00000000, cbid=00000000, param=09ffdd30)
31:55:108 user_main    D[G3D]: GPU\GPUCommon.cpp:844 Starting DL execution at 08400000 - stall = 00000000
31:55:108 user_main    D[SCEGE]: HLE\sceGe.cpp:348 35000002=sceGeListEnQueue(08400000, 00000000, 0, 09ffdd30[00000010])
31:55:108 idle0        D[CPU]: HLE\sceGe.cpp:121 Entering GE interrupt handler 088193b8
31:55:111 user_main    D[HLE]: HLE\HLE.cpp:694 Compiling syscall to sceCtrlSetSamplingMode
31:55:111 user_main    D[SCECTRL]: HLE\sceCtrl.cpp:450 sceCtrlSetSamplingMode(1)

So, the difference is, it's missing the user_main D[G3D]: GPU\GPUCommon.cpp:844 Starting DL execution at 08c8b918 - stall = 00000000 between two sceGeListEnQueue logs (was both of them from a single call to sceGeListEnQueue?)

Somewhere after GPUCommon::EnqueueList might failed to ProcessDLQueue(); without showing the reason in the logs.

Linblow commented 8 months ago

The problem lies in the game's bootloader (E/BOOT.BIN), as replacing the EU BOOT.BIN by the the US BOOT.BIN results in the EU game starting and working just fine. I took a closer look at the boot code, and the difference is the EU BOOT seems to do a bunch of graphics calls (GE/GU) which the US doesn't, although there is no graphics output in either boot, so I'm not sure what's the issue is here but definitely GE/GU related.

Note the bootloader only does one thing: load and start the appropriate game's module (SOCOMPSP.PRX). If an external patch exists, it tries to load it. On failure or when no such file exists, it fallbacks to running the default module in the UMD/ISO. Then the bootloader unloads itself, after starting the game's main module. This is why it's fine replacing the EU E/BOOT by the US one.

MakerManu commented 3 months ago

Guys so have you solved the problem? I don't know how to do it.