Reality Display Processor/Commands

Revision as of 08:53, 14 March 2024 by Lidnariq (talk | contribs) (match bitwidth to fieldwidth)
0 1 2 3 4 5 6 7
0x00 No Operation No Operation No Operation No Operation No Operation No Operation No Operation No Operation
0x08 Fill Triangle Fill Triangle (Z) Fill Triangle (T) Fill Triangle (TZ) Fill Triangle (S) Fill Triangle (SZ) Fill Triangle (ST) Fill Triangle (STZ)
0x10 No Operation No Operation No Operation No Operation No Operation No Operation No Operation No Operation
0x18 No Operation No Operation No Operation No Operation No Operation No Operation No Operation No Operation
0x20 No Operation No Operation No Operation No Operation Texture Rectangle Texture Rectangle Flip Sync Load Sync Pipe
0x28 Sync Tile Sync Full Set Key GB Set Key R Set Convert Set Scissor Set Primitive Depth Set Other Modes
0x30 Load TLUT No Operation Set Tile Size Load Block Load Tile Set Tile Fill Rectangle Set Fill Color
0x38 Set Fog Color Set Blend Color Set Primitive Color Set Environment Color Set Combine Mode Set Texture Image Set Depth Image Set Color Image

0x08 through 0x0F - Triangle


Triangle 0x08 through 0x0F
Word 0 63:48 0 0 1 shade texture zbuffer lmajor level[2:0] tile[2:0]
47:32 y.lo[13:0]
31:16 y.md[13:0]
15:0 y.hi[13:0]
Word 1 63:48 x.lo.c.i[15:0]
47:32 x.lo.c.f[15:0]
31:16 x.lo.s.i[15:0]
15:0 x.lo.s.f[15:0]
Word 2 63:48 x.hi.c.i[15:0]
47:32 x.hi.c.f[15:0]
31:16 x.hi.s.i[15:0]
15:0 x.hi.s.f[15:0]
Word 3 63:48 x.md.c.i[15:0]
47:32 x.md.c.f[15:0]
31:16 x.md.s.i[15:0]
15:0 x.md.s.f[15:0]

Word 0

bit 61:56 command: 0x08 through 0x0F depending on features specified
bit 58 shade: if 1, command is followed by 8 words specifying shading instructions
bit 57 texture: if 1, command is followed by 8 words specifying texturing instructions
bit 56 zbuffer: if 1, command is followed by 2 words specifying zbuffering instructions
bit 55 lmajor: ?
bit 53:51 level[2:0]: -
bit 50:48 tile[2:0]: -
bit 45:32 y.lo[13:0]: -
bit 29:16 y.md[13:0]: -
bit 13:0 y.hi[13:0]: -

Word 1

bit 63:48 x.lo.c.i[15:0]: -
bit 47:32 x.lo.c.f[15:0]: -
bit 31:16 x.lo.s.i[15:0]: -
bit 15:0 x.lo.s.f[15:0]: -

Word 2

bit 63:48 x.hi.c.i[15:0]: -
bit 47:32 x.hi.c.f[15:0]: -
bit 31:16 x.hi.s.i[15:0]: -
bit 15:0 x.hi.s.f[15:0]: -

Word 3

bit 63:48 x.md.c.i[15:0]: -
bit 47:32 x.md.c.f[15:0]: -
bit 31:16 x.md.s.i[15:0]: -
bit 15:0 x.md.s.f[15:0]: -

0x0C through 0x0F - Shaded Triangle


After above 4 words describing a triangle, if requested by the command, these 8 words describing shading instructions:

