Skip to content
HayatoGPublic

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

1 watching

Forks

Latest commit

 

History

54 Commits

Folders and files

Repository files navigation

Perbandingan Pengalaman Pengguna Menggunakan Pengguna I Love Pdf Memahami Hebat Menentukan

Dalam artikel ini, smallpdf memberikan pengalaman yang lebih lancar dan cepat, kita akan melihat I Love Utama Tahu Harian Pengalaman Pengguna Adalah Mana Semua Pengubah setiap ciri yang ditawarkan oleh kedua-dua platform, i love pdf dan smallpdf adalah dua alat pengubah pdf yang popular di kalangan pengguna.

Namun, i love pdf dan smallpdf: analisis kelebihan dan kekurangan, kita akan mengkaji setiap ciri dengan teliti untuk membantu anda memahami kelebihan dan kekurangan masing-masing, ia datang dengan kos langganan yang mungkin tidak sesuai I Love Pdf Tahu Pendapat Pengguna Anda Faktor untuk semua pengguna.

I Love Mengapa Saranan Dalam Perbandingan Menyediakan Dapat

I love pdf memberikan I Love Bagaimana Lengkap Harga Adalah Faktor Sama Pelbagai Sesetengah pilihan percuma yang hebat untuk penggabungan dan pemisahan fail, pemilihan antara i love pdf dan smallpdf boleh menjadi mencabar.

Smallpdf menawarkan kelajuan dan kualiti output yang lebih baik, panduan ini akan membekalkan anda dengan maklumat yang diperlukan untuk membuat keputusan yang bijak, pengguna juga perlu I Love Ciri Panduan Panduan Memilih Antara I Dan Penggunaan mempertimbangkan faktor seperti had saiz fail dan keperluan internet, dengan maklumat ini.

I Love Utama Lebih Memilih Antara Nilai Menilai Prestasi

I love I Love Pdf Utama Lengkap Pdf Perbandingan Antara I Mempunyai Perlukan Nilai pdf dan smallpdf: panduan pemilihan untuk pengguna, dan kekurangan masing-masing, dalam artikel ini, i love pdf menawarkan pelbagai fungsi percuma.

Smallpdf menawarkan ciri premium dan kecekapan yang mungkin lebih sesuai untuk pengguna profesional, memahami perbezaan ini Kelebihan Dan Kekurangan Harian Harga Utama Memilih Antara I Apa Kecepatan Langganan penting untuk memilih alat yang paling sesuai dengan keperluan pemprosesan pdf anda, kita akan membincangkan pilihan terbaik untuk profesional yang memerlukan pengurusan dokumen yang efisien.

Smallpdf menawarkan I Love Pdf Pilihan Kesimpulan Dalam Panduan Lengkap Perkara Sahaja pengalaman premium dengan lebih banyak ciri, sementara smallpdf memberikan pengalaman premium dengan lebih banyak ciri, dengan memahami ciri-ciri ini, dengan maklumat ini, mengapa memilih i love pdf berbanding smallpdf.

I Love Pdf Kesimpulan Diketahui Yang Memilih I Love Saranan Mempunyai

Ketahui apa yang pengguna katakan sebelum membuat pilihan, dan penukaran dokumen dengan antaramuka yang mesra pengguna, i love pdf menyediakan pelbagai alat percuma yang I Love Pdf Yang Harian Memilih Pelajar Sering Baik Harga Berbanding mesra pengguna, artikel ini bertujuan untuk memberikan panduan yang jelas mengenai pilihan yang ada.

English below · Bibliotecas · Problemas conhecidos · Hooks e perfil do jogo · Changelog · YouTube · Discord

Repositório só local. Sem GitHub, sem remoto, sem push (por enquanto). É aqui que se acumula tudo o que um jogo de PS4 precisa para rodar nativo no PC, e que hoje vai copiado em cada port: tlg_pc (The Last Guardian), gr2_pc (Gravity Rush 2) e infamous_pc (inFAMOUS Second Son, GitHub iss_pc).

Por HayatoG · Licença GPL-2.0-or-later (port/LICENSE, port/UPSTREAM.md) · Nenhum arquivo da Sony entra aqui (eboot, prx, sprx, psarc, sfo, arte oficial): o .gitignore barra os formatos.

O que é

Um port nativo roda o executável do jogo (o eboot.bin descriptografado do dump do jogador) direto no x86-64 do PC, sem emular a CPU. Para isso o núcleo fornece três coisas:

  1. Loader e linker (port/src/probe.c, port/scripts/link_modules.py, link_libc.py): mapeiam o eboot e os módulos que vêm com o jogo (libc.prx, libSceFios2.prx…), aplicam relocações, ligam cada import NID#biblioteca a uma função do host e corrigem o que o PC faz diferente (por exemplo, fs:[0] → gs).
  2. As bibliotecas do sistema do PS4 reimplementadas (HLE) em C (port/src/runtime_*.c): libkernel (threads, sincronização, memória, arquivos, tempo), Pad, AudioOut, Ajm (ATRAC9/MP3), SaveData, UserService, SystemService, Rtc, AppContent, Sysmodule, PlayGo, Videodec, NpManager/Trophy offline, Http/Ssl/Net stubs, diálogos… O catálogo completo, função por função, com o que é real e o que é stub e quais jogos usam: docs/LIBRARIES.md.
  3. A camada de GPU (port/gpu/): um fork do shadPS4 que traduz os command buffers do GCN (libSceGnmDriver) e os shaders para Vulkan, mais VideoOut, AvPlayer e o shim/ (janela SDL3, overlay, menu Insert, upscalers, pós-processamento).

Cada port fica só com o que é do seu jogo: os runtime_<slug>*.c com as funções que só ele usa, patches, perfil, launcher, ícone e documentação.

Layout

