Offer the existing camera mod for European merged dumps with APP_VER 01.00 only when the unwrapped ELF matches the already documented 1.07 hash. Preserve XML mod filtering and game metadata.
Accept the European title in both runtime hooks while retaining executable segment and instruction signature guards. Test title/version rejection, launcher hash gating and generated hooks against the matching European executable. Gameplay confirmation remains required.
Keep cursor changes in the overlay context and restore the missing 60 FPS label with a compile-time count check. Include guarded camera speed settings, tests, Windows ICU packaging fix and bilingual usage/validation notes.
Based on v2026.10.22-cde38af. Windows build and local checks passed; in-game confirmation and Linux validation of the combined branch remain pending.
The player saw the headlights and the light glare right with mode 4: the
glare shows where the light is in view and disappears behind walls and
characters. Mode 3 (zero counts) stays as the fallback in both launchers;
the Apolar presets follow the new default.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Reproduce SIGSEGV with REP string operations, then verify SSE4A native/model and 78,868,960 F16C comparisons after clearing DF. Show periodic build progress in Actions.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01JyWhQUvUQf2YSf8HJWnAtd
The validation note listed the frozen helper, the packaging manifest and
locked files as not yet tested. They now have real checks: file locks, a second
process holding the install lock, process waits, the tlg-probe.exe name, a
manifest from the packaging command on a real package subset, and a
PyInstaller-frozen stand-in running handoff, apply, confirm and restore with
real processes. The remaining gaps are the full package.sh output, the frozen
Qt launcher and the game.
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
An interrupted in-place update whose temporary folder was deleted blocked the
launcher with an English-only error and no remedy. The state file now records
the managed operations (path, before, after, size) before the first file is
replaced, so the expected hashes survive the journal.
When the journal is missing and the record has operations but no completion:
- every managed file all old, or all new: the install is consistent; the state
is removed and the launcher starts;
- any mixture, or a file matching neither: the state is kept and startup shows
a PT/EN message telling the player to reinstall the release package into the
same folder, keeping user/ and saves. Lock-busy errors get a wait-and-retry
text instead.
Legacy state without operations and completed records keep their behaviour.
Tests cover the state contents, crash before the first replacement, crash after
the last one, and a mixed state. AUTO_UPDATE.md is updated in PT and EN.
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
Verify completed installation hashes when staging disappears and restrict backup cleanup to completed transactions for the same installation. Add recovery regression tests and document remaining Windows validation.
Co-Authored-By: Codex <[email protected]>
Claude-Session: not applicable (Codex session)
Remove references to the deleted lazy_programs field from request diagnostics; retain actual ShaderLoad events. Full Linux build, C suite and focused GPU tests pass. Document the two inherited Python import errors and the limits of the ballot hypothesis.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01JyWhQUvUQf2YSf8HJWnAtd
Resolve GPU conflicts while preserving performance diagnostics, RX 580 controls, support links and manual-only release policy. Keep batch GC eviction single-pass with its original diagnostic reasons. Local validation and gameplay testing follow this integration.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01JyWhQUvUQf2YSf8HJWnAtd
Preserve original contributor commits and main warning throttling. Remove duplicate/default-on coalescer, expose range/split diagnostics, and refresh bilingual compatibility guidance.
Validated 195 Python tests, real Qt and Tk windows, source --selftest, barrier-merge-test, and compilation of image.cpp/vk_runtime.cpp. RX 580 hardware testing remains pending.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01JyWhQUvUQf2YSf8HJWnAtd
Keep PR and main builds, require a manual main dispatch with publish_release enabled, and preserve CI history through artifact retention. Document publication in Portuguese and English.
Validation: YAML parsing, 18 event/ref/input combinations and Bash syntax passed. Linux/Windows Actions and current remote main validation remain pending because GitHub connectivity is unavailable.
Co-Authored-By: Codex <[email protected]>
Claude-Session: not-applicable (Codex)
Unifies the opt-in image-subresource barrier merging from #232 (credit:
@intemerated) with the launcher: an option in Graphics > Window and image
and in Advanced > Image workarounds, plus an experimental preset.
Off by default. Only the exact value TLG_BARRIER_MERGE=1 changes the
barrier stream; every other value keeps the original path.
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
preset_share.py (no Qt) writes and reads a shareable .iss-preset.json with
validation and a diff; import applies it as a full preset through gfxlogic.
Buttons on the Qt Graphics screen and the Tk fixes window; tests added.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Usr5H3NSPjFmG1SRvJmJUA
The currently recommended and AMD presets no longer lower lod_scale, region_lod,
region_fade, far_clip or raise mip_lod_bias. They list those items (and near_clip)
at the native defaults, so applying a preset also sends any earlier custom value
back to native (nothing is stored in tlg.ini). Descriptions and tests updated.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Usr5H3NSPjFmG1SRvJmJUA
A full preset based on "Currently recommended": BP06 (maximal reconvergence, suspected on an RX 7600 with
driver 26.8.1) and BP08 (the driver's pipeline cache file, unverified on AMD) off, and the 1D-image
workarounds (BLOCK1D, BC_TINY, NO_MSAA) forced on instead of Automatic. BP09 is left out on purpose: it
does not fix the RX 580 crash. The current preset now lists BP06 (its default) so that switching back
turns it on again. Each full preset owns only the keys it lists.
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
Co-authored-by: HayatoG <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* GPU: ports from i3-pc (GPL-2.0): variant reuse, heap warm-up, indirect-draw check; copy-wait report
Ported from SotC-project/i3-pc, rewritten for this tree:
- TLG_VARIANT_REUSE=1|check (0120115): GetProgram takes the previous draw's variant without building
its specialization when the flattened user data, runtime info, first bindings and vertex sharps
are unchanged. "check" also builds it and logs a mismatch. Off by default.
- TLG_HEAP_WARM=1 (25f247c): buffers of 256 MB or more bound whole and read-only are remembered per
game (heap_binds.txt) and uploaded 16 MB per submission from the next session's start. Off.
- TLG_INDIRECT_CHECK (7036810): every slot of an indirect draw whose arguments are in plain guest
memory is checked and an absurd draw is dropped; slots the GPU wrote are left alone. On.
- With TLG_PERF_DIAG=1 the host-copy wait is reported per calling line (WaitDiagnostics), to decide
whether the targeted write waits of 0120115 are safe here before porting them: a label write the
guest sees must still follow the copies (UI flicker), which the i3 rule does not cover.
Not ported: variants named by content (7a56fff; no preload conflicts in our logs), copies on worker
threads and non-blocking copy-back (corruption reverted upstream).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Draw distance: LOD scale, LOD bands, regions' LOD_ADJUST and FADE_DISTANCE, near/far clip, texture LOD bias
inFAMOUS 1.07 (signature-checked): the camera LOD factor table, the LOD band distances and the
cameras' default clip planes are kept equal to the menu's values by a shim thread (live); the
regions' LOD_ADJUST (weight 0..1) and FADE_DISTANCE (multiplier) go through four code stubs.
Texture LOD bias (MipLodBias) is added to every draw's samplers, any game.
Menu: Image > Draw distance and detail; tlg.ini keys and ISS_/TLG_ variables
(LOD_SCALE, LOD_BANDS, REGION_LOD, REGION_FADE, NEAR_CLIP, FAR_CLIP, MIP_LOD_BIAS).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Launchers: draw distance options (LOD distance, regions' LOD_ADJUST and FADE_DISTANCE, near/far clip, texture LOD bias)
New 'float' option type in the shared table; Qt Graphics screen section "Draw distance and detail"
(sliders), Tk classic launcher spinboxes. Same tlg.ini keys as the in-game menu.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Defaults from the tuned session: exact reads, BP06 on, BP12 off, sharpening 60, heap warm-up on
Chosen by the maintainer after a good play session (fewer long hitches, no dropped file reads):
- stale_readback off (exact reads; the Performance preset keeps it on, Quality and PS4-faithful
no longer need to turn it off);
- BP06 (maximal reconvergence) on, BP12 (early fragment tests) off;
- sharpening strength 60 instead of 75;
- TLG_HEAP_WARM on (TLG_HEAP_WARM=0 turns it off).
Also fixes the TLG_VARIANT_REUSE=check comparison (stored == fresh, like the lookup) and makes it
log which field differs. TLG_VARIANT_REUSE stays off: the check found differences that still
need explaining.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
---------
Co-authored-by: HayatoG <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* Launcher: compile shaders in the background in every preset, read-ahead off by default
Background shader compilation is no longer turned off by the Quality and PS4-faithful presets.
GPU read-ahead (eager readback) is off by default and old settings.json files are migrated once
(settings_rev 2): in precise mode it made smoke and glow flicker.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Runtime: read game files through a host buffer on Linux too
With precise readbacks the GPU tracker can protect a guest page again between touch_for_write and
the kernel copy, which then fails with EFAULT; after 64 tries the read gave up and left data
missing (10-29 reads per session). Linux now uses the bounce read Windows already had.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* GPU: refuse a shader with an unknown ReadConst pattern instead of ending the game
FlattenExtendedUserdataPass asserted "ReadConst base low not from constant memory" and closed the
game in a new area. It now logs the shader hash and throws UnsupportedShaderError; the pipeline
cache marks the shader (or permutation) failed and skips its draws, in the asynchronous and the
synchronous compile paths. The fault-recovery pointer no longer outlives a throwing capture.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* GPU: experimental texture-cache switches ported from gow3_pc (off by default) and an image report
- TLG_PARTIAL_HEIGHT_VIEWS (gow3_pc #348): an integer read of the top rows of a cached image reuses
that image instead of creating a new one.
- TLG_BACKING_INVALIDATE (gow3_pc #331): textures over memory a readback just wrote are reloaded.
- Exact readback waits (gow3_pc #386, only with stale readbacks): uploads and frees wait only for
copies that share bytes with the image.
- TLG_PERF_DIAG=1 prints every 5 s the images created most often and the partial views used.
The first two are listed in the Advanced screen, off by default; gow3_pc is GPL-2.0.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
---------
Co-authored-by: HayatoG <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* Test: BC 1D on NVIDIA (TLG_BC_TINY=auto, promoted BC 1D answers dimension queries as 1D)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Test script: occlusion and BP09 variants
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Launcher: Advanced screen with the GPU/runtime tuning parameters (switches, numbers, lists)
31 environment-only parameters (synchronisation, threads, readbacks, pipelines, image
workarounds, diagnostics) with bilingual descriptions, Automatic/default handling, search,
restore defaults and a copyable combination. Choices live in tlg.ini (adv_<name>) and reach the
game as ISS_<name> only when changed; the Config: log block shows them.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Test tools: one-round runner, monitor and analyzer for the parameter study
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* GPU: bounded wait for a compiling pipeline (TLG_ASYNC_WAIT_MS) and a faster driver cache save
A draw whose pipeline is still compiling in the background used to be skipped at once (missing
ground or effects while the shader cache is cold). With TLG_ASYNC_WAIT_MS=N (default 0 = off)
it first waits up to N ms for the compile, and the waits of one GPU frame add up to at most
TLG_ASYNC_WAIT_FRAME_MS (default 8). The log gets an 'Async wait (total)' line every 5 s.
The driver cache is saved every 60 s (TLG_DRIVER_CACHE_SAVE_S, was 180).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* GPU: bounded wait for a compiling pipeline (TLG_ASYNC_WAIT_MS) and a faster driver cache save
A draw whose pipeline is still compiling in the background used to be skipped at once (missing
ground or effects while the shader cache is cold). With TLG_ASYNC_WAIT_MS=N (default 0 = off)
it first waits up to N ms for the compile, and the waits of one GPU frame add up to at most
TLG_ASYNC_WAIT_FRAME_MS (default 8). The log gets an 'Async wait (total)' line every 5 s.
The driver cache is saved every 60 s (TLG_DRIVER_CACHE_SAVE_S, was 180).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Launcher Advanced: async wait and driver cache save parameters
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Tools: shader_index.py, an index of the OrbShdr shaders in the player's own dump
Streaming scan of art/cache (.xpps, KCAP + OrbShdr), SQLite index hash -> file/offset/size/stage,
lookup, verify against existing shader caches, stats. Reads the dump only; nothing of the game
is copied or committed.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* GPU: region trace (TLG_REGION_TRACE=1), step A of the per-region pre-warm
Writes region_trace.tsv in the GPU user folder: every .xpps package the game opens (O) and
the first request of each graphics/compute pipeline (P), on one monotonic clock, so an offline
pass can tell which pipelines each region needs before anything is built on top of it.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* GPU: the bounded wait also covers a shader still being translated
A new shader is the usual reason for a skipped draw (its pipeline is only queued once the shader
is translated), so GetProgram waits too, within the same per-draw and per-frame budget.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* GPU: region trace records whether a pipeline was ready; the async wait tally is a warning
The log keeps warnings and above, so the 'Async wait (total)' line never showed. The region trace's
P lines get a fifth column: r = the pipeline existed at its first request, m = it was missing.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs and polish: Advanced screen, pre-warm notes, region trace parameter, test variant 8
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Restore the third_party submodule entries (a worktree's symlinks had been committed)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
---------
Co-authored-by: HayatoG <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* Docs: README for the next release (Qt launcher, saves, BP fixes, occlusion, logs, known problems)
Both halves (pt-BR and en): new What's new items, status table, requirements, launcher section, BP01-BP12 table, occlusion modes, keyboard map, controller guides, saves recipe, logs and reports, known problems by GPU, credits and acknowledgements.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs: experimental fixes (occlusion mode, log lines, sources) and VENDOR credits for BP01-BP12
EXPERIMENTAL_FIXES.md mentions the Qt Fixes screen, the occlusion_mode switch, the Config/Backports log lines and the origin of each fix; VENDOR.txt lists the backport origins.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs: player guide in the package is no longer 'does not boot yet'
README-player.md (pt-BR and en): playable status, Qt launcher screens and classic fallback, game language, saves and updating, lights, experimental fixes, updates screen, logs/report, known problems by GPU, repo link fixed.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs: Qt launcher is the default (LAUNCHER_QT, QT_PACKAGING)
Drop the 'phase 1 / Tk is the default / coming soon' wording, list the eight screens, add the occlusion selector, mouse status and the VERSION file.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs: roadmap updated (done and open items)
ROADMAP.md: what shipped (Qt launcher, saves, BP01-BP12, occlusion, mouse, guides, F16C) and what is open (real occlusion, on-disk pipeline cache, RX 580, 4 GB VRAM, auto updater, mouse and Windows validation).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs: required files (game versions, languages, PC requirements)
ARQUIVOS_NECESSARIOS.md: tested versions, Turkish/Russian caveat, PC requirements, launcher art note (pt-BR and en).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs: Windows packaging README is about inFAMOUS, not God of War III
Names, paths and commands now match this port (Qt and classic launchers, CUSA00223, --selftest); drops the unused TLG launcher texts; notes that the DLSS/FSR4 code is not used; adds a Windows status section.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Launcher script: comment says Qt is the default
Only the header comment of infamous_launcher_qt.sh changes.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Docs: README lights section without unverified scene details
Drops 'night scenes / car' wording that was not backed by the sources.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* CI release notes: drop "Windows not yet tested in game"
Players have been running the Windows package for days (logs, issues and the occlusion fix were
confirmed on Windows), so the line in every release body was wrong.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Fix: the classic (Tk) launcher did not open ('Launcher' has no attribute 'play_button')
show_game_language() runs while the window is still being built and called refresh_status(), which
uses the play button created at the end of build(). Behind it, the note text used str.format on
a string that self.t() had already formatted (KeyError: 'name'). Both fixed, and a test now builds
the real window when a display is available. Introduced by the game language "Automatic" option.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
* Fix: the Qt launcher did not detect Xbox/XInput controllers on Windows
detect_pad only read /proc/bus/input/devices (Linux). It now asks tlg-probe --gamepad
(SDL3, cross-platform) first and keeps /proc as the fallback; XInput, Microsoft, Switch
and DualShock names are recognised and the guide follows the detected pad.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
---------
Co-authored-by: HayatoG <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
Chips pick the controller (the detected one is preselected), the guide image follows the launcher
language and fits the window with scroll and zoom; Save image (PNG), Copy image (clipboard) and Open
images folder. The six generated guides live in launcher/qt/assets/controller_guides/ and are read at
run time; a missing file shows "images not included" instead of failing. The generator is
tools/controller_guides/make_guides.py (the base photos are not in the repository).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
Unit tests for translations (same keys and placeholders in pt/en), chips with
stubs, vulkaninfo/controller/news/save parsing, fix groups and the Backend (skips
without PySide6). docs/LAUNCHER_QT.md: how to run, what Home reads, structure.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
The table defaults are the Recommended profile: rows that are on by default carry a
'recommended' badge, the reset button is now 'Back to recommended', and the window shows
'Profile: Recommended' or 'Profile: custom (N changes)' (BPnn and A/B only). First start
after the update shows a one-time bilingual notice (backports_notice_seen) with
'Open fixes' and 'OK'. No default of the table changes.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BGrrT8Atu6mshYBUh1H1Mm
RX 580 players on amdvlk64.dll crash with a null write at amdvlk64.dll+0xebbbb
right after the game's first BC1 1D texture (512x1 sRGB, 32 layers, Thin1DThin).
It happens with the image created 1D (#16, #31) and also with the PR #36
2D-of-height-1 promotion (#49, v2026.10.15-6b668a0), so the driver mishandles
block-compressed images smaller than a block, not just the 1D type. Upstream
shadPS4 has nothing for this: it still creates BC 1D images, which is why the
player sees the same crash there.
TLG_BC_TINY (ISS_BC_TINY through the probe's alias) decodes BC1-BC5 images that
are 1D or narrower or shorter than 4 texels into plain images: RGBA8 (BC1-3),
R8 (BC4), RG8 (BC5), with the sRGB and snorm variants kept. The driver never
sees a BC image of that shape; 1D ones stay 1D (RGBA8 1D works everywhere), so
these skip the TLG_BLOCK1D promotion. BC6/BC7 and macro-tiled images keep the
old path.
- tlg_bc_decode.h: header-only BC1-BC5 block decoder and the micro-tile
addressing of host_shaders/tiling.comp (one sample, 64/128-bit elements).
- ImageInfo: is_bc_decoded + bc_format; the guest layout (sizes, mips) stays
block-compressed. The image has transfer + sampled usage only, no
block-texel-view flag; views map the T#'s BC format to the decoded one.
- RefreshImage: reads guest memory (CopySparseMemory), detiles and decodes on
the CPU into staging, then uploads with tight copies.
- Decoded images never alias, merge or copy with non-decoded ones, are never
downloaded to guest memory, and are skipped by the texel-buffer and compute
copy/clear shortcuts.
- Default: on for VK_DRIVER_ID_AMD_PROPRIETARY only; TLG_BC_TINY=0/1 decides
otherwise. One log line says which mode is on, and each new shape logs once.
- Shader Profile carries bc_tiny_decode, because it changes which 1D textures
the shaders sample as 2D. A change rebuilds the pipeline cache.
- tests/test_bc_decode.cpp (bc-decode-test): known BC1/2/3/4/5 blocks (4- and
3-colour BC1, BC2/3 always 4-colour, 6/8-value BC4 unorm and snorm) and
micro-tile offsets.
Verified on Linux, RTX 2060 (NVIDIA 595), with TLG_LTO=OFF build.sh and
bc-decode-test passing. Forced on, the game reached gameplay in four 150 s runs,
decoding 512x1x32, 1024x1, 512x1, 256x1, 128x1 and 1x1 BC1/BC4/BC5 textures,
with no new errors. With it off the same runs log 350-440 "BC 1D not
supported" errors. Frame stats are comparable with it on and off: about
24-28 FPS at 1500-4700 draws per frame. The scene varies between runs, and one
early run that was slower overlapped another session's game. A temporary dump
showed the 1024x1 ramp decoding as a smooth gradient, so the detile is right,
and the 512x1x32 array reads all-zero guest memory on both paths. Not tested on
AMD hardware: whether amdvlk64.dll stops crashing still needs an RX 580 player.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01KHxhRF717FsAPVntc7R6zU
Two RX 580 players on AMD's Windows driver crash with a null write at
amdvlk64.dll+0xebbbb right after the log reports "image format
Bc1RgbaSrgbBlock type 1D is not supported": the image was created anyway
(undefined behaviour). NVIDIA logs the same errors but samples BC 1D
correctly, and the promotion breaks HUD elements there, so the default
was off everywhere.
- tlg_block1d.h: AmdGpu::block1d_as_2d, set once in
Instance::CollectDeviceParameters before any image or shader exists.
- Default: on when the driver refuses a sampled BC1 1D image, except
NVIDIA's proprietary driver; TLG_BLOCK1D/ISS_BLOCK1D=0/1 decides
otherwise. One log line says what was chosen.
- IsBlock1D reads the flag instead of a static getenv; the shader
Profile carries it, so a change rebuilds the pipeline cache.
Verified: build.sh (LTO off) builds; on the local RTX 2060 (and llvmpipe)
the BC 1D query fails (-11) and NVIDIA keeps 1D, so nothing changes
here. Not tested on AMD/Intel hardware; the game was not run.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01KHxhRF717FsAPVntc7R6zU
- probe.c: each ISS_X in the environment is copied to TLG_X at start (unless TLG_X is set),
so the player, launcher and scripts use ISS_* while the shared core still reads TLG_* (one
common prefix later, once every port uses ps4_core). Launcher, scripts, README and docs
renamed to ISS_.
- TSC: upstream's process clock at 1 GHz made inFAMOUS run 3-4x too fast (the game executes
rdtsc itself in 391 places). Default is again the host rdtsc with its measured frequency;
TLG_TSC=process (ISS_TSC) opts in.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01JyWhQUvUQf2YSf8HJWnAtd