Commit Graph
642 Commits
Author SHA1 Message Date
Henrik Rydgård 4160414b31 Vulkan: remove libretro's global function-pointer wrapper hack
libretro/libretro_vulkan.cpp got PPSSPP's libretro core working with
RetroArch's Vulkan integration by globally monkey-patching PPSSPP's Vulkan
loader function pointers (vkCreateInstance, vkCreateDevice,
vkCreateSwapchainKHR, vkAcquireNextImageKHR, vkQueuePresentKHR,
vkQueueSubmit, etc.) so the unmodified VulkanContext class would end up
wrapping RetroArch's already-existing VkInstance/VkDevice instead of
creating its own, and so a fake VkSwapchainKHR (a self-managed array of
images synced against RetroArch's retro_hw_render_interface_vulkan
callbacks) could stand in for the real swapchain that libretro's Vulkan
model doesn't have. Flagged in-code as "a wacky wrapper".

Replaces that with first-class support in VulkanContext for the two things
libretro actually needs:

- Adopting an externally-created instance/device instead of faking
  vkCreateInstance/vkCreateDevice: VulkanContext::CreateInstanceExternal()
  adopts RetroArch's VkInstance; CreateDevice() gained optional
  extraDeviceExtensions/extraRequiredFeatures params so RetroArch's
  requirements get merged into a real vkCreateDevice() call;
  ownsInstance_/ownsDevice_ flags (the latter set via
  SetDeviceExternallyOwned()) mean DestroyInstance()/DestroyDevice() skip
  the real vkDestroy* calls when something else owns the object, without
  needing to intercept anything. VulkanLoader gained
  VulkanLoadFromGetInstanceProcAddr() for bootstrapping from a
  host-supplied proc-addr getter instead of dlopen/dlsym-ing the loader
  ourselves - vkGetDeviceProcAddr is resolved via the real instance handle
  (not NULL), since per the Vulkan spec it's not one of the handful of
  commands queryable with a NULL instance.
- A pluggable presentation backend (Common/GPU/Vulkan/VulkanPresentation.h)
  for hosts with no real VK_KHR_swapchain, replacing the fake-swapchain-
  handle trick. VulkanContext::GetPresentation() is null by default, so
  every existing platform's real-swapchain code path is untouched;
  libretro/LibretroVulkanPresentation implements this interface directly
  against retro_hw_render_interface_vulkan, as real class state instead of
  file-scope globals. Several pieces of state that are normally only
  populated as a side effect of ReinitSurface()/InitSwapchain() - the
  graphics queue/queue family index (ChooseQueue() is entangled with
  real-surface presentation-support checks), the swapchain format, and
  the available present modes - needed presentation-aware fallbacks since
  libretro never calls that real-surface path at all.

libretro/LibretroVulkanContext.cpp now drives VulkanContext's real, public
API directly - no more hijacked function pointers, no more fake surface or
swapchain. libretro/libretro_vulkan.cpp is deleted.

Verified with a full build+run in RetroArch (not just compile-time
checks): the libretro Makefile doesn't track header dependencies
(cl.exe doesn't support -MMD/-MP, and Makefile.common never sets up an
equivalent), so a `make clean` full rebuild is required after any header
change to avoid linking stale object code from before the change - several
of the fixes above were initially masked by exactly that.
2026-08-06 17:07:05 +02:00
Henrik Rydgård c42a3f070a Implement the new shutdown path for libretro too 2026-08-04 17:45:03 +02:00
Henrik Rydgård be922eca62 Make OpenGL render thread shutdown more robust. 2026-08-04 16:44:55 +02:00
Henrik Rydgård 58d4759ceb Add bounds checking to savestate deserialization
PointerWrap tracked no end-of-buffer, so DoState() implementations could
read past the end of a crafted or truncated savestate via DoVoid's
unchecked memcpy, and DoVector could resize to an attacker-controlled
size before reading.