Shaded Triangle (suffix) 0x0C0x0F
Word 0 63:48 r.c.i[15:0]
47:32 g.c.i[15:0]
31:16 b.c.i[15:0]
15:0 a.c.i[15:0]
Word 1 63:48 r.x.i[15:0]
47:32 g.x.i[15:0]
31:16 b.x.i[15:0]
15:0 a.x.i[15:0]
Word 2 63:48 r.c.f[15:0]
47:32 g.c.f[15:0]
31:16 b.c.f[15:0]
15:0 a.c.f[15:0]
Word 3 63:48 r.x.f[15:0]
47:32 g.x.f[15:0]
31:16 b.x.f[15:0]
15:0 a.x.f[15:0]
Word 4 63:48 r.e.i[15:0]
47:32 g.e.i[15:0]
31:16 b.e.i[15:0]
15:0 a.e.i[15:0]
Word 5 63:48 r.y.i[15:0]
47:32 g.y.i[15:0]
31:16 b.y.i[15:0]
15:0 a.y.i[15:0]
Word 6 63:48 r.e.f[15:0]
47:32 g.e.f[15:0]
31:16 b.e.f[15:0]
15:0 a.e.f[15:0]
Word 7 63:48 r.y.f[15:0]
47:32 g.y.f[15:0]
31:16 b.y.f[15:0]
15:0 a.y.f[15:0]

Word 0

bit 63:48 r.c.i[15:0]: -
bit 47:32 g.c.i[15:0]: -
bit 31:16 b.c.i[15:0]: -
bit 15:0 a.c.i[15:0]: -

Word 1

bit 63:48 r.x.i[15:0]: -
bit 47:32 g.x.i[15:0]: -
bit 31:16 b.x.i[15:0]: -
bit 15:0 a.x.i[15:0]: -

Word 2

bit 63:48 r.c.f[15:0]: -
bit 47:32 g.c.f[15:0]: -
bit 31:16 b.c.f[15:0]: -
bit 15:0 a.c.f[15:0]: -

Word 3

bit 63:48 r.x.f[15:0]: -
bit 47:32 g.x.f[15:0]: -
bit 31:16 b.x.f[15:0]: -
bit 15:0 a.x.f[15:0]: -

=====Word 4

bit 63:48 r.e.i[15:0]: -
bit 47:32 g.e.i[15:0]: -
bit 31:16 b.e.i[15:0]: -
bit 15:0 a.e.i[15:0]: -

Word 5

bit 63:48 r.y.i[15:0]: -
bit 47:32 g.y.i[15:0]: -
bit 31:16 b.y.i[15:0]: -
bit 15:0 a.y.i[15:0]: -

Word 6

bit 63:48 r.e.f[15:0]: -
bit 47:32 g.e.f[15:0]: -
bit 31:16 b.e.f[15:0]: -
bit 15:0 a.e.f[15:0]: -

Word 7

bit 63:48 r.y.f[15:0]: -
bit 47:32 g.y.f[15:0]: -
bit 31:16 b.y.f[15:0]: -
bit 15:0 a.y.f[15:0]: -

0x0A, 0x0B, 0x0E, 0x0F - Textured Triangle


After above 4 words describing a triangle, and optional 8 words describing shading, these 8 words describing texturing instructions:

Textured Triangle (A,B,E,F)
Word 0 63:48 s.c.i[15:0]
47:32 t.c.i[15:0]
31:16 w.c.i[15:0]
15:0
Word 1 63:48 s.x.i[15:0]
47:32 t.x.i[15:0]
31:16 w.x.i[15:0]
15:0
Word 2 63:48 s.c.f[15:0]
47:32 t.c.f[15:0]
31:16 w.c.f[15:0]
15:0
Word 3 63:48 s.x.f[15:0]
47:32 t.x.f[15:0]
31:16 w.x.f[15:0]
15:0
Word 4 63:48 s.e.i[15:0]
47:32 t.e.i[15:0]
31:16 w.e.i[15:0]
15:0
Word 5 63:48 s.y.i[15:0]
47:32 t.y.i[15:0]
31:16 w.y.i[15:0]
15:0
Word 6 63:48 s.e.f[15:0]
47:32 t.e.f[15:0]
31:16 w.e.f[15:0]
15:0
Word 7 63:48 s.y.f[15:0]
47:32 t.y.f[15:0]
31:16 w.y.f[15:0]
15:0

