Commit Graph
25 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5 66b59c73a9 Vertex decoder: bring the riscv64 and loongarch64 JITs in line
Enables TestVertexJitMatchesSteps on both. riscv64 now passes all 216000
jitted formats and loongarch64 all 204000, against 28906 on arm64.

riscv64:
- Jit_PosFloat didn't clean NaN or infinity at all, it just copied the
  three words. Clamp to +-FLT_MAX like the x86 JIT does.
- Jit_PosFloatThrough was missing the truncation of Z to an integer.
- The morph helpers started the sum from the first product rather than
  from +0.0, which rounds differently and lets a -0 term through, and
  rounded that first product towards zero where the steps round to
  nearest. The rest of the sum stays fused, since the compiler contracts
  the steps into fused multiply-adds.
- The texcoord prescale and 5551 color morph paths read morph weights
  from tables that GetMorphValueUsage never asked to be filled in, so
  they used whatever an earlier vertex type had left there.
- The non-Zbb bounds update compared the wrong way around, so through
  mode texcoord bounds came out inverted.

loongarch64:
- Jit_PosFloat had a TODO to clean NaN and infinity, and didn't.
- Jit_PosFloatThrough was missing the same Z truncation.
- Jit_WriteMorphColor narrowed with the logical saturating shifts, so a
  negative channel became a huge unsigned value and saturated to 255
  instead of clamping to 0, and it rounded where the steps truncate. It
  also read the packed color back sign-extended, so any alpha above 0x7F
  compared as larger than 0xFF000000 and claimed full alpha.
- The three packed color morph formats are rewritten. The LSX versions
  built each channel with a chain of inserts, shifts and shuffles that
  didn't survive being run; 4444 also broadcast its scale from the mask
  register. They now follow the steps channel by channel. Note the
  accumulator has to be an LSX scratch register - F4-F7 alias V4-V7,
  which hold the skin matrix for the whole vertex.
- The vertex bounds were loaded with a signed halfword load, so the
  0xFFFF they start at became -1 and no texcoord was ever below it.

PrescaleUV now fuses on these two as well - both JITs fuse it, and the
compiler would have contracted the plain expression there anyway.

The test tolerates a small relative difference on decoded floats, scaled
by the morph count since each term rounds once. Every bug above was
orders of magnitude larger than that.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-09-21 13:48:56 -06:00
Henrik Rydgård c3eafeb005 Remove obsolete vertex decoder code and options 2026-07-14 17:26:00 +02:00
Henrik Rydgård 28b2b1793b Pipeline checker: Add support for checking for identical pipelines with different vertex formats
This turned out not to be very fruitful.
2026-07-10 19:07:27 +02:00
Henrik Rydgård 5e16bf907b VertexDecoder: Improve logging for missing formats. Add missing convert function.
The missing function is mainly used in D3D11, which can be used on
Windows for ARM64. It's not necesssary for the other backends, which is
why it used to be missing in the ARM64 vertex decoder.

Also fix a minor memory leak in AtracCtx2.
2025-09-24 10:52:09 -06:00
Henrik Rydgård e01ca5b057 Logging API change (refactor) (#19324)
* Rename LogType to Log

* Explicitly use the Log:: enum when logging. Allows for autocomplete when editing.

* Mac/ARM64 buildfix

* Do the same with the hle result log macros

* Rename the log names to mixed case while at it.

* iOS buildfix

* Qt buildfix attempt, ARM32 buildfix
2024-07-14 14:42:59 +02:00
Unknown W. Brackets d6ce03e1db Audio: Correct log function name. 2023-12-29 09:42:23 -08:00
Unknown W. Brackets 15cb782f85 riscv: Implement Zfa encoding.
Not yet enabled/detected.
2023-12-29 09:42:23 -08:00
Henrik Rydgård bca83c0baf Buildfix 2023-12-19 14:44:21 +01:00
Unknown W. Brackets b041e712de riscv: Fix signed position bug in vertexjit. 2023-07-23 17:57:08 -07:00
Unknown W. Brackets 5cbad1982b riscv: Correct 565 morph mistake.
Observed ni Valkyria Chronicles 3.
2023-07-23 17:57:08 -07:00
Unknown W. Brackets f1c90a6014 riscv: Fix skinning decode, morph and not.
Was transposed and using the wrong matrix when morphing.
2023-07-23 14:35:37 -07:00
Unknown W. Brackets 1790964ffe riscv: Fix vertexjit skinning, oops. 2023-07-23 14:35:37 -07:00
Henrik Rydgård 01cea7f088 Pass uvScale in as an argument to the vertex decoder
Cleaner than overwriting/restoring gstate_c.uvScale in the decoder
loop. A small cleanup I've been wanting to do for ages.

Expecting a negligble perf boost if any.
2023-06-12 20:25:18 +02:00
Unknown W. Brackets df1bd64662 riscv: Add morph+skin to vertexjit. 2023-02-16 18:45:10 -08:00
Unknown W. Brackets 71f4b116fe riscv: Implement skinning in vertexjit. 2023-02-16 18:32:58 -08:00
Unknown W. Brackets 27e60a9f2e riscv: Sum weighted matrices in vertexjit.
Not yet doing pos/norm, so not used yet.
2023-02-16 18:32:58 -08:00
Unknown W. Brackets 9f43010004 riscv: Reuse some color morphing code.
Small optimization loss in 5551, but fairly minimal and I think it's worth
it.
2023-02-14 20:46:05 -08:00
Unknown W. Brackets 684aa75388 riscv: Include morph in vertexjit. 2023-02-14 20:20:55 -08:00
Unknown W. Brackets ada6aa77e0 riscv: Correct offset prescale in vertexjit.
Also implement doubling while here.
2023-02-13 17:16:48 -08:00
Unknown W. Brackets e1c391b1c8 riscv: Use vertexjit for hardware skinned verts. 2023-02-13 17:15:49 -08:00
Unknown W. Brackets 991c596490 riscv: Set constants once in vertexjit. 2023-02-13 16:57:13 -08:00
Unknown W. Brackets dc4136d547 riscv: Add prescale to vertexjit. 2023-02-12 23:05:35 -08:00
Unknown W. Brackets 77b2e63876 riscv: Add colors to vertexjit.
This don't feel very efficient, but they overall beat non-jit.
2023-02-12 23:05:35 -08:00
Unknown W. Brackets ee10fae04e riscv: Add basic steps to vertex decode. 2023-02-12 23:05:34 -08:00
Unknown W. Brackets 219e0db4e5 riscv: Initial vertexjit. 2023-02-12 14:28:51 -08:00