refactor(sdl3gpu): extreure shaders MSL i helpers a headers compartits (CONV-03)

Els dos pipelines GPU (PostFX i CrtPi) tenien:
- Raw strings MSL incrustades al .cpp amb NOLINTBEGIN(readability-
  identifier-naming) envoltant ~150 línies cadascun.
- Funcions createShaderMSL / createShaderSPIRV duplicades byte a byte
  en cada .cpp (DUP-04), amb un comentari admetent-ho.
- El vertex shader postfx_vs escrit dues voltes, idèntic (DUP-05).

S'introdueixen:
- source/core/rendering/sdl3gpu/shader_factory.hpp amb els dos helpers
  inline, per a reutilitzar des de qualsevol pipeline.
- source/core/rendering/sdl3gpu/msl/ amb un header per shader
  (postfx_vert compartit, postfx_frag, crtpi_frag); cada constant es
  diu kCamelCase i cau per defecte sota el project naming, així que
  els blocs NOLINT desapareixen (PATCH-07).
- Suppresió a cppcheck per a sdl3gpu/msl/* (és MSL, no C++).

Els .cpp es redueixen ~190 línies cada un i queden només amb la
lògica del pipeline.

Build + smoke test de 5s sota xvfb OK (exit 124).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
JailDesignerandClaude Opus 4.7 committed 2026-04-20 09:28:52 +02:00
1 parent d479475dcf
commit 5f46fb22a4
8 files changed
+377 -395

No files matched your search

+7 -6
View File
@@ -20,7 +20,7 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic
|----|--------|--------|
| COUP-01 | Inversión de dependencia `core/rendering → game/*` | DONE |
| DUP-02 | `Surface::render` / `renderWithColorReplace` duplicados | DONE |
| CONV-03 | Shaders MSL como raw strings en `.cpp` + helpers duplicados | PENDING |
| CONV-03 | Shaders MSL como raw strings en `.cpp` + helpers duplicados | DONE |
| DUP-03 | Familia `Text::write*` con bucle UTF-8 repetido 5 veces | PENDING |
| COUP-02 | `Screen` instancia `SDL3GPUShader` directamente + `Surface` → `Screen::get()` | PENDING |
@@ -33,8 +33,8 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic
| DUP-01 | `gif.cpp:238-276` | 3 ramas del switch extension saltan bloque+subloops idénticos | Importante | PENDING | helper `skipExtensionBlocks` |
| DUP-02 | `surface.cpp:80-137` | `render` vs `renderWithColorReplace` ~90% idénticos | Crítico | DONE | `render()` delega amb source==target==transparent |
| DUP-03 | `text.cpp:145-289` | bucle UTF-8 repetido en write/writeColored/writeMonoDigits/length/lengthMonoDigits | Importante | PENDING | iterador de glifos |
| DUP-04 | `sdl3gpu_shader.cpp:165-201` + `crtpi_pipeline.cpp:165-202` | `createShaderMSL/SPIRV` duplicados | Importante | PENDING | extraer a `shader_factory` |
| DUP-05 | `sdl3gpu_shader.cpp:18-35` + `crtpi_pipeline.cpp:17-34` | vertex shader MSL duplicado | Menor | PENDING | compartir string |
| DUP-04 | `sdl3gpu_shader.cpp:165-201` + `crtpi_pipeline.cpp:165-202` | `createShaderMSL/SPIRV` duplicados | Importante | DONE | `sdl3gpu/shader_factory.hpp` |
| DUP-05 | `sdl3gpu_shader.cpp:18-35` + `crtpi_pipeline.cpp:17-34` | vertex shader MSL duplicado | Menor | DONE | `sdl3gpu/msl/postfx_vert.msl.h` compartit |
| DUP-06 | `surface.cpp:14-43` | constructor Surface abre y parsea GIF 2 veces | Importante | PENDING | `loadGif` devuelve pixels+palette |
| DUP-07 | `crtpi_pipeline.hpp:70-87` + `shader_backend.hpp:30-45` + `crtpi_pipeline.cpp:45-62` | defaults CRT-Pi triples | Importante | PENDING | single source of truth |
@@ -63,7 +63,7 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic
| PATCH-04 | `sprite.cpp:47-49` | `Sprite::update` vacío hook no invocado | Menor | PENDING | borrar (ver DEAD-10) |
| PATCH-05 | `gif.cpp:12-15` | comentario "reemplaçar macro READ" | Menor | PENDING | limpiar comentario |
| PATCH-06 | `gif.cpp:83-86` | guard self-reference defensivo | Menor | WONTFIX | dejar, cambiar `cerr` → logger futuro |
| PATCH-07 | `sdl3gpu_shader.cpp:17,162` + `crtpi_pipeline.cpp:16,162` | `NOLINTBEGIN` gigantes sobre MSL | Importante | PENDING | se resuelve con CONV-03 |
| PATCH-07 | `sdl3gpu_shader.cpp:17,162` + `crtpi_pipeline.cpp:16,162` | `NOLINTBEGIN` gigantes sobre MSL | Importante | DONE | eliminats amb CONV-03 |
| PATCH-08 | `render_info.cpp:64,138-139` | `mono_digits=true` asignado 2 veces | Menor | PENDING | init única |
## 4. Acoplamiento innecesario
@@ -111,7 +111,7 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic
|----|----------|-----------|--------|
| CONV-01 | Magic numbers vs "sin magic numbers" | HC-* | cubierto por HC |
| CONV-02 | HUD hardcoded vs "configurabilidad desde ficheros" | HC-04 | cubierto por HC-04 |
| CONV-03 | Shaders MSL como raw strings en `.cpp` | DUP-04/05, PATCH-07 | PENDING |
| CONV-03 | Shaders MSL como raw strings en `.cpp` | DUP-04/05, PATCH-07 | DONE |
| CONV-04 | Singletons vs "interfaces + callbacks" | COUP-06 | DEFERRED |
| CONV-05 | `core → game` deps | COUP-01 | cubierto por COUP-01 |
@@ -122,4 +122,5 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic
- `9243db1` — docs: full de treball inicial (aquest fitxer)
- `9434e4e` — COUP-01a: `Notifier` desacoblat de `game/ui/notification_presets`
- `9395520` — COUP-01b: `RenderInfo` desacoblat de `game/options` + `game/ui/ui_palette`
- `<pendent>` — DUP-02: `Surface::render` delega a `renderWithColorReplace`
- `d479475` — DUP-02: `Surface::render` delega a `renderWithColorReplace`
- `<pendent>` — CONV-03 + DUP-04 + DUP-05 + PATCH-07: shaders MSL i helpers extrets a `sdl3gpu/msl/` i `sdl3gpu/shader_factory.hpp`