Word 0

bit 63:48 s.c.i[15:0]: -
bit 47:32 t.c.i[15:0]: -
bit 31:16 w.c.i[15:0]: -

Word 1

bit 63:48 s.x.i[15:0]: -
bit 47:32 t.x.i[15:0]: -
bit 31:16 w.x.i[15:0]: -

Word 2

bit 63:48 s.c.f[15:0]: -
bit 47:32 t.c.f[15:0]: -
bit 31:16 w.c.f[15:0]: -

Word 3

bit 63:48 s.x.f[15:0]: -
bit 47:32 t.x.f[15:0]: -
bit 31:16 w.x.f[15:0]: -

Word 4

bit 63:48 s.e.i[15:0]: -
bit 47:32 t.e.i[15:0]: -
bit 31:16 w.e.i[15:0]: -

Word 5

bit 63:48 s.y.i[15:0]: -
bit 47:32 t.y.i[15:0]: -
bit 31:16 w.y.i[15:0]: -

Word 6

bit 63:48 s.e.f[15:0]: -
bit 47:32 t.e.f[15:0]: -
bit 31:16 w.e.f[15:0]: -

Word 7

bit 63:48 s.y.f[15:0]: -
bit 47:32 t.y.f[15:0]: -
bit 31:16 w.y.f[15:0]: -

0x09, 0x0B, 0x0D, 0x0F - Zbuffered Triangle


After above 4 words describing a triangle, optional 8 words describing shading, and optional 8 words describing texturing, these two words describing Zbuffering:

Zbuffered Triangle (9,B,D,F)
Word 0 63:48 d.i[15:0]
47:32 d.f[15:0]
31:16 x.i[15:0]
15:0 x.f[15:0]
Word 1 63:48 e.i[15:0]
47:32 e.f[15:0]
31:16 y.i[15:0]
15:0 y.f[15:0]

Word 0

bit 63:48 d.i[15:0]: -
bit 47:32 d.f[15:0]: -
bit 31:16 x.i[15:0]: -
bit 15:0 x.f[15:0]: -

Word 1

bit 63:48 e.i[15:0]: -
bit 47:32 e.f[15:0]: -
bit 31:16 y.i[15:0]: -
bit 15:0 y.f[15:0]: -

0x24 and 0x25 - Texture_Rectangle


Texture_Rectangle 0x24 and Texture_Rectangle_Flip 0x25
Word 0 63:48 command[5:0] = 0x24 or 0x25 x.lo[11:4]
47:32 x.lo[3:0] y.lo[11:0]
31:16 tile[2:0] x.hi[11:4]
15:0 x.hi[3:0] y.hi[11:0]
Word 1 63:48 s.i[15:0]
47:32 t.i[15:0]
31:16 s.f[15:0]
15:0 t.f[15:0]

Word 0

bit 61:56 command[5:0]: 0x24 (Texture_Rectangle) or 0x25 (Texture_Rectangle_Flip)
bit 55:44 x.lo[11:0]: -
bit 43:32 y.lo[11:0]: -
bit 26:24 tile[2:0]: -
bit 23:12 x.hi[11:0]: -
bit 11:0 y.hi[11:0]: -

Word 1

bit 63:48 s.i[15:0]: -
bit 47:32 t.i[15:0]: -
bit 31:16 s.f[15:0]: -
bit 15:0 t.f[15:0]: -

0x26 - Sync_Load


Sync_Load 0x26
63:48 command = 0x26[5:0]
47:32
31:16
15:0
bit 61:56 command[5:0]: 0x26

0x27 - Sync_Pipe


Sync_Pipe 0x27
63:48 command = 0x27[5:0]
47:32
31:16
15:0
bit 61:56 command[5:0]: 0x27

0x28 - Sync_Tile


Sync_Tile 0x28
63:48 command = 0x28[5:0]
47:32
31:16
15:0
bit 61:56 command[5:0]: 0x28

0x29 - Sync_Full


