D843 - The index offset is added to every vertex index

Status: decided Date: 2026-10-14 known_by: assumed

Second correction (2026-10-22): the first correction is withdrawn. Its rows (report-20261014-batch4.log, 000-boot/ge-indx-offset) are not a GPU measurement: the same arm records fn-create-queue-bound 0x0 and queue-create-rc 0xffffffff, and every sceAgcDcbDrawIndexOffset emit answered -1 with no dword written, so no draw reached the GPU and the stored ids it reports came from no draw. The decision stands as first written below: the offset is added to every vertex index, an auto draw's ids included, on the r600 grounding below, as prosper also applies it. Grand Theft Auto V's in-world frames write the offset as 0, so they do not decide it. A re-measurement is filed with obSCEne (REQ-20261022T2100Z-gt26).

Correction (2026-10-14, withdrawn above): measured by obSCEne REQ-20261014T0415Z-ix01 (report-20261014-batch4.log, 000-boot/ge-indx-offset): the offset moves only the indices an indexed draw fetches. A three-vertex DRAW_INDEX_AUTO stored ids 0, 1, 2 under offsets 0, 5 and 0x10000; a DRAW_INDEX_2 of {0, 1, 2} stored 5, 6, 7 under offset 5; and the register keeps its value across submissions. orbistoun now seeds an auto draw's ids from zero whatever the offset holds, and adds it to each index an indexed draw fetches, which it no longer refuses. The r600 reading below does not hold on this part; it is kept for the record.

GE_INDX_OFFSET (uconfig 0xC24A) is added to every vertex index before it becomes a vertex id. A non-indexed draw (DRAW_INDEX_AUTO) of n vertices under offset k has ids k to k + n - 1, and its primitive shader is seeded so. An indexed draw adds k to each index it fetches; orbistoun does not yet offset fetched indices, so an indexed draw with a non-zero offset stays refused, naming the offset.

Why: Mesa's r600 driver programs the same register under its older name, VGT_INDX_OFFSET. For a non-indexed draw it writes the draw's start there and emits a plain DRAW_INDEX_AUTO of count vertices (r600_state_common.c 2697, 2939). For an indexed draw it writes the index bias, the base vertex (2695). Both work only if the hardware adds the register to the generated index and to the fetched one alike. radeonsi writes zero on gfx10 and later and passes the base vertex in an SGPR instead, so no newer driver shows the register used.

Grand Theft Auto V's first draw is a three-vertex DRAW_INDEX_AUTO under offset 5. Its render thread waits on the RELEASE_MEM fence behind that draw (D832, the queue's held writes).

Assumed: that the register kept its r600 meaning through the rename to GE_INDX_OFFSET. obSCEne REQ-20261014T0415Z-ix01 measures it on the console, for an auto draw and an indexed one.

Rejected: