Repository navigation
ZeroFG: geração de quadros (Zero e ReallyZero) com presenter independente, e SGSR1 Edge Direction - #121
Merged
Conversation
The frame-generation engine of ZeroFG's public release v1.1.0 (https://github.com/hy300leosquizz-ctrl/ZeroFG, tag v1.1.0, commit 2b7711e47680c25dd461110c182ee5dd4a637f99), blob for blob: public headers, engine sources, shader sources, the compiled SPIR-V headers the build uses (no shader tools needed) and the shader compiler script. The host adapter in integration/xenia is the release's host/xendroid adapter. SOURCE.md records the provenance and the mode mapping; LICENSE is the engine's Apache-2.0. Nothing here is built until the next commit wires it in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nter, and SGSR1 Edge Direction ZeroFG generates the frame halfway between two of the game's, so the screen shows twice the game's rate (30 -> 60, 60 -> 120). Off by default; Zero (the layered quality engine) and ReallyZero (dense flow, lowest cost) are chosen in Settings or in the in-game Frame generation menu and switch while the game runs. Only one frame-generation engine runs at a time. - The ZeroFG Independent Presenter: a second Vulkan device on the same GPU (device B) takes each new game frame through an AHardwareBuffer + sync fd handoff, generates the middle frames and presents real and generated frames on the window while ZeroFG runs (main surface authority); Xenia's presenter gives the surface back to it and takes it back on Off or on failure. It paces from the game's real rate and keeps real frames in order. Device B asks for global priority HIGH, and with an adrenotools custom driver a KGSL hook raises its context priority. - Xenia's presenter: IssueSwap records the Source present boundary; the swapchain paint pipeline now records the format it was created for, so it is no longer rebuilt on every paint (native presentation too); refresh-rate votes follow the window's owner; the Plus VblankPacer takes ZeroFG's guest vblank pull (one event ahead at most, repaid). - Plus image controls run on real and generated frames alike. - SGSR1 Edge Direction from XenDroid, with a dither variant, appended as scaling value 6; existing values and the default filter are unchanged. - App: the setting, the in-game selector with Keep/Undo/Make global, a HUD readout that tells the requested mode from the running output, EN and pt-BR strings, tests; docs/ZEROFG.md. Port by Zeromeia (ZeroFG's ChatGPT-powered collaborator), updated to the v1.1.0 engine and reviewed by Zé Raio. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
System link (phforner0#115) added the Network section with Network|systemlink (a switch) and Network|systemlink_peers (text) without updating the inventory test: 176 entries, 120 switches, 3 text fields, and Network after Kernel among the sections. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hy300leosquizz-ctrl
force-pushed
the
zerofg-1.1
branch
from
November 8, 2026 03:12
b22e08f to
e5d21d1
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Traz o ZeroFG para o Xendroid+. Ele gera o quadro do meio entre dois quadros do jogo, e a tela mostra o dobro do ritmo do jogo: 30 fps vira 60, 60 vira 120. Vem desligado por padrão, com dois modos:
O motor é a release pública v1.1.0 do ZeroFG (Apache-2.0), copiada arquivo por arquivo no primeiro commit, com a procedência em
zerofg/SOURCE.md. O README do ZeroFG explica como os motores funcionam, estágio por estágio, e compara com o LSFG 3.1 e o win-fg clipe a clipe.Placar no mesmo laboratório, com a mesma régua para todos. Conta-se o melhor dos dois modos contra o melhor das duas configurações do LSFG:
O win-fg fica atrás em todos os clipes das três tabelas. No Adreno 840, o ReallyZero custa 0,45 / 0,94 / 1,62 ms por quadro (640×448 / 1280×896 / 1920×1344), de 2,1 a 2,6 vezes menos que o LSFG com fluxo cheio.
Como liga e desliga
Troca com o jogo rodando. O renderer desconecta e drena a sessão anterior, devolve a janela e monta o modo novo; nada é destruído no callback da UI do Android. Só um motor de frame generation roda por vez: escolher outro desliga o ZeroFG, e escolher o ZeroFG para o outro. O menu mostra separados o modo pedido e a saída que está de fato rodando.
Requisitos: Vulkan 1.3 com synchronization2 e os storage formats, mais o handoff de imagem e fence do Android (AHardwareBuffer e sync fd). Tudo isso é negociado quando o aparelho suporta, mesmo com o ZeroFG desligado, para ele poder ser ligado depois sem reiniciar o jogo. Aparelho que não qualifica continua na apresentação nativa, e o piso de Vulkan do Plus não muda.
O que muda no apresentador
O presenter independente do ZeroFG
O ZeroFG traz o próprio presenter, em vez de gerar dentro do presenter do Xenia. Foi escrito para ser portável: o mesmo presenter roda no XenDroid e no ARMSX2.
zerofg_device_handoff); o device B nunca espera na fila do A.VK_QUEUE_GLOBAL_PRIORITY_HIGH. Com driver custom carregado pelo adrenotools, um gancho pequeno (kgsl_priority_hook.c) sobe a prioridade KGSL do contexto dele. Assim o trabalho curto do ZeroFG não fica na fila atrás de um jogo pesado.VblankPacerdo Plus continua. Com o ZeroFG ligado, um pull pode adiantar um evento de vblank, e paga com o seguinte; não adianta um segundo antes de pagar. Com o ZeroFG desligado, a grade nativa não muda.O ritmo (pacing)
Gerar o quadro do meio é metade do trabalho. A outra metade, a que mais custou, é mostrar cada quadro na hora certa sem atrasar o jogo. Não é perfeito, porque nada é, mas fica muito perto:
VK_GOOGLE_display_timing, alinhado ao vsync do painel (quantizador de vsync), e o horário real de exibição volta pelo driver para a medição. A saída acompanha quando o sistema muda a taxa do painel, como o HyperOS baixando para 90 Hz.Medido com esse presenter no Adreno 840:
Os contadores de invariantes do presenter (real descartado, real fora de ordem e outros) ficaram em zero em todas as janelas das sessões do Xendroid+.
Mudanças no presenter do Xenia
IssueSwapregistra a fronteira de present da fonte (RecordSourcePresent), que identifica cada quadro do jogo para o handoff e o ritmo.frame_stats.hguarda as estatísticas de cadência da fonte que o ritmo lê, com teste nativo.SGSR1 Edge Direction
O filtro SGSR1 Edge Direction do XenDroid, com variante com dither, nas Configurações e no menu Imagem do jogo. Entra como valor 6 da escala: os valores existentes mantêm os índices e o filtro padrão não muda. O SPIR-V do SGSR1 e do SGSR1 + dither ficou idêntico byte a byte, e os dois shaders do Edge passam no
spirv-val --target-env vulkan1.0.Testado
Nota para jogos pesados: um jogo que se cadencia por vblank e está no limite da GPU (o Halo 3 nos trechos mais pesados) entrega quadros irregulares. Vem um atrasado e depois vários rápidos para recuperar, e o ZeroFG mostra alguns reais sem gerado entre eles. Pôr o limite de fps do jogo no ritmo dele (30 no Halo 3) deixa tudo uniforme. Está no
docs/ZEROFG.md, com a leitura dos logs doxe.log.Licença
O motor é Apache-2.0 (
zerofg/LICENSE), e oTHIRD-PARTY-NOTICES.mde a página de licenças do app ganham a linha dele. O presenter, o handoff e a cola com o Xenia vêm do mesmo projeto (Apache-2.0 na release pública do ZeroFG) e entram aqui como contribuição a este repositório. Os trechos derivados do Xenia mantêm o aviso BSD.Adds ZeroFG frame generation: the screen shows twice the game's frame rate (30 → 60, 60 → 120).
🎞️ Frame generation
🖼️ Image
🛠️ Fixed
Chega o ZeroFG: a tela mostra o dobro do ritmo do jogo (30 → 60, 60 → 120).
🎞️ Geração de quadros
🖼️ Imagem
🛠️ Corrigido
🤖 Generated with Claude Code