Sync_Full 0x29
63:48 command = 0x29[5:0]
47:32
31:16
15:0
bit 61:56 command[5:0]: 0x29

0x2a - Set_Key_GB


Set_Key_GB 0x2a
63:48 command = 0x2a[5:0] key.g.width[11:4]
47:32 key.g.width[3:0] key.b.width[11:0]
31:16 key.g.center[7:0] key.g.scale[7:0]
15:0 key.b.center[7:0] key.b.scale[7:0]
bit 61:56 command[5:0]: 0x2a
bit 55:44 key.g.width[11:0]: -
bit 43:32 key.b.width[11:0]: -
bit 31:24 key.g.center[7:0]: -
bit 23:16 key.g.scale[7:0]: -
bit 15:8 key.b.center[7:0]: -
bit 7:0 key.b.scale[7:0]: -

0x2b - Set_Key_R


Set_Key_R 0x2b
63:48 command = 0x2b[5:0]
47:32
31:16 key.r.width[11:0]
15:0 key.r.center[7:0] key.r.scale[7:0]
bit 61:56 command[5:0]: 0x2b
bit 27:16 key.r.width[11:0]: -
bit 15:8 key.r.center[7:0]: -
bit 7:0 key.r.scale[7:0]: -

0x2c - Set_Convert


Set_Convert 0x2c
63:48 command = 0x2c[5:0] convert.k[0][8:3]
47:32 convert.k[0][2:0] convert.k[1][8:0] convert.k[2][8:5]
31:16 convert.k[2][4:0] convert.k[3][8:0] convert.k[4][8:7]
15:0 convert.k[4][6:0] convert.k[5][7:0]
bit 61:56 command[5:0]: 0x2c
bit 53:45 convert.k[0][8:0]: -
bit 44:36 convert.k[1][8:0]: -
bit 35:27 convert.k[2][8:0]: -
bit 26:18 convert.k[3][8:0]: -
bit 17:9 convert.k[4][8:0]: -
bit 7:0 convert.k[5][7:0]: -

0x2d - Set_Scissor


Set_Scissor 0x2d
63:48 command = 0x2d[5:0] scissor.x.hi[11:4]
47:32 scissor.x.hi[3:0] scissor.y.hi[11:0]
31:16 scissor.field scissor.odd scissor.x.lo[11:4]
15:0 scissor.x.lo[3:0] scissor.y.lo[11:0]
bit 61:56 command[5:0]: 0x2d
bit 55:44 scissor.x.hi[11:0]: -
bit 43:32 scissor.y.hi[11:0]: -
bit 25 scissor.field: ?
bit 24 scissor.odd: ?
bit 23:12 scissor.x.lo[11:0]: -
bit 11:0 scissor.y.lo[11:0]: -

0x2e - Set_Primitive_Depth


Set_Primitive_Depth 0x2e
63:48 command = 0x2e[5:0]
47:32
31:16 primitiveDepth.z[15:0]
15:0 primitiveDepth.deltaZ[15:0]
bit 61:56 command[5:0]: 0x2e
bit 31:16 primitiveDepth.z[15:0]: -
bit 15:0 primitiveDepth.deltaZ[15:0]: -

0x2f - Set_Other_Modes


