You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[VERA] Add explanation how the video pipeline works (#287)
* Add explanation how the video pipeline works
* corrections, clarifications, and explanations
---------
Co-authored-by: MooingLemur <mooinglemur@users.noreply.github.com>
Copy file name to clipboardExpand all lines: X16 Reference - 03 - Editor.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,6 +27,8 @@ Mode $80 contains two layers: a text layer on top of a graphics screen. In this
27
27
28
28
To switch modes, use the BASIC statement `SCREEN` or the KERNAL API `screen_mode`. In the BASIC editor, the F4 key toggles between modes 0 (80x60) and 3 (40x30).
29
29
30
+
All modes use layer 1 (the uppermost layer) for text. Mode $80 also uses layer 0 for graphics.
Copy file name to clipboardExpand all lines: X16 Reference - 09 - VERA Programmer's Reference.md
+43-1Lines changed: 43 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1017,7 +1017,7 @@ At reset, the palette will contain a predefined palette:
1017
1017
| 2 | 32 pixels |
1018
1018
| 3 | 64 pixels |
1019
1019
1020
-
**Rendering Priority**The sprite memory location dictates the order in which it is rendered. The sprite whose attributes are at the lowest location will be rendered in front of all other sprites; the sprite at the highest location will be rendered behind all other sprites, and so forth.
1020
+
**Rendering Priority**Sprites are rendered in ascending order in memory. If a pixel has already been rendered by a sprite with a given Z-depth, it will not be rendered again by another sprite with the same Z-depth. If Z-depth of the new sprite is higher, the pixel is overwritten.
1021
1021
1022
1022
**Palette offset** works in the same way as with the layers.
1023
1023
@@ -1060,6 +1060,48 @@ FX features are controlled mainly by registers $9F29-$9F2C with DCSEL set to 2 t
1060
1060
Preliminary documentation for the feature can be found in [Chapter 10](X16%20Reference%20-%2010%20-%20VERA%20FX%20Reference.md#chapter-10-vera-fx-reference), but as this is a brand new
1061
1061
feature, examples and documentation still need to be written.
1062
1062
1063
+
1064
+
## Video pipeline
1065
+
The active area of the screen consist of layers stacked in this order. They are rendered from bottom to top, by the display composer.
1066
+
1067
+
- Sprite, if Z=3 _(top)_
1068
+
- Layer 1
1069
+
- Sprite, if Z=2
1070
+
- Layer 0
1071
+
- Sprite, if Z=1
1072
+
- The color of palette index 0, black by default _(bottom)_
1073
+
1074
+
If a pixel in a layer is transparent (palette index 0), or, the entire layer is hidden (**DC_VIDEO**), the output becomes what is visible in the layer(s) below.
1075
+
1076
+
### Sprite renderer / line buffer
1077
+
There are 128 sprites, which are rendered to a double scanline buffer. This buffer contains, for each pixel:
1078
+
- Palette index (transparent if 0)
1079
+
- Z depth
1080
+
- Sprite collision mask
1081
+
1082
+
The display composer reads the pre-rendered data from line buffer A, pixel by pixel. At the same time, it requests the sprite renderer to render the next line to line buffer B. One scanline is written to the VGA port in 800 clock cycles. The deadline for rendering all of the sprite pixels for the next scan-out is 798 cycles.
1083
+
1084
+
Sprite rendering can be interrupted by the CPU and the layer renderers accessing VRAM. If this happens, the sprite renderer will wait extra cycles until the VRAM no longer has contention. In addition, finding a sprite for rendering happens in parallel to the renderer doing the VRAM fetch and rendering pixels into the line buffer. This makes the number of sprites that can be rendered on one scanline non-trivial to predict.
1085
+
1086
+
Cost:
1087
+
Sprite finder:
1088
+
- 1 cycle per sprite index, 1 additional cycle per sprite that is handed off to the renderer.
1089
+
1090
+
Sprite renderer:
1091
+
- Handoff from sprite finder: 1 cycle
1092
+
- Positioning line buffer pointer: 1 cycle
1093
+
- Fetching 32 bits of sprite image data: 1 cycle
1094
+
- VRAM ack latency: 1-4 cycles per fetch, depending on contention
1095
+
- Rendering one pixel: 1 cycle
1096
+
- Becoming ready for next sprite: 1 cycle
1097
+
1098
+
Example:
1099
+
- Smallest (4bpp 8px): 13-17 cycles
1100
+
- Biggest (8bpp 64px): 99-147 cycles
1101
+
1102
+
Sprites are rendered from lowest to highest index. If a sprite is to be rendered, the image data is loaded from video ram. Then, individual non-transparent pixels are written to the buffer IF the Z-depth is bigger than existing pixel, OR if existing pixel is transparent. Sprite collision mask may reveal a collision between sprites.
1103
+
1104
+
1063
1105
## Audio
1064
1106
1065
1107
The audio functionality contains of 2 independent systems. The first is the PSG or Programmable Sound Generator. The second is the PCM (or Pulse-Code Modulation) playback system.
0 commit comments