---
id: AGD-0043
ticket: real-render-worker-establishment
title: Real Render Worker Establishment
status: accepted
created: 2026-06-06
resolved:
decision:
tags: [runtime, renderer, worker, concurrency, host, hal, architecture]
---
## Contexto
`DEC-0031` definiu o contrato arquitetural da fronteira VM/render. `AGD-0042` preparou a fronteira host/hardware/render para que `Hardware` deixe de ser um objeto concreto atravessando o worker e passe a ser contrato/facades implementadas pelo host.
Esta agenda discute a implementacao do worker real propriamente dito, assumindo que a preparacao da fronteira ja foi resolvida antes da execucao.
### Estado Atual Depois da `AGD-0042`
A preparacao de fronteira foi executada pelos planos `PLN-0098` a `PLN-0109`:
- `HardwareBridge` foi removido do codigo e deixou de ser contrato publico;
- `RuntimePlatform` passou a ser a fronteira runtime-facing para render, input, audio, assets e telemetry;
- `RenderSubmissionSink` aceita submissao owned;
- `Game2DFrameComposer` separa fechamento logico de frame do backend de render;
- syscalls `gfx2d.*` e `gfxui.*` bufferizam comandos e nao desenham imediatamente via `Gfx`;
- firmware, Hub, runtime e host desktop passam por servicos de plataforma;
- testes de runtime/firmware usam `TestPlatform` como fixture local;
- specs de GFX/portabilidade documentam que o worker/render consumer nao deve depender de `&mut Hardware`, `&mut Gfx`, `FrameComposer` vivo ou estado mutavel da VM.
O estado atual ainda nao tem worker real. O `LocalRenderWorker` continua sendo o caminho local/cooperativo que consome `RenderSubmission` no mesmo processo. O proximo passo desta agenda e decidir onde vive o controller do worker real, qual handoff thread-safe ele usa, e qual backend renderizavel ele owns ou recebe.
## Problema
O `LocalRenderWorker` atual e cooperativo/local. Ele prova o roteamento de policy, mas nao prova:
- thread/core real;
- ownership do backend renderizavel;
- present loop;
- stop token para current work;
- bounded shutdown/join;
- stale epoch durante rasterizacao;
- erro tipado de render/present;
- repeat real do ultimo frame valido;
- ausencia de bloqueio da VM sob atraso do render.
## Pontos Criticos
### 1. Ownership e lifecycle do worker
Precisamos decidir quem cria, inicia, para e reinicia o worker: runtime controller, host/HAL, ou ambos em contrato dividido.
### 2. Handoff real
O single-slot latest-wins ja existe como abstracao local. O worker real precisa de uma implementacao thread-safe, sem fila crescente e sem bloquear a VM.
### 3. Backend renderizavel
O worker deve owns um backend minimo ou receber capability host-owned. Esse backend deve consumir `RenderSubmission`, resolver recursos read-only e produzir/presentar frame sem `&mut Hardware`.
### 4. Present cadence
Precisamos decidir se o worker roda a 60Hz, se o host event loop dirige present, ou se ha uma autoridade separada de display cadence. Repeated present deve virar comportamento real, nao apenas hook.
### 5. Shutdown/current work
Quando houver uma submission em rasterizacao, shutdown e owner transition precisam impedir present obsoleto e terminar em tempo bounded.
### 6. Error model
Precisamos trocar o modelo infalivel/panic containment por erro tipado para render/present/worker failure.
### 7. Testes de concorrencia
Precisamos provar o contrato sem depender de janela nativa nem sleeps frageis.
## Opcoes
### Opcao A - Worker thread no runtime com backend mockavel
**Abordagem:** runtime cria um worker thread generico que recebe um backend implementando trait testavel.
**Pros:**
- testes de contrato mais diretos;
- menor dependencia do host desktop.
**Contras:**
- runtime passa a owns detalhes de thread;
- precisa cuidado para nao absorver politica de host/window.
**Manutenibilidade:** boa se o backend for limpo; ruim se virar acoplamento de host dentro do runtime.
### Opcao B - Worker thread no host desktop primeiro
**Abordagem:** implementar o primeiro worker no host winit/pixels e adaptar o runtime a submit/policy.
**Pros:**
- valida o caso real visual;
- encaixa com surface/present/winit.
**Contras:**
- mais dificil testar sem janela;
- risco de contrato ficar host-specific;
- portabilidade fica menos comprovada.
**Manutenibilidade:** boa para desktop, menos boa para hardware proprio.
### Opcao C - Worker controller runtime + backend host/HAL
**Abordagem:** criar um controller de worker que implementa handoff, stop token, epoch check e telemetry; o backend concreto vem de host/HAL e pode ser mockado em testes.
**Pros:**
- separa contrato de backend;
- testavel sem janela;
- mapeia para thread desktop, outro core ou fallback;
- preserva `RenderManager` como coordenador.
**Contras:**
- desenho inicial mais exigente;
- depende da preparacao da `AGD-0042`.
**Manutenibilidade:** melhor opcao se queremos worker real sem amarrar a winit.
## Sugestao / Recomendacao
Recomendo a **Opcao C - Worker controller runtime + backend host/HAL**.
O primeiro worker real deveria:
- consumir um handoff thread-safe single-slot;
- ter stop token e shutdown bounded;
- checar ownership/epoch antes de present;
- expor erros tipados;
- repetir o ultimo frame valido em cadence definida;
- sincronizar telemetry sem alterar semantica da VM;
- ter backend fake/mocked para testes de concorrencia.
O host desktop pode ser a primeira integracao concreta, mas nao deve ser o unico lugar onde o contrato e testado.
## Perguntas em Aberto
### 1. Onde vive o worker controller?
**Pergunta:** O worker controller vive em `prometeu-system`, `prometeu-hal`, `prometeu-drivers`, ou host?
**Sugestao:** colocar o controller contratual em `prometeu-system`, proximo de `RenderManager`, e manter traits pequenas em `prometeu-hal` quando forem superficie compartilhada. `prometeu-drivers` deve continuar oferecendo implementacoes locais/testaveis; host desktop deve integrar o controller, nao definir o contrato.
**Motivo:** o `RenderManager` ja owns policy de AppMode, ownership/epoch, latest-wins e telemetry. Se o controller nascer apenas no host, a semantica de worker vira desktop-specific e fica mais dificil provar o contrato sem janela nativa.
### 2. Qual handoff thread-safe usar?
**Pergunta:** O handoff thread-safe sera `Mutex