Set_Other_Modes 0x2f
63:48 command = 0x2f[5:0] other.atomicPrimitive other.reserved1 other.cycleType[1:0] other.perspective other.detailTexture other.sharpenTexture other.lodTexture
47:32 other.tlut other.tlutType other.sampleType other.midTexel other.bilerp[0] other.bilerp[1] other.convertOne other.colorKey other.colorDitherMode[1:0] other.alphaDitherMode[1:0] other.reserved2[3:0]
31:16 other.blend1a[0][1:0] other.blend1a[1][1:0] other.blend1b[0][1:0] other.blend1b[1][1:0] other.blend2a[0][1:0] other.blend2a[1][1:0] other.blend2b[0][1:0] other.blend2b[1][1:0]
15:0 other.reserved3 other.forceBlend other.alphaCoverage other.coverageXalpha other.zMode[1:0] other.coverageMode[1:0] other.colorOnCoverage other.imageRead other.zUpdate other.zCompare other.antialias other.zSource other.ditherAlpha other.alphaCompare
bit 61:56 command[5:0]: 0x2f
bit 55 other.atomicPrimitive: ?
bit 54 other.reserved1: ?
bit 53:52 other.cycleType[1:0]: -
bit 51 other.perspective: ?
bit 50 other.detailTexture: ?
bit 49 other.sharpenTexture: ?
bit 48 other.lodTexture: ?
bit 47 other.tlut: ?
bit 46 other.tlutType: ?
bit 45 other.sampleType: ?
bit 44 other.midTexel: ?
bit 43 other.bilerp[0]: ?
bit 42 other.bilerp[1]: ?
bit 41 other.convertOne: ?
bit 40 other.colorKey: ?
bit 39:38 other.colorDitherMode[1:0]: -
bit 37:36 other.alphaDitherMode[1:0]: -
bit 35:32 other.reserved2[3:0]: -
bit 31:30 other.blend1a[0][1:0]: -
bit 29:28 other.blend1a[1][1:0]: -
bit 27:26 other.blend1b[0][1:0]: -
bit 25:24 other.blend1b[1][1:0]: -
bit 23:22 other.blend2a[0][1:0]: -
bit 21:20 other.blend2a[1][1:0]: -
bit 19:18 other.blend2b[0][1:0]: -
bit 17:16 other.blend2b[1][1:0]: -
bit 15 other.reserved3: ?
bit 14 other.forceBlend: ?
bit 13 other.alphaCoverage: ?
bit 12 other.coverageXalpha: ?
bit 11:10 other.zMode[1:0]: -
bit 9:8 other.coverageMode[1:0]: -
bit 7 other.colorOnCoverage: ?
bit 6 other.imageRead: ?
bit 5 other.zUpdate: ?
bit 4 other.zCompare: ?
bit 3 other.antialias: ?
bit 2 other.zSource: ?
bit 1 other.ditherAlpha: ?
bit 0 other.alphaCompare: ?

0x30 - Load_Texture_LUT


Load_Texture_LUT 0x30
63:48 command = 0x30[5:0] tlut.s.lo[11:4]
47:32 tlut.s.lo[3:0] tlut.t.lo[11:0]
31:16 tlut.index[2:0] tlut.s.hi[11:4]
15:0 tlut.s.hi[3:0] tlut.t.hi[11:0]
bit 61:56 command[5:0]: 0x30
bit 55:44 tlut.s.lo[11:0]: -
bit 43:32 tlut.t.lo[11:0]: -
bit 26:24 tlut.index[2:0]: -
bit 23:12 tlut.s.hi[11:0]: -
bit 11:0 tlut.t.hi[11:0]: -

0x31 - Invalid_31


Invalid_31 0x31
63:48 command = 0x31[5:0]
47:32
31:16
15:0
bit 61:56 command[5:0]: 0x31

0x32 - Set_Tile_Size


Set_Tile_Size 0x32
63:48 command = 0x32[5:0] tileSize.s.lo[11:4]
47:32 tileSize.s.lo[3:0] tileSize.t.lo[11:0]
31:16 tileSize.index[2:0] tileSize.s.hi[11:4]
15:0 tileSize.s.hi[3:0] tileSize.t.hi[11:0]
bit 61:56 command[5:0]: 0x32
bit 55:44 tileSize.s.lo[11:0]: -
bit 43:32 tileSize.t.lo[11:0]: -
bit 26:24 tileSize.index[2:0]: -
bit 23:12 tileSize.s.hi[11:0]: -
bit 11:0 tileSize.t.hi[11:0]: -

0x33 - Load_Block


