RSXFIFOCommands

From PS3 Developer wiki
Revision as of 22:02, 5 February 2014 by Euss (talk | contribs)
Jump to navigation Jump to search

Crossreference: gitbrew.org::RSXFIFOCommands

Commands

NOP (0x00000100)

  • Nop
0x00000100

CALL (0x00000002)

  • Calls a function at the specified offset.
  • Command size is 0.
  • The parameter is offset in FIFO buffer.
<offset> | 0x00000002

RET (0x00020000)

  • Returns from a function.
  • Command size is 0.
0x00020000

JMP (0x20000000)

  • Jumps to the specified offset.
  • Command size is 0.
  • The parameter is offset in FIFO buffer.
0x20000000 | <offset>

COLOR MASK (0x00040324)

  • Sets color mask.
  • Command size is 1.
  • The parameter is color mask.
0x00040324
<color mask>

COLOR MASK MRT (0x00040370)

0x00040370
<color mask>

CLEAR COLOR (0x00041D90)

0x00041D90
<value>

FRONT POLYGON MODE (0x00041828)

  • Sets front polygon mode.
  • Command size is 1.
  • The parameter is front polygon mode.
0x00041828
<front polygon mode>

SET REF (0x00040050)

  • Sets value of REF control register
0x00040050
<value>

SEMAPHORE DMA CONTEXT (0x00040060)

  • Sets semaphore DMA context
0x00040060
<value>

SEMAPHORE OFFSET (0x00040064)

  • Sets semaphore offset
0x00040064
<value>

SEMAPHORE ACQUIRE (0x00040068)

  • Acquires semaphore
0x00040068
<value>

SEMAPHORE RELEASE (0x0004006C)

  • Releases semaphore
0x0004006C
<value>

libgcm Functions

cellGcmGetControlRegister

  • Returns EA of FIFO registers: PUT, GET and REF

cellGcmFlush

  • Kicks FIFO command processing by moving PUT register

cellGcmFinish

  • This function adds FIFO command for setting REF register to value 0xFFFFFFFF, kicks FIFO and then loops and checks REF register until it is set to value 0xFFFFFFFF.
  • It just waits until all FIFO commands are processed by GPU.

cellGcmGetFlipStatus

  • Returns flip status.
  • Checks bit 31 in word at offset 0x10C0 + 0x1 * 0x40 of reports area returned by lv1_gpu_context_allocate.
  • Flip status = ((word at 0x10C0 + 0x1 * 0x40) >> 31) ^ 0x1.
  • Flip status: 0 - flip done, 1 - flip waiting

cellGcmResetFlipStatus

  • Resets flip status.
  • Sets flip status to flip waiting.
  • Sets bit 31 to 0 in word at offset 0x10C0 + 0x1 * 0x40 of reports area returned by lv1_gpu_context_allocate.

Equivalent to:

lv1_gpu_context_attribute(context handle, 0x10a, 0x1 /* id */, 0x7fffffff /* mask */, 0x0 /* value */, 0x0)

libgcm Commands

SetNopCommand

0x00000000

SetReferenceCommand

0x00040050
<param>

SetJumpCommand

0x20000000 | <param>

SetCallCommand

0x00000002 | <param>

SetReturnCommand

0x00002000

SetLogicOp

  • Sets pixel logical operation
0x00040378
<param>

SetLogicOpEnable

  • Enables/Disables pixel logical operation
0x00040374
<param>

SetColorMask

0x00040324
<param>

SetColorMaskMrt

0x00040370
<param>

SetClearColor

0x00041D90
<param>

SetClearDepthStencil

0x00041D8C
<param>

SetClearSurface

0x00041D94
<param>
0x00040100
<param>

SetFrontPolygonMode

0x00041828
<param>

SetFrontFace

0x00041834
<param>

SetAlphaTestEnable

0x00040304
<param>

SetAlphaFunc

0x00080308
<param1>
<param2>

SetDepthTestEnable

0x00040A74
<param>

SetDepthFunc

0x00040A6C
<param>

SetDepthBounds

0x00080384
<param1>
<param2>

SetBlendEnable

0x00040310
<param>

SetBlendFunc

0x00080314
<param1>
<param2>

SetBlendColor

0x0004031C
<param>
0x0004037C
<param>

SetBlendEquation

0x00040320
<param>

SetClipMinMax

  • Sets Z clipping values
