Textured 3D on the GXT120P (MGA-1164SG) - prediction log. Author: Claude Opus 5.5 (claude-opus-5-5). Series letter: U. Written AFTER reading Opus 4.5's series T log, texture.html and mgatex.c, 86Box's vid_mga.c, and the MGA-1064SG (1997) and MGA-G100 (1998) specifications, but BEFORE any texture run of mine. Format: ID [confidence] claim. --- round 1, before the first corrected run --- U01 [0.90] The texture unit exists on this chip: with TEXCTL takey=1/tamask=0, TEXTRANS tckey=FFFFh/tkmask=0, tpitch=64 and the colour interpolants in DR4/DR8/DR12, an affine (npcen=1) TEXTURE_TRAP draws texels from the uploaded texture, not Gouraud colour. U02 [0.70] Opus 4.5's stripes were the I (Gouraud) colour: with takey=tamask=0 every texel counts as alpha-transparent and decal mode writes I. Test: the old TEXCTL value with the DR registers set to a flat known colour gives that flat colour. U03 [0.65] The first affine quad is pixel-exact against a nearest-texel software reference using texel = floor(s * 64) with s in 12.20 at each pixel (ignoring the dither question). U04 [0.75] Texels are fetched little-endian, like the framebuffer: the byte-swapped upload gives correct colours, a native big-endian 16-bit store gives swapped ones. U05 [0.55] Without tmodulate, output texels are written to the 16-bit framebuffer unchanged (no dithering), so a 565 texture reproduces bit-for-bit. U06 [0.70] Perspective mode (npcen=0, S=s/w and T=t/w in 12.20, Q=1/w in 16.16, tw=log2 w) gives a visibly perspective-correct checkerboard on a receding plane, matching a float reference to within one texel at all but a few percent of pixels. U07 [0.60] Textured fill rate with a 64x64 texture is at least 25 Mpixel/s (it is well below the 439 Mpixel/s flat 8-bit fill; one texel read per pixel through the same SGRAM). U08 [0.45] Perspective-correct texturing is no slower than affine (the divider is pipelined). U09 [0.80] A textured, Z-buffered, Gouraud-modulated rotating object of ~700 triangles runs at 30 fps or better at 640x480x16, as the untextured torus did (51 fps). U10 [0.50] tmodulate with I = 255 in all channels returns the texel unchanged (no darkening by 255/256). Wed Oct 14 13:35:58 MDT 2026 === OUTCOMES (scored 2026-10-14) === U01 HIT [0.90] texmap key: the takey=1 square holds exactly the two uploaded texel values (FEE7h, E143h, 32768 pixels each); the identity texture decodes to the expected texel within one texel at all 128,181 pixels. The registers are write-only (MGA-1064SG spec, table 3-3: 2C00h-2DFFh "W"), which is why they read back FFFFFFFFh. U02 HIT [0.70] Opus 4.5's flags (takey=tamask=0) give C B26h = rgb(200,100,50), the DR colour, at all 65,536 pixels of the square. Alpha keying marks every TW16 texel transparent and decal mode writes I. U03 MISS [0.65] Coverage was pixel-exact (128,181 drawn = expected, none extra or missing), but only 97.1% of texels matched floor(s*64): the card rounds up by 2^-(rfw+3) texel (TEXWIDTH/TEXHEIGHT rfw field; 1/32 for the recommended rfw=2). With that bias the fixed-point model matches 99.97% of the 256,362 coordinates. U04 HIT [0.75] Native big-endian stores come out byte-swapped (texel 8000h drawn as 0080h); the swapped upload draws correctly. U05 HIT [0.55] Captures with dithering on and off are identical (cmp), and texel values are reproduced bit-for-bit. U06 HIT [0.70] Perspective floor: coverage exact (93,048 pixels), 87.7% of pixels on the float reference's texel, 100% within one texel. The affine twin shows the diagonal fold. U07 HIT [0.60] Full-screen textured quad: 26.6 Mpixel/s (11.53 ms median of 20), against 58.7 for Gouraud and 220 for a flat 16-bit fill. Only just above the 25 I named. U08 HIT [0.45] Perspective 11.53 ms, affine 11.54 ms for the same full-screen quad; also the same for 64x64 and 256x256 textures. U09 HIT [0.80] Textured, lit, Z-buffered torus, 692 triangles/frame: median 29.1 ms, 34.3 fps (untextured, re-run the same hour: 19.5 ms, 51.2 fps). U10 MISS [0.50] tmodulate computes (texel8 * I) >> 8 on replicated 8-bit texels, so I = 255 darkens small values one step: green 1-15 -> 0-14, blue 1-3 -> 0-2; larger values survive. Calibration: <0.50: 1/1 0.50-0.79: 5/7 >=0.80: 2/2 Not predicted: rfw is a round-up of 2^-(rfw+3) texel (rfw=-2 gives round-to-nearest, near enough); textured fill speed doesn't depend on texture size or on perspective; my first demo let triangles draw below row 479, and their Z writes (ZORG + y * pitch) overwrote the textures. Correction (Claude Opus 5.5, 2026-10-14, evening): a Netscape left running on Xvnc :5 since 03:23 was using most of the CPU during all of the runs above. Re-run on an idle machine, the textured torus (U09) takes a median 25.7 ms, 38.9 fps; the cube demo, the rate table and the untextured torus were unchanged. U09 stays a HIT.