Load_Block 0x33
63:48 command = 0x33[5:0] load_.block.s.lo[11:4]
47:32 load_.block.s.lo[3:0] load_.block.t.lo[11:0]
31:16 load_.block.index[2:0] load_.block.s.hi[11:4]
15:0 load_.block.s.hi[3:0] load_.block.t.hi[11:0]
bit 61:56 command[5:0]: 0x33
bit 55:44 load_.block.s.lo[11:0]: -
bit 43:32 load_.block.t.lo[11:0]: -
bit 26:24 load_.block.index[2:0]: -
bit 23:12 load_.block.s.hi[11:0]: -
bit 11:0 load_.block.t.hi[11:0]: -

0x34 - Load_Tile


Load_Tile 0x34
63:48 command = 0x34[5:0] load_.tile.s.lo[11:4]
47:32 load_.tile.s.lo[3:0] load_.tile.t.lo[11:0]
31:16 load_.tile.index[2:0] load_.tile.s.hi[11:4]
15:0 load_.tile.s.hi[3:0] load_.tile.t.hi[11:0]
bit 61:56 command[5:0]: 0x34
bit 55:44 load_.tile.s.lo[11:0]: -
bit 43:32 load_.tile.t.lo[11:0]: -
bit 26:24 load_.tile.index[2:0]: -
bit 23:12 load_.tile.s.hi[11:0]: -
bit 11:0 load_.tile.t.hi[11:0]: -

0x35 - Set_Tile


Set_Tile 0x35
63:48 command = 0x35[5:0] tile.format[2:0] tile.size[1:0] tile.line[8:7]
47:32 tile.line[6:0] tile.address[8:0]
31:16 tile.index[2:0] tile.palette[3:0] tile.t.clamp tile.t.mirror tile.t.mask[3:2]
15:0 tile.t.mask[1:0] tile.t.shift[3:0] tile.s.clamp tile.s.mirror tile.s.mask[3:0] tile.s.shift[3:0]
bit 61:56 command[5:0]: 0x35
bit 55:53 tile.format[2:0]: -
bit 52:51 tile.size[1:0]: -
bit 49:41 tile.line[8:0]: -
bit 40:32 tile.address[8:0]: -
bit 26:24 tile.index[2:0]: -
bit 23:20 tile.palette[3:0]: -
bit 19 tile.t.clamp: ?
bit 18 tile.t.mirror: ?
bit 17:14 tile.t.mask[3:0]: -
bit 13:10 tile.t.shift[3:0]: -
bit 9 tile.s.clamp: ?
bit 8 tile.s.mirror: ?
bit 7:4 tile.s.mask[3:0]: -
bit 3:0 tile.s.shift[3:0]: -

0x36 - Fill_Rectangle


Fill_Rectangle 0x36
63:48 command = 0x36[5:0] fillRectangle_.x.lo[11:4]
47:32 fillRectangle_.x.lo[3:0] fillRectangle_.y.lo[11:0]
31:16 fillRectangle_.x.hi[11:4]
15:0 fillRectangle_.x.hi[3:0] fillRectangle_.y.hi[11:0]
bit 61:56 command[5:0]: 0x36
bit 55:44 fillRectangle_.x.lo[11:0]: -
bit 43:32 fillRectangle_.y.lo[11:0]: -
bit 23:12 fillRectangle_.x.hi[11:0]: -
bit 11:0 fillRectangle_.y.hi[11:0]: -

0x37 - Set_Fill_Color


Set_Fill_Color 0x37
63:48 command = 0x37[5:0]
47:32
31:16 set.fill.color[31:16]
15:0 set.fill.color[15:0]
bit 61:56 command[5:0]: 0x37
bit 31:0 set.fill.color[31:0]: -

0x38 - Set_Fog_Color


Set_Fog_Color 0x38
63:48 command = 0x38[5:0]
47:32
31:16 fog.red[7:0] fog.green[7:0]
15:0 fog.blue[7:0] fog.alpha[7:0]
bit 61:56 command[5:0]: 0x38
bit 31:24 fog.red[7:0]: -
bit 23:16 fog.green[7:0]: -
bit 15:8 fog.blue[7:0]: -
bit 7:0 fog.alpha[7:0]: -

