swordpdf relicenses src/, tests/, tools/, examples/ and docs/ from
GPL-2.0-only to GPL-3.0-or-later, as PCSX2 and PS5SX2 are: every SPDX line,
COPYING (the GPL 3 text, which GitHub reads) in place of
LICENSES/GPL-2.0-only.txt, LICENSE.md and the README. The shaders stay
MIT, stb public domain or MIT.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DaNprJCmpBhrkpzRHVPLXM
What PS5SX2 2.00 added on top of the template's m74, made general:
- create() renumbers each pass's bindings 0..n-1 in the SPIR-V, the set
layout and the writes. ps5vk sizes a set's table to its highest binding
number and keeps it in a byte, so FSR3's sparse numbers (up to 405) made
vkCreateComputePipelines fail there. Output is bit-identical on
SwiftShader and lavapipe.
- create(..., frame_format): the game's frames may be B8G8R8A8_UNORM, for
renderers that draw them in a BGRA swapchain's format (fg-test
FG_TEST_BGRA=1 checks the picture is the same).
- PS5_FRAMEGEN_VULKAN_HEADER: build against your own Vulkan header or loader.
- src/ps5_framegen_pacing.h: the pacer, counted in the source's ticks (an
emulated machine's vblanks, or a game loop's) instead of the wall clock,
which fed itself at 60 Hz. It generates only with two refreshes a frame
or more, at a steady frame rate, after 8 frames of warm-up, with the
safety net that pauses generation when it costs an emulator its speed.
tests/test_pacing.cpp: its 911 checks.
- examples/present_loop.cpp drives the pacer, the multiplier from the ticks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DaNprJCmpBhrkpzRHVPLXM
interpolate_next() makes the first frame's still history and quad motions
visible to its compute reads; the quads' motions are cleared on a reset and a
scene change; the refinement scores an off-screen sample as the candidates
do; the GPU timer's optical flow sum is reset with the rest. Docs and the
example: no frame limit counts as tight, the user's own second limit is
taken in, the multiplier is a most (as many frames as the game's interval
has refreshes, less one).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DaNprJCmpBhrkpzRHVPLXM
set_generated(n) and interpolate_next(cmd, i): the interpolation at any
moment t (the previous frame at x + 2t v, the current one at x - 2(1 - t) v,
the blend weighted to the nearer frame), the first frame of a group keeping
the still history and the quads' motions; fg-test --gen N; the example and
the docs (the multiplier, its input lag, the swapchain's images).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DaNprJCmpBhrkpzRHVPLXM
RPCS3-PS5's frame generation (m74) on its own, as a template: FSR3's optical
flow (FidelityFX SDK 2.3.0, MIT, compiled with glslang) and a candidate-based
interpolation that needs no motion vectors or depth; the Vulkan host class,
the SwiftShader test harness with synthetic and real-frame tests, a present
loop example, and the docs (algorithm, integration with pacing and latency,
testing and results).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DaNprJCmpBhrkpzRHVPLXM