Shaders RDNA2 a SPIR-V
Los shaders de PlayStation 5 son código de máquina RDNA2. PS5PCEM descodifica las familias GFX10, construye un grafo de flujo de control y rebaja las operaciones admitidas a SPIR-V 1.5 para Vulkan.
Notas del repositorio hasta el 10 de octubre de 2026
Descodificación
El frontend reconoce las codificaciones escalares SOP1, SOP2, SOPK, SOPC, SOPP y SMEM, las codificaciones vectoriales VOP1, VOP2, VOP3, VOP3P, VOPC y VINTRP, y MUBUF, MTBUF, FLAT, DS, MIMG y EXP. Se conservan los cuerpos arquitectónicos de una y de dos palabras, los literales opcionales y las palabras de dirección NSA de MIMG, de modo que un opcode posterior no admitido no desincroniza el flujo.
Un opcode no reconocido dentro de una familia conocida se convierte en una instrucción no admitida que sigue llevando su familia, su opcode numérico, las palabras en crudo y un motivo. Las palabras de extensión SDWA y DPP conservan sus selectores, modificadores y máscaras de carril. El decodificador no renombra un opcode que no conoce.
Flujo de control y la IR tipada
Los destinos de salto directo parten el programa en bloques. Las fusiones hacia delante, las regiones anidadas y las aristas hacia atrás se registran por separado. El traductor activo puede emitir desde las instrucciones descodificadas. Asignar PS5_GPU_SHADER_IR=1 selecciona la IR tipada legalizada. Asignar PS5_GPU_SSA=1 añade estado phi y de def-use, plegado de constantes y eliminación iterativa de código muerto.
Las selecciones acíclicas se convierten en fusiones estructuradas de SPIR-V con valores phi en las uniones. Los bucles naturales se convierten en fusiones de bucle. El flujo de control irreducible se convierte en un despachador por índice de bloque que conserva los predicados VCC y EXEC, de modo que un carril que debía saltarse una escritura sigue saltándosela. Las máscaras EXEC se reutilizan dentro de un bloque SPIR-V y se descartan en cada etiqueta, porque un valor de un lado de una rama no domina el otro lado.
Qué midió la suite del 9 de octubre
El punto de control de llamadas escalares del 9 de octubre superó 259 de 259 pruebas de análisis de GPU y 232 de 232 pruebas de Vulkan. La suite RDNA2 superó 271 de 281, con los mismos diez fallos ya existentes y una fuga informada. Esas sondas de instrucciones no establecen una tasa de fotogramas nueva para un juego.
Las cargas de imagen de varios texels, los gathers horizontales, los fetch shaders de NGG y las llamadas escalares acotadas están implementados como rutas propias y se describen en sus propias páginas. Los stores y las combinaciones de descriptores que no estaban en el conjunto medido siguen sin admitirse.
Qué está implementado
- Descodificación de las familias escalar, vectorial, de memoria, de imagen y de exportación de GFX10, incluidos literales y palabras NSA.
- Selecciones estructuradas, bucles naturales y un despachador para el flujo irreducible que conserva las máscaras de carril.
- IR tipada y limpieza SSA opcionales, elegidas con variables de entorno.
- SPIR-V 1.5 para las operaciones admitidas de ALU, memoria, imagen, interpolación y exportación.
Qué falta todavía
- Siguen los diez fallos ya existentes de la suite RDNA2, más una fuga informada.
- Un opcode no admitido detiene esa rebaja. No se sustituye por una operación adivinada.
- Las pruebas de instrucciones no son un resultado de tasa de fotogramas.
Mecanismos relacionados
Qué describen estas páginas