- PointerWrap now tracks a read end; DoVoid/ExpectVoid fail (MODE_NOOP)
  before reading out of bounds.
- String reads are bounds-checked for the whole string including NUL.
- DoVector rejects sizes that can't fit in the remaining buffer.
- LoadPtr takes the buffer size and sets the read end.
- Capping the decompression buffer allocation in LoadFile.
2026-08-01 11:57:24 +02:00
Henrik Rydgård e3d36e2741 Move the VulkanGraphicsContext to its correct location in Common/GPU/Vulkan 2026-07-26 14:15:15 +02:00
Henrik Rydgård 3eb056ad86 Move Common/GraphicsContext.h to Common/GPU/GraphicsContext.h 2026-07-26 13:58:17 +02:00
Henrik Rydgård 7f218acc53 Change the GraphicsContext interface to be more consistent 2026-07-26 10:22:00 +02:00
Henrik RydgårdandClaude Sonnet 5 abe6786ae1 Rename core to Core and extract it and GPU into their own CMakeLists.txt
Mirrors the earlier Common extraction. The old "core" target folded in
all of GPU/ (~200 files) plus a few ext/ files wholesale; Windows
already treats GPU as its own project (GPU.vcxproj), so GPU/CMakeLists.txt
splits that out too. GPU has a genuine two-way dependency with Core
(Core/System.cpp calls GPU_Init(), GPU/* calls back into Core for
Memory/Config/CoreTiming/etc), so GPU is a CMake OBJECT library: its
object files are always included wherever consumed instead of being
lazily pulled from an archive, avoiding the GNU ld single-pass
archive-ordering problem a two-way STATIC dependency would hit.

Also fixed a few library misattributions discovered while tracing what
each file actually uses:
- GlslangLibs (glslang/spirv-cross) moved from Core to Common, since
  it's Common/GPU/ShaderTranslation.cpp and VulkanContext.cpp that
  call into it directly. It only worked before because Core happened
  to always be linked after Common.
- ZSTD and OPENGL_LIBRARIES/X11_LIBRARIES moved from Core to GPU,
  matching where they're actually called (GPU/Debugger/Record.cpp and
  Playback.cpp for ZSTD, GPU/GLES for raw gl*() calls).
- GPU also needs Ext::Snappy directly (Playback.cpp calls
  snappy_uncompress) and the libretro-common include dir under
  LIBRETRO, both previously inherited for free by accident.

Also fixed USE_DISCORD's add_compile_definitions ordering: it was
being defined after ppsspp_ui's add_library call, so the UI target
never actually saw it on non-MSVC platforms.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSNaZnHCjmryS3ziVN9gZU
2026-07-24 20:16:07 +02:00
Henrik Rydgård af7977267e Add NeedsRenderThread property to GraphicsContext 2026-07-24 15:31:41 +02:00
Henrik Rydgård afe4d5beaf Buildfixes, dependency shuffling to make things more logical 2026-07-24 14:43:34 +02:00
Henrik Rydgård 240a974e95 Remove direct dependency from Core to MacCameraHelper.mm 2026-07-24 12:06:15 +02:00
Henrik Rydgård a7a4c4d110 Merge pull request #21959 from mattakins/fix-ppsspp-vulkan-swapchain-capacity
Libretro: prevent Vulkan launch crashes with large swapchains
2026-07-23 11:34:54 +02:00
Matt Akins a4f83785d9 Libretro: keep Vulkan feature setup valid
- Use VkPhysicalDeviceFeatures2 when supplied by PPSSPP
- Leave pEnabledFeatures null as Vulkan requires
2026-07-22 11:31:25 -07:00
Henrik Rydgård 00a566514e Buildfixes 2026-07-21 14:00:02 +02:00
Matt Akins 1c8c1f99a7 Libretro: support Vulkan swapchains with more than eight images 2026-07-19 14:00:27 -07:00
Henrik Rydgård ca8e54106b Remove libretro setting definition 2026-07-14 20:01:33 +02:00
Mark Pearce 00f5f4fc90 libretro: guard output_audio_buffer with a mutex
System_AudioPushSamples() runs on the emu thread when one is active
(GL/GLCore backends) and appends to / reallocs output_audio_buffer,
while retro_run() on the libretro thread reads .data/.size and resets
.size in upload_output_audio_buffer(), unsynchronized. A realloc on
the emu thread can free the pointer while audio_batch_cb() reads it.

Guard the four access sites with a mutex (<mutex> was already included
in this file, unused). The lock is held across audio_batch_cb() — no
second buffer; worst case the emu thread briefly backpressures while
the frontend syncs audio. Behavior is otherwise unchanged.
2026-07-07 11:02:00 +08:00
Henrik Rydgård 623545bd24 Delete the "Hardware tessellation" feature.
Very hard to maintain and debug, not worth it.
2026-06-16 16:17:14 +02:00
Henrik Rydgård 8c1a1c0410 Fix the rotation problem in Vulkan on libretro.
Replaces #21840
2026-06-16 11:57:40 +02:00
Henrik Rydgård 36bdde68f9 Delete the "Lazy texture cache" option 2026-06-09 23:49:54 +02:00
Henrik Rydgård a317890c08 Remove the GPUDebugInterface class
Just a pointless extra layer in the class hiearchy, making it
unnecessarily hard to modify the interface.

Might as well hit GPUCommon directly.
2026-06-02 11:15:08 +02:00
Henrik Rydgård 33ae88af6d Delete option "Disable range culling". No games are known to require it anymore. 2026-05-31 23:31:06 +02:00
Henrik Rydgård 0b47955c64 Delete geometry shader culling support. Is mostly replaced, and will be fully replaced with software transform. 2026-05-30 19:07:59 +02:00
Mark Pearce 77045b89ad libretro: call SetGLCoreContext(true) in LibretroGLCoreContext
LibretroGLCoreContext is the backend for RETRO_HW_CONTEXT_OPENGL_CORE,
so the frontend hands us a desktop GL Core profile context. But
CreateDrawContext() never told GLFeatures about it — useCoreContext
stayed at its default false and gl_extensions.IsCoreContext stayed
false, so the macOS Core-profile workaround at GLFeatures.cpp:532
(which force-enables ARB_framebuffer_object because Apple's Core
driver doesn't list it as an extension) never fired.

Every glBindFramebuffer(GL_FRAMEBUFFER, g_defaultFBO) in
GLQueueRunner::fbo_unbind then fell through both branches and silently
no-op'd, so the BackBuffer present pass rendered into nothing and
GL_INVALID_OPERATION accumulated. End result: black screen on macOS,
audio and game logic still working.

One-line fix: call SetGLCoreContext(true) before CheckGLExtensions().
2026-05-22 01:43:27 +08:00
Henrik Rydgård 733f886e98 libretro: Apply swapchain timing fix suggested in #21627
See #21627
2026-05-03 23:58:30 +02:00
sonninnos b7d4a54a45 Libretro: Fix serialization hang with opengl emuthread 2026-05-01 03:38:57 +03:00
celerizer 12cfe70df1 only opengl reset if something actually changed 2026-04-07 13:59:22 -05:00
celerizer 72bd0fa4d3 add null-checks on software render path 2026-04-07 11:05:50 -05:00
Chris Healy ba59170b0b OpenGL: Add GLProfiler for GPU timestamp profiling
Adds a new GLProfiler class for GPU-side timestamp profiling, similar to
VulkanProfiler. Uses GL_EXT_disjoint_timer_query (GLES) or GL_ARB_timer_query
(desktop GL).

Features:
- Scoped Begin()/End() profiling with printf-style naming
- Automatic GPU disjoint detection (frequency changes invalidate results)
- Millisecond timing output via INFO_LOG
- Pre-allocated query pool (1024 queries max per frame)
- Nested scope support with indented output

Signed-off-by: Chris Healy <cphealy@gmail.com>
2026-03-18 09:52:43 -07:00
Eric Warmenhoven be85deba21 libretro: Detach glslang from process on shutdown
On Apple platforms without this, glslang doesn't get properly
deinitialized, and will cause a crash on the second play
2026-03-06 11:04:37 -05:00
Henrik Rydgård 8b0144dbfc Get libretro integration working again.
- Fixes #21275

- Fixes #21274
2026-02-18 10:14:37 +01:00
Henrik Rydgård f046857d2b Delete remains of support for the MIPS architecture as host 2026-02-17 10:20:51 +01:00
Henrik Rydgård 9936fcfee3 Libretro: Freeze fix
Broke in #21221, forgot to apply the refactoring with libretro
2026-02-10 08:25:52 +01:00
Katharine Chui f3e11110ed bump aemu_postoffice
extend max pdp block size, due to user report of the following in
dissidia:

07:53:752 MatchingEven I[SCENET]: HLE\sceNetAdhocMatching.cpp:1188 EventLoop[1]: Matching Event [1=HELLO][00:02:02:02:02:02] OptSize=4696
2026-02-06 11:43:32 +01:00
刘皓 924b30b607 Revert "Disable the libretro VFS on non-Android platforms" 2026-02-06 00:04:19 -05:00
Henrik Rydgård 7d987cd78b Make fast_matrix_mul_4x4 inlineable 2026-01-30 14:10:32 +01:00
Henrik Rydgård ed5a052258 Remove unused initial work for adding NEON support to ARM JITs.
Our SIMD strategy for ARM is the JitUsingIR.
2026-01-29 17:41:57 +01:00
Eric Warmenhoven 58eaf56c5e libretro: build fix
gcc9 and the version of msvc19 that the libretro builders use don't
have _mm_storeu_si32. Using _m_cvtsi128_si32 followed by memcpy is
picked up by compilers that support _mm_storeu_si32 as being the same
and they generate the same assembly, so this is no harm to them.
2026-01-28 00:15:35 -05:00
Henrik Rydgård 34938e3de6 Move Notice to Common/UI 2026-01-25 15:10:26 +01:00
刘皓 84b2744fd7 Disable the libretro VFS on non-Android platforms 2026-01-22 12:07:58 -05:00
Katharine Chui 5aa266934b import aemu_postoffice as a submodule instead 2026-01-19 22:14:51 +01:00
Henrik Rydgård f4dbff0f14 Merge branch 'master' into aemu_postoffice_integrate_v2 2026-01-19 11:40:38 +01:00
MMaZaHaKa 9bb01cc127 upd libretro 2026-01-18 23:51:08 +02:00
刘皓 aea42e2cc5 Change RETRO_HW_CONTEXT_DIRECT3D to RETRO_HW_CONTEXT_D3D11 2026-01-12 11:50:40 -05:00
刘皓 75681e46ee Fix libretro builds for iOS and Windows 2026-01-12 11:31:42 -05:00
Katharine Chui bf30de1527 initial github.com/kethen/aemu_postoffice integration ported from github.com/kethen/aemu 2026-01-11 18:53:54 +01:00
Henrik Rydgård 3f3b353350 Merge pull request #21092 from white-axe/libretro-vfs
Use the libretro VFS interface in libretro builds
2026-01-10 16:36:01 +01:00
Henrik Rydgård e33ff46ffd Extract the rewind code from SaveState.cpp, to make it more managable. 2026-01-08 22:22:46 +01:00
刘皓 18ac1ec937 Use the libretro VFS when reading/writing cheats 2026-01-02 17:07:22 -05:00
刘皓 cb3a89542c Enable the libretro VFS in libretro builds that use Make 2026-01-02 12:44:50 -05:00