GitHub read LICENSE.md's table of licences next to COPYING and reported
"Other". The table's contents move into the README's Licences section
(fg_shaders.inc MIT like the shaders it is compiled from; GPL-2.0-only up
to cb951d5) and LICENSE.md goes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DaNprJCmpBhrkpzRHVPLXM
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
- .github/workflows/ci.yml: on every push and pull request, fg-test's
scenes on Mesa's lavapipe against tools/check-scenes.py's limits (about
1.5x today's scores, plus at most a fifth of a plain blend's error, plus
BGRA = RGBA), the pacer's test with GCC and Clang -Werror, the example
compiled, and the shaders rebuilt with glslang 16.2.0 (pinned, cached)
and compared with src/framegen/fg_shaders.inc.
- README: what the template gives, both emulators it runs in, the quick
start on lavapipe, the integration with the pacer, the PS5 notes.
- docs/integration.md: the pacer, the frames' format, your own loader,
RADV and ps5vk, the 120 Hz param.json (attribute3 524352) and
PS5VK_PARAM_JSON, ps5vk's binding numbers.
- docs/testing.md: what CI runs and how to run it locally, the baseline
scores on SwiftShader and lavapipe.
- LICENSE.md: copyright swordpdf; .gitignore: *.pyc.
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
The shaders need shaderStorageImageExtendedFormats and subgroup quad
operations in compute (FSR3's luminance pyramid), which create() does not
check: the README said any Vulkan 1.1 device. The pacing doc gave 3.8 as
the step from 2 repeats to 3; the code steps at 2.9 and back below 2.8.
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