Uploaded no$gba v3.01 -
http://problemkaputt.de/gba.htm - with lots of new details in the GPU specs.
3DS GPU External Registers - Memory Control/Status Registers
A new chapter, describing the GPU memory/status stuff. The more obvious registers are memory traffic counters. For the other registers it's still rather unclear what they are doing, but at least it's now documented that they do exist, and which bits are readable or writeable, and if they do have some relation to this-or-that other registers.
3DS GPU External Registers - Memfill and Memcopy
This contains lots of updates/fixes for the MEMCOPY registers. The width/height values were swapped, the output size turned out to be input size, and the what-was-called-input-size turned out to be an (optional) input gap. The RGBA data formats for Input and Output are now documented. And it contains a couple of notes on the Ready flag: Polling the flag seems to hang the GPU (unless polling it from another register), and Ready can be optionally triggered anywhere at begin, end, or middle of transfer (see the REMAIN register).
3DS GPU Internal Registers - Finalize Interrupt registers
This chapter is now more clear about the differences between acknowledge and request registers. And the mystery about whether or not the IRQ does terminate command list execution is solved: It's optional (see formerly undocumented AUTOSTOP register).
3DS GPU Internal Registers - Geometry Pipeline registers
The Attribute buffer register descriptions are more streamlined (and hopefully, clearer). I wasn't able to write a meaningful description with the old register names, so I've renamed all attribute buffer related registers to ATTR_BUF_xxx (for example, NUMVERTICES and FORMAT_LOW/HIGH are used only for ATTR_BUF, not for FIXEDATTRIB). Oh, and the old FORMAT_LOW/HIGH type/size description was all nonsense (eg. what was called "24bit" turned out to refer to 3-dimensional (X,Y,Z) vectors).
The DRAWELEMENTS feature turned out to be much more simple than expected: It's merely using an extra index list (for re-using entries and saving some memory), and otherwise it does work same as DRAWARRAYS. That, after spending the last some months on scratching my head... what could those elements do? Are they Water and Earth, or are they Triangles with more than three hyperdimensional edges? And could I ever hope to understand such things?
Undocumented Registers and Bits
The undocumented registers are now also mentioned in the GPU chapters. And a few of them are solved:
GPUREG_RENDERBUFFER_DIM_0 appears to be a don't care dummy register?
GPUREG_RENDERBUFFER_DIM_1 has an undocumented flag for horizontally mirroring the buffer.
GPUREG_undoc_10401160h.bit8 allows "flat shading" (using only one color per triangle, instead of interpolating three colors).
GPUREG_undoc_10401180h.bit8-9 can produce striped/dotted output (drawing only each 2nd or 4th pixel).
GPUREG_COLOR_OPERATION.bit24 does also produce striped output.
GPUREG_STAT_NUM_VERTICES_RECEIVED, GPUREG_STAT_NUM_TRIANGLES_RECEIVED, GPUREG_STAT_NUM_TRIANGLES_DISPLAYED are undocumented performance monitoring counters.
Yet unknown things
There are still plenty of unknown/unclear control flags. And I haven't yet looked into lighting and texturing and more complex shader opcodes. And, for more basic things, I often just don't know what the documentation is talking about.
- EARLYDEPTH and FRAGOP_CLIP: maybe some OpenGL people have a better idea what those registers might do?
- Fragment Lighting: I am unsure what "fragment" means in that context... is it just meaning "light settings per polygon"?
- reserved geometry shader subdivision: I have some idea what "subdivision" means, but I would assume that it's a software feature, nothing that could be done by hardware. The "reserved geometry shader" prefix might also hint on the subdivision being done by software, on one of the shader units?
- Texture Environment: Is that something about merging pixels from different textures (and other color parameters) with each other? If so, the six "environments" might be six "steps", alike 1st step=merge this, 2nd step=merge that, 3rd..6th step=do nothing?
16 May 2020 - no$gba version 3.02
- 3ds/vfp/help: multiply note about FMUL X,X,X.. and FMAC Y,Y,Y.. (thanks kemal)
- 3ds/gpu/help: added triangle drawing examples (thanks to profi200 for help)
- 3ds/gpu/help: created I/O map chapters for gpu internal/external registers
- 3ds/gpu/help: renamed several registers, especially ATTR_BUF related ones
- 3ds/gpu/help: swapped/renamed width and height to match up with actual usage
- 3ds/gpu/help: important details/corrections for rendering pipeline registers
- 3ds/gpu/help: better GPUREG_IRQ_xxx and GPU_MEMCOPY descriptions
- 3ds/gpu/help: info on undocumented flat shading and striped/dotted modes
- 3ds/gpu/help: info on undocumented memory traffic and vertex/polygon counters
- 3ds/gpu/help: added undocumented gpu register stubs (inside of gpu chapters)
- 3ds/gpu/help: started to rewrite and rearrange unclear gpu descriptions
- 3ds/gpu/help: removed meaningless sentences alike this register is used to...
- 3ds/gpu/help: removed nonsense definitions alike unsigned 1bit enable flag
- 3ds/gpu/help: gpu external registers: added memory control/status registers
- a22i/float: .float16/24/32/64/80 supports multiple operands (using commas)