For every screen-pixel, the fdp outputs two half-pixels (each consisting of a color id and an alpha value). These are then converted to rgb colors, and blended into a single output by the fda.
The fdp has eight different graphics layers which can be used as the source for each half-pixel:
pixel pipeline order:
- [per-layer rendering] ← (common and layer-specific data)
×8 ↓ color, alpha select, blend mode, priority, clip settings, mosaic enable
- Mosaic ← mosaic strength
×8 ↓ color, alpha select, blend mode, priority, clip settings
- Clipping ← clip window values
×8 ↓ color, alpha select, blend mode, priority
- Priority Sorting
×2 ↓ color, alpha select, shadow?
- Shadow Effect ← shadow mode
×2 ↓ color, alpha select
- Alpha Lookup ← alpha values
×2 ↓ color, alpha value
- Color Lookup (RAM) ← color ram
×2 ↓ rgb color, alpha value
- Blending (FDA) ← fda mode, blur enable
×1 ↓ rgb color (blended)
- (Output to screen)
Graphics settings are stored in lineram. Effectively, each setting is an array of 256 values, one for each scanline.
Most layers have these settings:
there are four clip windows, each of which has a left and right value (ranging 0-511). selecting multiple of these will union their visible areas together (todo explain all this better. but i think it goes here because it's a like top-level feature that applies across layers)
a solid color, used if nothing else is present in that half-pixel, or if a priority conflict occurs. this is a pseudo-layer which lacks most of the common settings.
(we're not sure what the name means). the pivot layer is a 64×64 grid of 8×8 tiles, with textures defined in ram. it can be used for displaying text or pixel graphics.
the fdp renders up to ~900 16×16 sprites per frame to a single bitmap framebuffer.
each tilemap is a 32×32 (or 64×32) grid of 16×16 tiles.