--- id: AGD-0050 ticket: portable-host-backend-strategy title: Portable Host Backend Strategy status: open created: 2026-07-14 resolved: decision: tags: [host, desktop, portable, sdl, backend, rendering, input, audio, linux, android, handheld] --- ## Contexto O runtime ja tem uma fronteira de host relativamente clara: o host desktop atual vive em `crates/host/prometeu-host-desktop-winit`, usando `winit`, `pixels` e `cpal` para janela, apresentacao de framebuffer, input e audio. A direcao desejada nao e substituir esse host de forma disruptiva no primeiro corte. A proposta e estudar e construir um segundo host portatil para servir como runtime host em handhelds e consoles portateis, especialmente hardwares chineses que rodam Linux internamente e, em alguns casos, Android customizado. O mesmo host tambem deve servir como base para uma futura versao DIY do hardware, desde que ela rode sobre um Linux base compatível. SDL e a hipotese principal, mas a agenda tambem deve avaliar outras familias de host/backend antes de virar decisao normativa. Esse novo host deve conviver com o host atual durante estabilizacao, mas nao e descartavel: ele e candidato a se tornar o host principal quando provar paridade e estabilidade. A troca deve ficar isolada no dominio de host: contratos de runtime, firmware, frame, input semantico e audio semantico nao devem mudar por causa da escolha de backend. Essa separacao e justamente o objetivo arquitetural que permite que um host portatil evolua para principal sem arrastar o runtime. ## Problema Hoje a existencia de um unico host desktop torna dificil separar problemas do runtime de problemas do adaptador de plataforma. Um novo host portatil pode ajudar em testes, portabilidade, comparacao operacional e reducao de dependencia de uma pilha unica de janela/render/audio. O alvo "mobile" desta agenda nao significa telefone/tablet como produto primario; significa hardware portatil dedicado, geralmente com controles fisicos, framebuffer/display integrado, Linux customizado e distribuicao fora do modelo desktop tradicional. O alvo tambem inclui um possivel handheld DIY futuro, em que o valor esperado e ja existir um host pronto se o dispositivo expuser um Linux base suficiente. O risco e tratar uma tecnologia especifica como resposta antes de comparar os requisitos reais de Linux handheld e Android. A agenda precisa cravar o modelo de host paralelo em estabilizacao, com destino de host principal, e entao escolher a familia de backend que melhor atende esse objetivo. ## Pontos Criticos - A troca de host deve ser simples e local ao host, sem exigir mudancas em runtime, firmware, asset protocol, render packet, VM ou syscalls. - O novo host precisa consumir as mesmas saidas canonicas do runtime: frames RGBA8888, comandos semanticos de audio e eventos de input normalizados. - A estrategia deve preservar o host `winit` enquanto o novo host ainda nao provar equivalencia operacional, mas o novo host e candidato a virar o host principal depois dessa prova. - O alvo primario e portabilidade operacional para handhelds Linux e consoles portateis com controles fisicos; Android customizado e um alvo possivel que deve influenciar a escolha de API, packaging e input/audio. - O host portatil deve ser viavel em um futuro hardware DIY rodando Linux base, sem exigir um runtime especial ou fork de contratos. - Testes devem distinguir contrato comum de host de detalhes especificos de backend. - SDL2 pode ter ecossistema Rust mais estabelecido; SDL3 pode estar mais alinhado com a direcao upstream. A escolha da versao e uma pergunta separada da decisao de criar um segundo host. - A arquitetura deve evitar duplicar logica de runtime loop, pacing, debugger, stats e presentation policy quando essa logica for comum a qualquer host. - Outras familias de host tambem devem ser avaliadas: evoluir `winit`, SDL2/SDL3, backend Android nativo, ou uma camada multiplataforma alternativa. ## Opcoes ### Opcao A - Manter apenas o host winit atual - **Abordagem:** continuar evoluindo `prometeu-host-desktop-winit` como unico host desktop. - **Pro:** menor custo imediato; evita nova dependencia nativa. - **Con:** mantem a pilha de plataforma unica como ponto de acoplamento pratico. - **Tradeoff:** bom para estabilidade curta, fraco para provar independencia real do host. ### Opcao B - Migrar diretamente do host winit para outro backend - **Abordagem:** substituir o host desktop atual por um novo backend portatil assim que a escolha tecnologica for feita. - **Pro:** reduz a manutencao para um unico host depois da migracao. - **Con:** aumenta risco de regressao e mistura decisao de backend com mudanca operacional. - **Tradeoff:** so faz sentido depois de prova local de superioridade e paridade, o que ainda nao existe. ### Opcao C - Criar um host SDL paralelo com destino de principal - **Abordagem:** adicionar um novo crate/binario de host SDL que implemente os mesmos contratos externos do host atual, mantendo `winit` como referencia e rollback ate haver evidencia de equivalencia. - **Pro:** permite teste A/B, reduz risco, valida se a fronteira de host esta realmente limpa, atende a meta de handheld Linux/Android customizado/DIY e preserva caminho para tornar SDL o host principal. - **Con:** aumenta temporariamente manutencao e exige fatorar partes comuns se houver duplicacao. - **Tradeoff:** melhor caminho para chegar a um host principal portatil sem reabrir runtime. ### Opcao D - Evoluir winit/pixels/cpal como host portatil - **Abordagem:** manter a familia atual e investir em configuracao, input, fullscreen, packaging e compatibilidade de Linux handheld/Android/DIY dentro dela. - **Pro:** reaproveita o host existente e reduz dependencias nativas novas. - **Con:** pode nao resolver os problemas praticos de distribuicao, gamepad/device handling, fullscreen/scaling, Android customizado e ambientes handheld. - **Tradeoff:** forte se a pilha atual suportar bem os alvos; fraco se o problema real for portabilidade operacional. ### Opcao E - Host Android nativo separado - **Abordagem:** tratar Linux handheld e Android como hosts diferentes: SDL ou winit para Linux; Android com camada nativa/propria quando o alvo amadurecer. - **Pro:** permite respeitar o ciclo de vida, packaging, input e audio do Android sem contaminar o host Linux. - **Con:** duplica mais superficie e adia a promessa de um host portatil unico. - **Tradeoff:** bom se Android tiver requisitos proprios demais; ruim se SDL conseguir cobrir Android bem o bastante. ### Opcao F - Camada multiplataforma alternativa - **Abordagem:** avaliar alternativas como uma camada Rust-first ou game-framework-level para janela, input, audio e render. - **Pro:** pode reduzir FFI nativa e integrar melhor com Cargo. - **Con:** pode ser menos madura para Linux handheld/Android real, packaging e controles. - **Tradeoff:** deve ser considerada, mas precisa provar vantagem concreta sobre SDL para justificar risco. ## Sugestao / Recomendacao Recomendacao inicial: manter a **Opcao C** como favorita, mas ampliar a fase de agenda para comparar SDL com as demais familias de host antes da decisao. O resultado desejado continua sendo um segundo host portatil, inicialmente paralelo, com destino explicito de se tornar o host principal quando atingir paridade e estabilidade. O caminho recomendado e: 1. Definir o contrato minimo de equivalencia entre hosts: janela, framebuffer RGBA8888, input, audio, pacing, debugger/logs e encerramento. 2. Identificar o que e comum ao host e o que e backend especifico. 3. Comparar as familias candidatas contra esse contrato: SDL2, SDL3, winit atual evoluido, Android nativo separado e alternativas Rust-first. 4. Implementar o candidato escolhido como novo crate/binario sem remover `prometeu-host-desktop-winit`. 5. Permitir troca simples por binario/comando/feature, mantendo o runtime cego para a escolha. 6. Tratar handheld Linux como alvo primario de produto para esse host; tratar Android customizado e DIY Linux como restricoes de desenho quando afetarem backend, packaging, input, audio ou boot/runtime integration. 7. Promover o novo host a principal apenas depois de evidencia de estabilidade e paridade. ## Perguntas em Aberto - [ ] A primeira implementacao SDL deve usar SDL2 ou SDL3? - [ ] SDL deve ser a familia escolhida, ou winit evoluido, Android nativo separado ou outra camada oferece melhor caminho? - [ ] A selecao do host deve ser por binario separado, feature Cargo, parametro CLI, ou combinacao desses mecanismos? - [ ] Qual e o menor conjunto de comportamento que define paridade aceitavel com o host winit? - [ ] Quais partes do host atual devem virar modulo comum antes do SDL, e quais devem ser duplicadas primeiro para evitar abstracao prematura? - [ ] O host SDL deve reutilizar `cpal` para audio inicialmente ou usar audio SDL desde o primeiro corte? - [ ] Quais familias de hardware handheld Linux devem ser usadas como referencia inicial? - [ ] Handheld Linux exige controles/gamepad, fullscreen, scaling, latency, sleep/resume, framebuffer/display mode ou packaging especificos desde o primeiro corte? - [ ] Qual e o "Linux base" minimo que um futuro hardware DIY precisaria expor para rodar o host portatil sem fork? - [ ] Android customizado deve ser criterio de escolha entre SDL2 e SDL3 agora, ou deve ficar como compatibilidade futura? - [ ] Como validar input e pacing de forma automatizada sem depender de janela real em CI? - [ ] O nome do crate deve ser `prometeu-host-desktop-sdl`, `prometeu-host-desktop-sdl2`, ou algo neutro a versao? ## Criterio para Encerrar A agenda pode virar decision quando estiver claro: - se o novo host sera paralelo em estabilizacao, com destino de host principal; - qual familia de backend sera alvo inicial; - se SDL for escolhido, qual versao SDL sera alvo inicial; - como a selecao/troca de host deve funcionar; - quais contratos sao comuns e proibidos de mudar; - quais requisitos minimos de handheld Linux e possivel Android customizado entram no primeiro plano; - qual contrato minimo de Linux base mantem aberta a opcao de hardware DIY; - qual evidencia minima prova paridade suficiente para iniciar planos de implementacao. ## Discussion Ponto inicial aceito pelo usuario: a intencao e ter um segundo host para testes, com troca simples e facil, aproveitando o trabalho ja feito para isolar essa troca no host sem envolver runtime ou outros dominios. Atualizacao de escopo: o novo host nao e descartavel. O objetivo e servir como runtime host para sistemas Linux rodando em consoles portateis e hardwares handheld chineses, e possivelmente Android customizado. Assim que estiver estavel, ele deve poder virar o host principal. Atualizacao de escopo: outras familias de host/backend tambem devem viver nesta agenda. SDL segue como hipotese forte, mas a decisao deve comparar opcoes antes de cravar a tecnologia. Clarificacao: "mobile" nesta agenda nao se refere primariamente a telefone/tablet. O foco sao dispositivos portateis dedicados com Linux interno ou Android customizado, geralmente com controles fisicos e ambiente de distribuicao proprio. Clarificacao: a agenda tambem deve preservar a opcao de um futuro hardware DIY. A premissa desejada e que, se esse hardware expuser um Linux base suficiente, o runtime ja tenha um host portatil pronto para rodar nele. ## Resolution