0x00080394
<param1>
<param2>

SetZcullEnable

  • Enables/Disables Zcull/Scull
0x00041D84
<param>

SetPointSize

0x00041EE0
<param>

SetWriteCommandLabel

  • Releases semaphore.
0x00040064
<param>
0x0004006C
<param>

SetWaitLabel

  • Acquires semaphore.
0x00040064
<param>
0x00040068
<param>

SetWriteBackEndLabel

0x00041D6C
<param>
0x00041D70
<param>

SetWriteBackEndLabelForConditional

0x00041D6C
<param>
0x00041D70
<param>
0x00040110
0x00000000

SetWaitForIdle

0x00040110
0x00000000

SetWaitFlip

  • SetWaitFlip is nothing more than acquiring semaphore.
  • This command is equal to SetWaitLabel with index=0x00000001 and value=0x00000000.
0x00040064
0x00000010       # semaphore offset = index * 16
0x00040068
0x00000000

SetReportLocation

0x000401A8
<param>

SetReport

0x00041800
<param>

SetTimeStamp

0x00041800
<param>

SetClearReport

0x000417c8
<param>

SetCullFace

  • Specifies culling face (front or back)
0x00041830
<param>

SetCullFaceEnable

  • Enables/Disables face culling
0x0004183C
<param>

SetViewport

0x00080A00
<param1>
<param2>
0x00080394
<param1>
<param2>
0x200A20
<param1>
<param2>
<param3>
<param4>
<param5>
<param6>
<param7>
<param8>
0x200A20
<param1>
<param2>
<param3>
<param4>
<param5>
<param6>
<param7>
<param8>

SetLineWidth

0x000403B8
<param>

SetLineSmoothEnable

0x000403BC
<param>

SetTextureAddress

0x00041A08 + (param1 << 5)
<param2>

SetTextureControl

0x00041A0C + (param1 << 5)
<param2>

SetTextureFilter

0x00041A14 + (param1 << 5)
<param2>

SetFogMode

0x000408CC
<param>

SetNotifyIndex

0x00040180
0x6660420F - <param>

SetNotify

0x00040104
0x00000000
0x00040100
0x00000000

SetTransferDataMode

0x00082184
<source>            # 0xFEED0000 - local memory, 0xFEED0001 - system memory
<destination>       # 0xFEED0000 - local memory, 0xFEED0001 - system memory

SetTransferDataOffset

0x0004230C
<source address>

0x00042310
<destination address>

0x00042328
0x00000000

SetTransferDataFormat

0x00142314
<source pitch>
<destination pitch>
<line length>
<line count>
<destination increment> << 8 | <source increment>

SetTransferLocation

0x00046188
<destination>            # 0xFEED0000 - local memory, 0xFEED0001 - system memory

SetTransferData

0x00082184
<source>                 # 0xFEED0000 - local memory, 0xFEED0001 - system memory
<destination>            # 0xFEED0000 - local memory, 0xFEED0001 - system memory

for (each row)
{
    0x0020230C
    <source address>
    <destination address>
    0x00000000
    0x00000000
    <number of bytes to transfer>    # max 0x3FFFFF bytes
    0x00000001
    0x00000101
    0x00000000
}

SetSurfaceWindow

0x00040194
<param>
0x0004018C
<param>
0x000801B4
<param1>
<param2>
0x00040198
<param>

TODO

SetVertexTextureAddress

0x00040908 + (index * 0x20)
(wrapt << 8) | wraps

SetVertexDataArray

0x00041740 + (index * 0x4)
param
0x00041680 + (index * 0x4)
param

libgcm System Semaphores

Offset Value Description
0x00000010 0x00000000 Flip done semaphore (used by cellGcmWaitFlip)

Semaphores

Small Test

Here is a FIFO program i executed on Linux:

0x00040060     # set semaphore DMA context method
0x66616661     # DMA object handle
0x00040064     # set semaphore offset method
0x00000400     # semaphore offset
0x0004006C     # semaphore release method
0xf00dbeef     # semaphore value

And here is dump of reports area:

000003f8: 0x1337beef
000003fc: 0x1337f001
00000400: 0xf00dbeef   # semaphore value
00000404: 0x1337babe
00000408: 0x1337beef
0000040c: 0x1337f001
  • As you see releasing semaphore writes 0xf00dbeef to reports area at offset 0x400.

Reports Area