0x39 - Set_Blend_Color


Set_Blend_Color 0x39
63:48 command = 0x39[5:0]
47:32
31:16 blend.red[7:0] blend.green[7:0]
15:0 blend.blue[7:0] blend.alpha[7:0]
bit 61:56 command[5:0]: 0x39
bit 31:24 blend.red[7:0]: -
bit 23:16 blend.green[7:0]: -
bit 15:8 blend.blue[7:0]: -
bit 7:0 blend.alpha[7:0]: -

0x3a - Set_Primitive_Color


Set_Primitive_Color 0x3a
63:48 command = 0x3a[5:0]
47:32 primitive.minimum[3:0] primitive.fraction[7:0]
31:16 primitive.red[7:0] primitive.green[7:0]
15:0 primitive.blue[7:0] primitive.alpha[7:0]
bit 61:56 command[5:0]: 0x3a
bit 43:40 primitive.minimum[3:0]: -
bit 39:32 primitive.fraction[7:0]: -
bit 31:24 primitive.red[7:0]: -
bit 23:16 primitive.green[7:0]: -
bit 15:8 primitive.blue[7:0]: -
bit 7:0 primitive.alpha[7:0]: -

0x3b - Set_Environment_Color


Set_Environment_Color 0x3b
63:48 command = 0x3b[5:0]
47:32
31:16 environment.red[7:0] environment.green[7:0]
15:0 environment.blue[7:0] environment.alpha[7:0]
bit 61:56 command[5:0]: 0x3b
bit 31:24 environment.red[7:0]: -
bit 23:16 environment.green[7:0]: -
bit 15:8 environment.blue[7:0]: -
bit 7:0 environment.alpha[7:0]: -

0x3c - Set_Combine_Mode


Set_Combine_Mode 0x3c
63:48 command = 0x3c[5:0] combine.sba.color[0][3:0] combine.mul.color[0][4:1]
47:32 combine.mul.color[0] combine.sba.alpha[0][2:0] combine.mul.alpha[0][2:0] combine.sba.color[1][3:0] combine.mul.color[1][4:0]
31:16 combine.sbb.color[0][3:0] combine.sbb.color[1][3:0] combine.sba.alpha[1][2:0] combine.mul.alpha[1][2:0] combine.add.color[0][2:1]
15:0 combine.add.color[0] combine.sbb.alpha[0][2:0] combine.add.alpha[0][2:0] combine.add.color[1][2:0] combine.sbb.alpha[1][2:0] combine.add.alpha[1][2:0]
bit 61:56 command[5:0]: 0x3c
bit 55:52 combine.sba.color[0][3:0]: -
bit 51:47 combine.mul.color[0][4:0]: -
bit 46:44 combine.sba.alpha[0][2:0]: -
bit 43:41 combine.mul.alpha[0][2:0]: -
bit 40:37 combine.sba.color[1][3:0]: -
bit 36:32 combine.mul.color[1][4:0]: -
bit 31:28 combine.sbb.color[0][3:0]: -
bit 27:24 combine.sbb.color[1][3:0]: -
bit 23:21 combine.sba.alpha[1][2:0]: -
bit 20:18 combine.mul.alpha[1][2:0]: -
bit 17:15 combine.add.color[0][2:0]: -
bit 14:12 combine.sbb.alpha[0][2:0]: -
bit 11:9 combine.add.alpha[0][2:0]: -
bit 8:6 combine.add.color[1][2:0]: -
bit 5:3 combine.sbb.alpha[1][2:0]: -
bit 2:0 combine.add.alpha[1][2:0]: -

0x3d - Set Texture Image


