pspautotests modules/selfunload and modules/idlist show:
- sceKernelGetModuleId and the self stop/unload calls act on the module the caller's code is in,
not the module that created the thread.
- Address lookups cover text_addr up to the text, data and bss sizes, and refuse kernel addresses
from user mode (ILLEGAL_ADDR).
- sceKernelStopUnloadSelfModule takes (argSize, argp, status, option) and exits with 0. It was
unimplemented for user mode and given the wrong arguments for kernel mode.
- When module_stop returns 0, the module is unloaded and the calling thread exits with its exit
code. A return of 1 gives CAN_NOT_STOP; any other nonzero value gives NOT_REMOVABLE. In both
cases the module stays started and the status gets the value.
- GetModuleIdList refuses a NULL or kernel count pointer.
- text_size leaves out .MIPS.abiflags.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Many games drop to 30fps when they miss a vblank, and on the PSP some of them
nearly always do. In PPSSPP the GE is fast enough that they spend much of their
time at 60 instead, and some things misbehave (Midnight Club).
With the limit on, the GE takes until just after the vblank two on from the one
the previous frame was done in, so the frame goes up every other vblank whether
the game flips as soon as it's done, waits for a vblank first, or latches the
flip. A new frame starts at the first list after a flip, or at a list that
starts after a vblank, for games that enqueue their lists from the vblank
interrupt and never flip (Midnight Club: LA Remix).
Auto applies it to games with the LimitFrameRateTo30 compat flag, the two
Midnight Club games for now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Headless has no config to keep the version the app stores on install, so
it stayed 1 and every XMB boot ran the registry upgrade, rewriting the
defaults of all keys added since 1.50, mapped settings included.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fixes#22920
Map the XMB's /CONFIG/VIDEO keys (UMD menu, audio and subtitle language,
volume, L/R button, sequential playback, title display), the slideshow
speed, CHARACTER_SET/oem and ansi, and the lock password to new config
settings, so they survive a restart. The languages and password are BIN
keys, stored in the config as text ("en", "0000"); a setting of the wrong
length or with unprintable bytes isn't used. Defaults are the values of
our registry dump. Also fix two key names in the mapping comment.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
devctl 0x02425856 sets the code page for 8.3 names (fatms.prx in 6.61
passes the word to sceCodepage). It was only handled on ms0:, and on
fatms0: fell through to the unimplemented path, whose
SCE_KERNEL_ERROR_UNSUP is the 80020325 the XMB showed after changing
System Settings > Character Set. Also check the argument like fatms does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under version 1, a frontend that presents from another thread (RetroArch's
threaded video, now its default) can only hand the core a deferred context,
which can't map a staging texture or read anything back. Texture uploads that
go through a staging texture failed there ("Failed to create DrawPixels
texture"), and so would every readback.
Version 2 shares the immediate context by taking turns. We hold it for the
whole of retro_run and around savestates, reset and unload, wait for the
frame's sync index before taking it, copy the frame into a texture per sync
index and hand that over with set_texture, and let go of it before
video_refresh. A frontend without the negotiation hands out version 1, which
works as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fixes#22748
thin3d never uses these stages, so it never set them. A libretro frontend
shares the immediate context with us, and recent RetroArch leaves its sprite
geometry shader bound after drawing its frame, so every one of our draws went
through it and the core output was black (with threaded video off, where the
core draws on the frontend's context).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the navigation bar hidden, a swipe from the edge brings it back for
a while, over the pause screen's buttons on that edge. Android now also
reports where the navigation bar is when it's hidden, and a screen can
reserve that area with ReserveHiddenNavBar(). The pause screen does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since the native EGL path, the Android context stays current on the
render thread until the render manager and the draw context are gone, and
it's destroyed with every surface. So the GL calls skip mode avoided
after the emu thread exits (Android was the only platform that set it)
can just run, and nothing it would have leaked outlives the context.
It was also a trap: a shader created while it was on was never compiled,
but not marked failed either, so a program linked from it later failed
with "missing shader". Reports of that stopped with 3cb6ada66a, which
already took most of its uses away.
ThreadEnd still frees the steps that never got submitted without running
them, now called a dry run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With a display resolution set (iAndroidHwScale), the surface has a fixed
size, and a rotation doesn't change it, so no surfaceChanged came to
re-fix it there. Landscape kept rendering into the portrait-sized buffer.
A layout listener on the SurfaceView now re-measures and re-fixes it,
which brings a surfaceChanged with the new size.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pixel_in_dps_y is the inverse of a pixel's height in UI coordinates, so use the ratio of the resolutions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Smooth R, G, B and gray ramps, gray steps over the whole range and near
black and white, color bars, two hue wheels (fading to white and to
black), and 1-pixel black and white lines around 128 and 188 patches,
showing whether a resampled image is averaged in linear light or encoded.
The header names the backend and whether VR is on, for comparing outputs.
Also --start-screen=colortest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UIContext's destructor now copes with a context that was never given a
draw context, so a test can measure views with one.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
FlowLayout lays out its children left to right at their natural size and
starts a new row when the next one doesn't fit, instead of squeezing
them. Weighted children fill what's left of their row. Like LinearLayout,
it has SetPadding for space inside its edges.
On narrow screens the toolbar buttons used to run off the edge; now they
wrap onto a second row.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
After measuring the weighted children, the measured size could grow beyond
the AT_MOST size the parent allowed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
At shutdown the kernel objects are cleared before the net module stops
its Apctl thread, so this fired from nearly every game that used it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From going through what report.ppsspp.org still gets from v1.20.4 and
later. The logging stays:
- Module load options: invalid positions are rejected (and reported)
before this, the rest is handled.
- Savedata versions 1-3 are normal, only higher ones are rejected.
- sceNetAdhocMatchingInit, sceIoAssign and the screenshot dialog's init:
every call was reported.
- sceKernelStopUnloadSelfModuleWithStatus is implemented, like the
version without status, which already wasn't reported.
- Thread attributes we ignore, morph and spline vertex types, BREAK, and
the POPS emulator invalidating code near the PC.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Like the queries. Opening a file through the content resolver takes and
drops a stable reference to the provider for each call, and is a few ms
slower: opening for a read or an overwrite went from about 25 and 12 ms
to 22 and 10.5 ms in the storage test, on a phone's SD card. If the
provider has died, it falls back to the resolver.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Creating a taken name on a content URI now fails with ALREADY_EXISTS
(instead of making "name (1)"), so CreateDir failed whenever its
existence check missed the folder, by a race or a failed query. It
promises true for a folder that's already there.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A short sleep takes 15.6 ms on Windows by default, and the pair tests
waited in one about every emulated millisecond, so they ran at about
PSP speed there instead of 8x-16x. joinrace, the longest, hit the
120 s wall timeout. On a Mac with the sleep made 15.6 ms long, joinrace
times out the same way, and with this change it takes as long as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening a content URI now fails with a StorageError (-2 for a file that
isn't there) rather than always -1, and DirectoryFileHandle::Open only
checked for -1. So opening a missing file on the memory stick succeeded,
with fd -2. Seeking it fails, and on 32-bit ReadEntireFile took that as a
4 GB file and the resize threw, which is how saving new savedata crashed.
ReadEntireFile now also catches a failed seek on 32-bit, where it isn't
negative as an s64, and sizes the vector can't hold.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since b1ffcde9fc the output buffer had to hold 1152 stereo samples, but
an MPEG-2 or 2.5 frame makes 576, so a buffer near the end of memory
that fits the frame failed. When the buffer can't take the biggest
frame, decode aside and copy only what the frame made.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since 74178a8106 a data or opt buffer that runs past the end of memory
is passed on as NULL, and SendData and SelectTarget then copied dataLen
or optLen bytes from it, crashing the emulator. Return INVALID_ARG, as
CancelTargetWithOpt already does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Recv, Recvfrom and Recvmsg wanted the game's whole buffer length to be
valid memory (5610c9ff9b), checked again on every retry of a blocked
call. That length is only how much the game can take, as with PdpRecv
and PtpRecv, whose buffers a PSP takes past the end of memory
(pspautotests net/adhoc/pdp and ptp). Now only the start has to be
valid, and the host is given no more than fits. Sends still need all of
the data.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since 74178a8106 the PdpRecv syscall wants the game's whole buffer
length to be valid memory. Gods Eater Burst receives into the end of the
scratchpad (0x00013800) with a length of 2049, one byte past it, so every
receive failed with INVALID_ARG and its multiplayer session never got
the other side's datagrams.
A PSP takes such a buffer, and with nothing waiting leaves the length
alone (pspautotests net/adhoc/pdp). Handle it the way 185bbd5b5d does
for PtpRecv: receive no more than fits in memory, and give the game its
length back if the call fails without waiting.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>