
Código aberto, licença MIT: https://github.com/zmodelerlover/dlss5-neural-amd
O DLSS 5 Neural Rendering é a parte do DLSS 5 que sintetiza detalhe, luz e cor dentro da imagem do jogo. Quando ele vazou, apareceu um monte de ferramenta pra usar ele fora dos jogos que suportam oficialmente: renodx-dlss, DLSS5-Feeder, DLSS5-Swapper, OptiScaler.
Todas fazem a mesma coisa por baixo. Chamam o nvngx_dlssnr.dll da NVIDIA. Numa Radeon esse arquivo não roda, então quem possui AMD infelizmente ficou de fora. Não é caso de mexer numa config ou esperar uma atualização, é que não existe caminho.
Existe um port da rede pra AMD, que roda em HIP. O que não existia era alguma coisa que soubesse conversar com ele dentro de um jogo de verdade: pegar a imagem, a profundidade e os vetores de movimento, entregar pra rede no formato certo, receber a resposta e recompor o quadro sem estragar a cor. Foi isso que eu escrevi.
É um add-on de ReShade. Três arquivos ao lado do executável do jogo, sem compilar nada e sem lista de jogos suportados.
Testado numa RX 9070 XT. Euro Truck Simulator 2 é o melhor resultado até agora, comparável à mesma rede rodando em NVIDIA. Mirror's Edge deu resultado bom também. Batman Arkham Knight roda. PCSX2, o emulador de PS2, roda, e os clipes que estão no repositório são dele. Need for Speed 2015 rodou 10.920 quadros sem uma falha de redimensionamento. God of War 2018 está em teste agora.
Aqui é um slider de comparação do ETS2 na NVIDIA e na AMD no nosso projeto.
https://www.diffchecker.com/image-compare/QYk5zGtI/
E aqui no GOW2
https://www.diffchecker.com/image-compare/MABpPB8o/
Acima, God of War II na mesma cena, com o Neural Rendering ligado nos dois lados. À esquerda a minha rota, numa RX 9070 XT. À direita a implementação original da NVIDIA. É a mesma rede, o mesmo efeito, e é isso que eu queria: não ganhar da NVIDIA, chegar perto o bastante pra que ter uma Radeon deixe de ser motivo pra ficar de fora.
Vídeo, pra quem quiser ver antes de acreditar:
O add-on mede ele mesmo e joga os números no log. PCSX2, God of War, back buffer 1920x1080, escala 0.50, um passe:
Eu insisto nessa medição porque "a rede não tá fazendo nada" e "a rede tá funcionando e a minha composição tá comendo o resultado" são a mesma coisa olhando da poltrona, e o conserto de um não tem nada a ver com o do outro. Sem número é chute.
Quase todo add-on de DLSS 5 mira D3D12. Esse aqui mira D3D11 primeiro, e foi escolha, não limitação.
No D3D12 um add-on enxerga só o swapchain, que é a imagem final e mais nada. A rede recebe cor e adivinha o resto. No D3D11 a profundidade e os vetores de movimento do próprio jogo chegam até a rede, então ela sabe onde cada pixel estava no quadro anterior em vez de inventar.
Isso abre emulador, que é onde eu mais queria chegar. PCSX2 e RPCS3 nenhuma ferramenta de NVIDIA alcança, e é onde a técnica tem mais o que fazer, já que a imagem original é de baixa resolução por natureza.
A rota Vulkan está escrita e é o que vem no próximo update. Não é promessa de vaquinha, é código que já está no branch, com umas 900 linhas só na travessia.
O caminho é o contrário do D3D11. Handle exportado do Vulkan é memória opaca e o D3D12 não consegue abrir, então a direção inverte: as texturas e os fences nascem no nosso device D3D12, saem como handle NT e são importados no VkDevice do host como VkImage. Não é preferência, é o único lado que funciona.
Antes de escrever isso eu conferi se o driver aceitava. São dois programas que estão no repositório, o vkprobe e o vkbridge: um pergunta pro driver Vulkan da AMD, formato por formato, se ele importa textura e fence vindos do D3D12, e o outro atravessa bytes conhecidos nos dois sentidos pra ver se chegam inteiros. Na 9070 XT os dois passam, e todo formato que o add-on carrega sobrevive byte por byte. De quebra apareceu que o tipo de handle D3D12_HEAP não é suportado nesse driver enquanto o D3D12_RESOURCE é, ou seja, não era escolha livre e escolher errado teria queimado dias.
Com Vulkan de pé entra o RPCS3, que é o emulador de PS3, e jogo Vulkan nativo.
Pra cobrir D3D12 direito eu não pretendo reescrever do zero. O Matheus já tinha feito um port da rede pra AMD por cima do OptiScaler, que é onde o lado D3D12 já está resolvido. Ele encerrou o projeto dele e deixou o código no ar:
https://github.com/MatheusGViana/dlss-5-amd-project
A ideia é juntar os dois trabalhos. Só que isso não é o próximo update, é uns três à frente, porque antes tem conta pra pagar aqui: o travamento que aparece com mais de um passe nunca foi confirmado como resolvido, o campo de exposição do pacote de entrada da rede continua sendo entregue vazio, e o conteúdo dos guias de profundidade e movimento eu só medi em menu, nunca em gameplay de verdade. Botar mais superfície em cima disso agora só espalha o problema.
O repositório tem 61 commits e umas 10.000 linhas de C++ e HLSL em seis módulos, escritos e depurados em quatro dias de trabalho concentrado. O grosso do histórico cabe em pouco mais de 36 horas de relógio.
Falo do prazo porque ele veio de um jeito de trabalhar, não de correria. Toda decisão do código é medida antes de ser tomada, e quando não deu pra medir isso fica escrito, no comentário do código e na interface. Quem abre o add-on vê uma etiqueta de "medido", "rastreado" ou "desconhecido" do lado de cada controle. Não tem número mágico escondido em lugar nenhum.
Exemplo dessa semana. Com mais de um passe o resultado saía saturado demais. Eu achava que era a contagem de passes, mas era a composição: a correção era somada canal por canal e depois cortada canal por canal, e canal cortado vira rotação de matiz. Troquei por composição por razão. Está tudo escrito no repositório, inclusive as tentativas que não deram certo.
Quatro dias e dez mil linhas é o tipo de número que hoje faz o pessoal torcer o nariz, e com razão: tem muita coisa sendo gerada e despejada por aí sem ninguém ter olhado. Slop, como chamam. Então eu prefiro responder antes de perguntarem.
Aqui não entra linha que ninguém conferiu. Toda decisão tem uma medição atrás, e a que não tem fica escrita como não tendo, no comentário do código e na tela do add-on. Essa parte não tem como terceirizar: alguém precisa abrir o jogo, rodar a cena, ler o log e decidir se o número faz sentido, e depois voltar e mexer no que o número mostrou. É aí que vai a maior parte do tempo, e é a parte que é minha.
Você não precisa acreditar em mim, dá pra conferir:
Antes da lista, a parte que importa mais: o add-on é de graça e vai continuar de graça. Não existe versão paga e não vai existir. A vaquinha paga o tempo de trabalho pra isso continuar sendo feito, e é só isso.
Meta: R$ 7.000
Sobre a maior linha eu quero ser específico, porque ela é 80% do pedido. Eu trabalho com modelagem 3D e já pago assinatura pro meu trabalho. Os tokens que sobram no fim do mês são os que eu venho gastando aqui. Esse projeto anda com a sobra de outra coisa, e quando o trabalho aperta ele para no meio.
São dois planos porque não sou só eu. O Storm entrou pra ajudar e o segundo plano é dele. É isso que separa o projeto de continuar sendo hobby de madrugada.
As horas de RTX são pra comparar lado a lado contra a implementação original da NVIDIA. Hoje eu dependo de pedir log emprestado pra estranho na internet, e tem pergunta que só a comparação direta responde. Uma RTX 30 não serve: com Neural Rendering ligada ela fica perto de 1 FPS, então a medida de custo que sai dela não vale nada.
A taxa da plataforma eu botei na conta em vez de esconder.
Passando da meta, o excedente vira mais hora de RTX e mais mês de assinatura, nessa ordem. Ficando abaixo, a prioridade é a ordem da lista, de cima pra baixo.
Duas coisas. Tag de apoiador no Discord do projeto, e acesso às builds de pre-release, que são as que estão em teste antes de virar release.
Discord oficial do projeto: https://discord.gg/Dn4WY7waAB
O que não muda é o resto. O add-on é MIT, continua de graça, e tudo que aparece numa pre-release sai depois na versão pública, pra qualquer um, sem pagar nada. Pre-release é ver antes e ajudar a testar, não é recurso trancado.
Se ninguém contribuir eu continuo, mais devagar, e sem conseguir responder o que exige uma placa que eu não tenho.
Sobre transparência: o CHANGELOG do repositório tem uma seção chamada "Known, and not fixed", onde eu listo o que ainda não funciona e o que ainda não foi medido. Ela vai continuar lá.
Ao T-Rocha Hard Tec, pelo apoio ao projeto e pela divulgação. Coisa de nicho de AMD não chega em ninguém sozinha, e foi por ali que muita gente ficou sabendo que isso existe e voltou com relato:
https://www.youtube.com/@TRochaHardTec
Ao Storm, que entrou pra ajudar no projeto.
E a quem testou e mandou log de jogo que eu não tenho aqui pra rodar.
Licença MIT. Feito por cLohan.