Set Texture Image 0x3d
63:48 command = 0x3d[5:0] format[2:0] size[1:0]
47:32 width[9:0]
31:16 dramAddress[23:16]
15:0 dramAddress[15:0]
bit 61:56 command[5:0]: 0x3d
bit 55:53 format[2:0]: Texture image format
bit 52:51 size[1:0]: Texture image pixel size
bit 41:32 width[9:0]: Texture image width in pixels (-1) (possible range of 1 to 4096 pixels)
bit 23:0 dramAddress[23:0]: RDRAM physical address of the buffer containing texture data

Sets the texture image, the location in RDRAM where the texture loading pipeline should source image data, and related properties.

The texture image format parameter seems to have no function, it has no effect on any operation unlike the tile format.

Format Name Format Value
RGBA 0
YUV 1
Color-Indexed (CI) 2
Intensity-Alpha (IA) 3
Intensity (I) 4+

The size parameter is used to increment the RDRAM address during texture loading.

Bits per pixel Size Value
4 0
8 1
16 2
32 3

The width parameter is used to calculate the start address of each texture image row during loading.

This is an attribute-setting command but is not used in the rendering pipeline so does not require a pipeline synchronization before changing it. (TOVERIFY is a sync required if changing it following a load command?)

Hazards

  • Memory alignment should be 8-byte to guarantee operation. If the address falls into the range [1,7] mod 64, the RDP may hang when loading from it.

0x3e - Set Depth Image


Set Depth Image 0x3e
63:48 command = 0x3e[5:0]
47:32
31:16 dramAddress[23:16]
15:0 dramAddress[15:0]
bit 61:56 command[5:0]: 0x3e
bit 23:0 dramAddress[23:0]: RDRAM physical address of the buffer to store depth information

Sets the depth image, the region in RDRAM where depth information will be stored. The depth image width is the same as the image width for the current color image. The depth buffer format is a fixed 18-bit-per-pixel format irrespective of the color image format.

Hazards

  • This attribute must be set before rendering any primitives that read or write depth, else it will read/write depth data at an unspecified location.
  • Memory alignment must be 64-byte for all rendering operations to behave as expected.

0x3f - Set Color Image


Set Color Image 0x3f
63:48 command = 0x3f[5:0] format[2:0] size[1:0]
47:32 width[9:0]
31:16 dramAddress[23:16]
15:0 dramAddress[15:0]
bit 61:56 command[5:0]: 0x3f
bit 55:53 format[2:0]: Pixel format (same meaning as in texture format)
bit 52:51 size[1:0]: Pixel size (same meaning as in texture size)
bit 41:32 width[9:0]: Image width in pixels (-1) (possible range of 1 to 4096 pixels)
bit 23:0 dramAddress[23:0]: RDRAM physical address of the buffer where pixels will be written

Sets the color image address and properties, the region in RDRAM where primitives will be rendered to as pixels.

The image is arrayed in row-order, that is rows are adjacent in memory. It is generally more efficient to draw wide triangles rather than horizontally thin triangles that overlap many rows; for single rows span buffers are employed to alleviate stalls due to waiting on memory read/write requests while there is no such buffering across multiple rows.

Valid format/size combinations are RGBA32, RGBA16, I8. 4-bit modes only write 0s as bytes, all 8-bit modes behave identically, 16-bit and 32-bit RGBA modes differ from other modes.

Hazards

  • This attribute must be set before rendering any primitives, else it will render to an unspecified location.
  • This is an attribute-setting command that requires pipeline synchronization before use, otherwise currently rendering primitives may be split partially between the old color image and new color image. (TOVERIFY there are conflicting accounts of whether Set Color Image requires a sync, the current consensus is that sync is required to avoid all edge cases)
  • Memory alignment must be 64-byte for all rendering operations to behave as expected.
  • Rendering any primitive in FILL mode to a 4-bit color image will crash the RDP.
  • Copying a 4-bit or 8-bit texture with COPY mode is only possible if the destination color image is 8-bit.
  • Copying a 16-bit texture with COPY mode is only possible if the destination color image is 16-bit. (Note that CI textures are treated as 16-bit in COPY mode as the TLUT is 16-bit)
  • COPY mode is unavailable when a 32-bit color image is configured.