ps4_core/ README.md, CORE_MANIFEST, CORE_SOURCE docs/ LIBRARIES.md (gerado), KNOWN_ISSUES.md, CHANGELOG.md tools/ core_sync.py (sincronizar com os ports), list_exports.py (gera docs/LIBRARIES.md) scripts/ ferramentas genéricas: make_game_view.py, session_chart.py, sce_imports.py, psarc_toc.py, FTP/USB port/ mesmos caminhos de um repositório de port: src/ probe.c (loader), runtime.c (resolve), runtime_*.c (bibliotecas), import_names.inc, runtime_game.h (tabela de hooks do jogo), game_none.c (build só do núcleo), runtime_profile.c (perfil do jogo), mouse_stick.h, compat_win.*, *_hook.h games/ game_<slug>.c e profile_<slug>.ini prontos para tlg/gr2/infamous, migration/*.patch scripts/ prepare.py, link_modules.py, link_libc.py, content_profile.py, patches.py, mods.py, … gpu/ shadps4/ (fork), shim/, CMakeLists.txt, patches/, dlss_bridge/, third_party/ (submódulos) third_party/LibAtrac9 (submódulo) tests/, tools/, docs/ (GPU), packaging/ (genérico), launcher/tlg_vulkan.py build.sh, run.sh, run.py, msys2-env.sh, shell.nix 

O CORE_MANIFEST é a lista exata do que é núcleo (globs, exclusões ! e submódulos @) e a fonte de verdade do core_sync.py. O CORE_SOURCE diz de qual commit de cada port veio cada parte. Os caminhos são iguais aos de um port, então comparar e copiar é direto. A raiz docs/ e tools/ são só deste repositório (não entram no manifesto).

Submódulos

fsr-vulkan, imgui, magic_enum, miniz, vulkan-headers, xbyak (em port/gpu/third_party/) e port/third_party/LibAtrac9, nos mesmos commits da main do inFAMOUS, com o .gitmodules nas URLs oficiais. Num clone novo: git submodule update --init (com rede) ou, offline, apontar submodule.<nome>.url para um checkout local e usar git -c protocol.file.allow=always submodule update --init.

O que é núcleo e o que é de cada jogo

Núcleo (ps4_core)De cada jogo (fica no port)
port/src/ menos o que está à direitaport/src/runtime_<slug>*.c: runtime_tlg.c, runtime_gr2*.c, runtime_infamous.c
import_names.inc (união de todos os jogos)port/src/game_<slug>.c: a tabela RuntimeGame (modelos em port/games/)
scripts de preparação e link, patches.py (o mecanismo)port/scripts/<slug>_patches.py (ex.: FPS do TLG)
GPU inteira (shadPS4 + shim), submódulosport/profile.ini: padrões do jogo (modelos em port/games/profile_<slug>.ini)
empacotamento genéricoport/packaging/port.env, icon/, README-player.md, windows/*.rc
tlg_vulkan.pyport/launcher/<slug>_*, <slug>_launcher.sh, run_<slug>.sh
ferramentas genéricas de scripts/scripts/<slug>_run.sh e roteiros de teste; README, docs/, CI, dump/, game/

import_names.inc é uma união. A tabela NID → nome não é só diagnóstico: o runtime_lookup resolve imports pelo nome, então um nome faltando é uma função que não liga, e uma entrada a mais não custa nada. Um jogo novo acrescenta as suas linhas aqui (gerar com scripts/sce_imports.py). O docs/LIBRARIES.md lista os nomes das tabelas que ainda não têm linha.

Como um port consome o núcleo

Hoje: cada port tem a sua cópia dos arquivos do manifesto, mantida em paralelo com o tools/core_sync.py (abaixo).

Plano:

  1. Submódulo em port/core (caminho local até existir um remoto). O build.sh e o CMakeLists.txt do port ficam finos: incluem core/port/gpu e compilam core/port/src/*.c + os src/runtime_<slug>*.c + src/game_<slug>.c do próprio port.
  2. Hooks do jogo por tabela (feito, branch feat/game-hooks): o runtime.c não cita mais jogo nenhum. Cada port define const RuntimeGame runtime_game em port/src/game_<slug>.c (port/src/runtime_game.h: slug, name, title_ids, env_prefix, profile, resolvers[] em ordem, init, patch_image, report). O build.sh (e o CMakeLists.txt no Windows) escolhe o arquivo: PORT_GAME=<slug>, senão o PORT_SLUG do port/packaging/port.env, senão o único src/game_*.c, senão src/game_none.c (build só do núcleo). Um jogo novo só precisa de src/game_<slug>.c (+ src/runtime_<slug>.c opcional), packaging/port.env e profile.ini. Detalhes e migração: docs/GAME_HOOKS.md.
  3. O que dois jogos usam subiu para o núcleo: event flags (runtime_eventflag.c) e as consultas de kernel, fuso horário, GetModuleInfoForUnwind, GetPrtAperture, HeapGetTraceInfo, DiscMap, LoadExec, PlayGo dialog e ErrorDialog (runtime_system.c), vindos do runtime_tlg.c e do runtime_gr2.c. Os ports apagam as cópias com port/games/migration/<port>.patch.
  4. Correções do núcleo são feitas aqui (ou num port e trazidas com core_sync.py --pull), e cada port atualiza o núcleo num PR próprio, testado no seu jogo.

Configuração em camadas: cada jogo continua configurável

#CamadaOnde ficaExemplos
1Padrões do núcleocódigo do núcleo (tlg_settings.cpp, runtime_*.c)o que vale quando ninguém disse nada
2Perfil do jogono port: port/packaging/port.env (identidade: nome, slug, título, ícone, PORT_ENV_PREFIX) + port/profile.ini (padrões)modo de readback, orçamento de VRAM (gc_budget_mb=3500 no inFAMOUS), block1d, skip de adjacência, patches de FPS, sensor e touchpad, mapa do mouse, upscaler
3Código do jogoruntime_<slug>*.c + game_<slug>.c + <slug>_patches.py, patches/*.xmlimports que só o jogo usa, correções no eboot
4Escolhas do jogadorlauncher e menu Insert, salvas por jogo: ~/.config/<slug>-launcher/settings.json e port/user/<TITLE_ID>/<prefixo>.ini (hoje port/user/tlg.ini)resolução, FPS, idioma, precisão da GPU, controles

Precedência: núcleo < perfil do jogo < jogador. Variáveis de ambiente valem por cima de tudo, só para testes (ISS_READBACKS=2 ./run_infamous.sh).

Carregador do perfil (feito, port/src/runtime_profile.c): genérico, não conhece jogo nenhum. No começo do main (depois do alias do prefixo) lê o profile.ini (TLG_PROFILE/<PREFIXO>PROFILE, senão o runtime_game.profile no diretório de trabalho, ao lado do executável ou um nível acima) e preenche cada TLG_* que o perfil define e que ninguém definiu antes. Como o launcher passa as escolhas do jogador por variável de ambiente: núcleo < profile.ini < launcher/jogador < ambiente. A seção [settings] dá padrões para chaves do tlg.ini (lida antes do tlg.ini do jogador). Chaves: tsc (host|process|auto), tsc_auto_threshold, readbacks, eager_readback, write_merge, gc_budget_mb, block1d, skip_adjacency, pipeline_binaries, mouse_buttons, motion_button, stick_deadzone, e [env] para qualquer outra TLG_X. Formato completo: docs/GAME_HOOKS.md.

Prefixo das variáveis de ambiente

Hoje o núcleo lê só TLG_ (herdado do primeiro port). Plano em duas etapas:

  1. Agora, um prefixo por jogo:TLG_ (The Last Guardian), GR2_ (Gravity Rush 2), ISS_ (inFAMOUS Second Son). O prefixo vem do runtime_game.env_prefix (game_infamous.c: "ISS_") ou, se o build tiver, do PORT_ENV_PREFIX="ISS_" no port/packaging/port.env, que tem prioridade; o build.sh passa -DPORT_ENV_PREFIX="ISS_" ao compilar o tlg-probe (no Windows, -DPORT_ENV_PREFIX=ISS_ ao CMake), e o alias_port_environment() do probe.c copia cada ISS_X para TLG_X no início do main (se TLG_X não estiver definido). Sem PORT_ENV_PREFIX (TLG, build só do núcleo) não há alias. Jogador, launcher e scripts usam o prefixo do jogo; o núcleo continua lendo TLG_X.
  2. Depois, um prefixo comum PSCORE_ para o que é do núcleo, quando todo port consumir o ps4_core: o carregador procura <PREFIXO>_X, PSCORE_X e por fim TLG_X, avisando uma vez no log quando usar o nome antigo (vem de runtime_game.env_prefix). Nomes internos (tlggpu, tlg-probe, TLG_SHADER_CACHE_KEY) não mudam agora.

Escolhas por jogo que ainda vivem no launcher

  • TSC: o padrão é o rdtsc do host com a frequência medida; TLG_TSC=process usa o relógio do processo (1 GHz, do upstream gow3_pc, para hosts com TSC diferente entre núcleos). Jogo que executa rdtsc direto no código (inFAMOUS: 391 sítios) tem de usar o do host, senão roda 3–4x rápido. tsc=auto no perfil (ou TLG_TSC=auto): o loader conta os 0F 31 no código do eboot preparado (fora dos módulos linkados) e escolhe host com 64 sítios ou mais (tsc_auto_threshold), process abaixo disso, e diz no log (TSC: auto: …). TLG 642, GR2 453, inFAMOUS 391 → host nos três, como hoje (KNOWN_ISSUES #15).
  • Readback antecipado + write merge (TLG_EAGER_READBACK=1, TLG_WRITE_MERGE=1): desligados no núcleo, ligados por padrão só no inFAMOUS. No fence a GPU já copia os buffers que o jogo lê de volta; escritas da CPU sem falta marcam essas cópias como velhas, para uma cópia antiga não sobrescrever bytes novos do jogo (#16).

Build

  • Build só do núcleo:cd port && flock -x <trava> env TLG_LTO=OFF bash build.sh --test compila o tlg-probe com src/game_none.c (sem hooks de jogo) e roda os testes de C (profile-test e eventflag-test incluídos). O empacotamento ainda precisa de port.env, ícone e .rc de um jogo.
  • Testar uma mudança do núcleo num jogo = levá-la ao port (com o game_<slug>.c dele) e compilar lá: cd <port>/port && flock -x <trava> env TLG_LTO=OFF bash build.sh (~5 min no primeiro build).
  • A biblioteca da GPU (cmake -S port/gpu) não depende dos arquivos do jogo no Linux.
  • Dependências: Vulkan, SDL3, FFmpeg (libavcodec/libavutil/libswscale), FreeType (o build.sh usa ../../tools/freetype-devel se o sistema não tiver), Zydis; Windows em MSYS2 CLANG64 (msys2-env.sh).
  • Cache de shaders:<saves>/cache/<TITLE_ID>-<chave> (a pasta --user do tlg-probe, port/user, igual em Linux e Windows; nunca a pasta ~/.local/share/shadPS4 do emulador shadPS4). O path_util.cpp escolhe a pasta no primeiro uso, depois do tlggpu_init definir TLG_GPU_USER_DIR; na primeira partida o cache_storage.cpp traz só a pasta <TITLE_ID>-<chave> atual do lugar antigo (~/.local/share/shadPS4/cache no Linux, user/user/cache no Windows) e apaga as outras chaves do jogo na pasta do port. Os pipeline binaries ficam dentro da pasta com chave. A chave (TLG_SHADER_CACHE_KEY) é o SHA-1 dos fontes do tradutor, calculado pelo CMake. Mesma versão do núcleo = mesma chave em todos os jogos; mudar o tradutor aqui gera chave nova e o cache velho é apagado sozinho. Um port não deve mexer no tradutor localmente.
  • Limpar o cache de shaders: botão Limpar cache de shaders no launcher, ou ./run_tlou.sh --clear-shader-cache (port/launcher/shader_cache.py: só o cache deste jogo, nunca saves, configurações ou logs).

Regras

  • Um jogo por vez, uma trava. O jogo nunca roda junto com um build, com o Ghidra ou com outra instância. Tudo passa pela trava exclusiva: flock -x /tmp/claude-1000/-home-hayatog-decomp/79f27d1d-d3f5-4a2e-a5f3-511e01385ae2/scratchpad/game.lock <comando>, incluindo builds e testes do ps4_core. Um build por vez (32 GB de RAM, /tmp é tmpfs), no máximo dois agentes. O core_sync.py e o list_exports.py só leem: não precisam da trava.
  • Nunca arquivos da Sony no git: eboot, prx, sprx, psarc, sfo, plt, arte oficial. Os link.json/analysis.json dos ports só são lidos pelo list_exports.py; nada deles é copiado.
  • Sem remoto, sem push. Os ports só recebem git fetch origin daqui (nunca push, nunca troca de branch).
  • Commits como HayatoG <[email protected]> com os trailers Co-Authored-By / Claude-Session (ver ~/decomp/REGRAS_AGENTES.md).

tools/core_sync.py

Compara por conteúdo os arquivos do CORE_MANIFEST com a cópia de um port:

tools/core_sync.py --status-all [--fetch] # tabela dos três ports contra origin/main tools/core_sync.py --ref origin/main ~/decomp/tlg_pc # lista os arquivos diferentes tools/core_sync.py --diff --ref origin/main ~/decomp/gr2_pc # com diff (ps4_core -> port) tools/core_sync.py --pull --ref origin/main ~/decomp/tlg_pc # traz o que o port tem de mais novo 

Estados: port-newer (a versão daqui está no histórico do port: o port andou), port-only, diverged (os dois mudaram: mesclar à mão), core-newer (a versão do port está no histórico daqui ou no commit fixado de um port do CORE_SOURCE: o port está atrás), core-only, submodule. O --pull copia port-newer e port-only (com --force, também diverged) só para o working tree: revise com git diff e faça o commit à mão, atualizando o CORE_SOURCE.

Estado em 14/10/2026 (--status-all, depois do sync com o inFAMOUS fd78ad5)

Portorigin/mainDiferentesLeva do portPort atrasado
tlg_pc639d6ce102073 core-newer + 29 core-only
gr2_pc4f5958f124081 core-newer + 43 core-only
infamous_pcfd78ad5 (PR #6)41025 core-newer + 16 core-only (SMAA/CAS, mouse, presenter, PORT_ENV_PREFIX)

Nenhum port tem trabalho de núcleo que falte aqui. Para levar o núcleo a um port: copiar os arquivos core-newer/core-only numa branch do port, compilar e testar o jogo (com a trava), e abrir o PR.

Ferramentas

  • tools/list_exports.py -o docs/LIBRARIES.md: regenera o catálogo de bibliotecas (tabelas RuntimeExport, resolvers por NID, import_names.inc, LIB_FUNCTION da GPU, arquivos de cada jogo e os link.json dos ports). Rode depois de mexer num runtime_*.c.
  • scripts/sce_imports.py: imports de um eboot por biblioteca, para um jogo novo.

ps4_core — shared core of the PS4 native ports

Local-only repository. No GitHub, no remote, no push (for now). Everything a PS4 game needs to run natively on PC accumulates here; today it is copied into each port: tlg_pc (The Last Guardian), gr2_pc (Gravity Rush 2) and infamous_pc (inFAMOUS Second Son, GitHub iss_pc).

By HayatoG · GPL-2.0-or-later · No Sony file goes in (eboot, prx, sprx, psarc, sfo, official art).

What it is

A native port runs the game's own executable (the decrypted eboot.bin from the player's dump) directly on the PC's x86-64 CPU. The core provides:

  1. Loader and linker (probe.c, link_modules.py, link_libc.py): map the eboot and the modules shipped with the game, relocate, bind every NID#library import to a host function, fix PC differences (fs:[0] → gs).
  2. HLE of the PS4 system libraries in C (port/src/runtime_*.c): libkernel, Pad, AudioOut, Ajm, SaveData, UserService, SystemService, Rtc, AppContent, Sysmodule, PlayGo, Videodec, offline NpManager/Trophy, Http/Ssl/Net stubs, dialogs… Full per-function catalogue (real vs stub, which games use it): docs/LIBRARIES.md.
  3. GPU layer (port/gpu/): shadPS4 fork translating GCN command buffers (libSceGnmDriver) and shaders to Vulkan, plus VideoOut, AvPlayer and shim/ (SDL3 window, overlay, Insert menu, upscalers, post-processing).

Ports keep only their game: runtime_<slug>*.c, patches, profile, launcher, icon, docs.

Layout

See the tree above. CORE_MANIFEST lists what is core (include globs, ! excludes, @ submodules) and drives core_sync.py; CORE_SOURCE records which port commit each part came from. Paths under port/ and scripts/ are identical to a port repo; root docs/ and tools/ belong to ps4_core only. Submodules: same commits as infamous main, upstream URLs in .gitmodules.

Core vs per game

Per game: runtime_<slug>*.c, game_<slug>.c and profile.ini (templates in port/games/), <slug>_patches.py, port.env, icon, README-player.md, windows/*.rc, launchers, run/test scripts, README, docs, CI, dump/, game/. import_names.inc is a union of every game's imports (runtime_lookup resolves by name; a missing name is an unlinked function, an extra one costs nothing).

How ports consume it

Today each port carries a copy kept in step with tools/core_sync.py. Plan: (1) the core as a submodule at port/core, thin port build files; (2) done (branch feat/game-hooks): game hooks through the RuntimeGame table (port/src/runtime_game.h), defined by the port in src/game_<slug>.c; build.sh/CMake pick PORT_GAME, else PORT_SLUG from packaging/port.env, else the only src/game_*.c, else src/game_none.c (core-only build). A new game needs only src/game_<slug>.c (+ optional src/runtime_<slug>.c), port.env and profile.ini; (3) done: event flags (runtime_eventflag.c) and the shared kernel queries, time zone, unwind info, PRT aperture, heap trace, DiscMap, LoadExec, PlayGo dialog and ErrorDialog (runtime_system.c) moved out of runtime_tlg.c/runtime_gr2.c; ports drop their copies with port/games/migration/<port>.patch; (4) core fixes land here and each port bumps the core in its own tested PR. Details: docs/GAME_HOOKS.md.

Layered configuration

  1. Core defaults (core code). 2. Game profile (port.env identity + PORT_ENV_PREFIX, profile.ini defaults: readback mode, VRAM budget, block1d, skip-adjacency, FPS patches, motion/touchpad, mouse map, upscaler). 3. Game code (runtime_<slug>*.c, game_<slug>.c, patches). 4. Player choices (launcher and Insert menu, saved per game). Precedence: core < game profile < player; environment variables override everything, for testing only. Profile loader (done, port/src/runtime_profile.c), knowing no game: at the start of main it reads profile.ini (TLG_PROFILE, else runtime_game.profile in the working directory, next to the executable or one level up) and fills each TLG_* the profile sets and nobody set before, so core < profile.ini < launcher/player < environment; [settings] gives defaults for tlg.ini keys (read before the player's tlg.ini). Keys: tsc (host|process|auto), tsc_auto_threshold, readbacks, eager_readback, write_merge, gc_budget_mb, block1d, skip_adjacency, pipeline_binaries, mouse_buttons, motion_button, stick_deadzone, plus [env] for any other TLG_X.

Env prefix plan: now per game — TLG_ (The Last Guardian), GR2_ (Gravity Rush 2), ISS_ (inFAMOUS Second Son): the prefix comes from runtime_game.env_prefix ("ISS_" in game_infamous.c) or, overriding it, PORT_ENV_PREFIX="ISS_" in port/packaging/port.env, build.sh compiles tlg-probe with -DPORT_ENV_PREFIX="ISS_" (CMake option on Windows), and probe.calias_port_environment() copies each ISS_X to TLG_X at start unless TLG_X is set; no define = no alias. Later a common PSCORE_ prefix for core settings once every port consumes ps4_core (lookup <PREFIX>_X, PSCORE_X, then TLG_X, old name logged once). Internal names (tlggpu, tlg-probe, TLG_SHADER_CACHE_KEY) stay.

Per-game choices still in the launchers: TSC — host rdtsc with measured frequency by default, TLG_TSC=process for the process clock; games that execute rdtsc directly (inFAMOUS, 391 sites) must use the host rdtsc (profile tsc=auto counts 0F 31 in the prepared eboot's code at load and picks host at 64+ sites, logging it: TLG 642, GR2 453, inFAMOUS 391 → host, as today; KNOWN_ISSUES #15). Eager readback + write merge (TLG_EAGER_READBACK, TLG_WRITE_MERGE) are off in the core and on by default only in inFAMOUS; CPU writes merged without a fault mark the eager copies stale so an old copy never overwrites the game's new bytes (#16).

Build notes

Core-only build: cd port && flock -x <lock> env TLG_LTO=OFF bash build.sh --test links src/game_none.c and runs the C tests (packaging still needs a game's port.env, icon and .rc). To test a core change on a game, bring it into the port (with its game_<slug>.c) and build there under the lock. The GPU library (cmake -S port/gpu) does not need game files on Linux. Dependencies: Vulkan, SDL3, FFmpeg, FreeType, Zydis; Windows via MSYS2 CLANG64. Shader cache <saves>/cache/<TITLE_ID>-<key> (the probe's --user folder on Linux and Windows, never the shadPS4 emulator's ~/.local/share/shadPS4; the current key's folder is moved from the old location once, other keys are pruned), key = SHA-1 of the recompiler sources: same core, same key in every game; a recompiler change invalidates old caches automatically. The launcher's Clear shader cache button (or ./run_tlou.sh --clear-shader-cache) deletes only this game's cache.

Rules

  • One game at a time, one lock: the game never runs with a build, Ghidra or another instance; everything (ps4_core builds and tests included) goes through flock -x /tmp/claude-1000/-home-hayatog-decomp/79f27d1d-d3f5-4a2e-a5f3-511e01385ae2/scratchpad/game.lock; one build at a time; at most two agents. core_sync.py and list_exports.py only read and need no lock.
  • Never Sony files in git. The ports' link.json/analysis.json are only read by list_exports.py.
  • No remote, no push. Ports only get git fetch origin from here (never push, never a branch switch).
  • Commits as HayatoG <[email protected]> with the Co-Authored-By / Claude-Session trailers.

tools/core_sync.py

--status-all [--fetch] (table of the three ports vs origin/main), --ref, --diff, --pull (copies port-newer and port-only, plus diverged with --force, into the working tree for review). States: port-newer, port-only, diverged, core-newer (port behind; checked against this history and the pinned commits in CORE_SOURCE), core-only, submodule. Status on 2026-10-14 after the infamous_pc fd78ad5 sync: no port has core work missing here; tlg_pc 639d6ce 102 behind (73 core-newer, 29 core-only), gr2_pc 4f5958f 124 behind (81 + 43), infamous_pc fd78ad5 41 behind (25 + 16: SMAA/CAS, mouse, presenter, PORT_ENV_PREFIX; inFAMOUS must add PORT_ENV_PREFIX="ISS_" to its port.env when it takes this core).

Tools

tools/list_exports.py -o docs/LIBRARIES.md regenerates the library catalogue; scripts/sce_imports.py lists a new game's imports per library.

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages