diff options
| author | Scott Mansell <phiren@gmail.com> | 2026-08-07 17:12:00 +1200 |
|---|---|---|
| committer | Scott Mansell <phiren@gmail.com> | 2026-08-07 18:42:52 +1200 |
| commit | e5eabd08f583fbdd3bb2551778e5ecb67dff0843 (patch) | |
| tree | be3f2202e01d477b2de1fa7df11945691028528a /Source/Core/VideoCommon/NativeVertexFormat.h | |
| parent | 4af65cbed06816bf4626831af369d3cb3dd18675 (diff) | |
Optimize vertex_shader_uid_data down to 28 bytes
This started as a fixing a misalignment issue, but I got carried away.
Was originally 41 bytes (overflowing it's expected 40 bytes by 1 bit).
Now it's 27 bytes plus 8 bits of padding (ready for future expansion).
The savings come from:
- Removing UV usage from components, it can be reconstructed from
texcoord_elem_count (saved 8 bits)
- Removed the 8 unused bits from texMtxInfo_n_projection (saved 8 bits)
- Removing unused bit from from start of components (saved 1 bit)
- Removed extra bit from inputform, texgentype and sourcerow
- packed texMtxInfo_n_projection and texcoord_elem_count back into
the per texgen info space freed up above. (saved 24 bits)
- Overlayed postMtx index and Emboss mode shifts into a union based on
texgentype (saved 56 bits)
- Move to a single-bit union tag, freeing up an extra bit for regular
texgens.
- Move PotMtx normalize into the freed up space (saved 8 bits)
Total savings: 105 bits of data
EDIT: Even worse, MSVC wasn't respecting pack(1) for bitfields at all,
so on windows this struct was actually quite a bit larger.
Something like 80 bytes, if not more.
Fixed this by dropping the size of any enums used in these
bit structs to u8. Our Common::BitField allows for the underlying
type to be explicitly specified to something larger.
msvc's bitfield packing appears to be completely braindead, can't
mix sizes at all.
Diffstat (limited to 'Source/Core/VideoCommon/NativeVertexFormat.h')
| -rw-r--r-- | Source/Core/VideoCommon/NativeVertexFormat.h | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/Source/Core/VideoCommon/NativeVertexFormat.h b/Source/Core/VideoCommon/NativeVertexFormat.h index 0f6be25541..76ca7875c2 100644 --- a/Source/Core/VideoCommon/NativeVertexFormat.h +++ b/Source/Core/VideoCommon/NativeVertexFormat.h @@ -12,36 +12,38 @@ // m_components enum : u32 { - VB_HAS_POSMTXIDX = (1 << 1), - VB_HAS_TEXMTXIDX0 = (1 << 2), - VB_HAS_TEXMTXIDX1 = (1 << 3), - VB_HAS_TEXMTXIDX2 = (1 << 4), - VB_HAS_TEXMTXIDX3 = (1 << 5), - VB_HAS_TEXMTXIDX4 = (1 << 6), - VB_HAS_TEXMTXIDX5 = (1 << 7), - VB_HAS_TEXMTXIDX6 = (1 << 8), - VB_HAS_TEXMTXIDX7 = (1 << 9), - VB_HAS_TEXMTXIDXALL = (0xff << 2), + VB_HAS_TEXMTXIDX0 = (1 << 0), + VB_HAS_TEXMTXIDX1 = (1 << 1), + VB_HAS_TEXMTXIDX2 = (1 << 2), + VB_HAS_TEXMTXIDX3 = (1 << 3), + VB_HAS_TEXMTXIDX4 = (1 << 4), + VB_HAS_TEXMTXIDX5 = (1 << 5), + VB_HAS_TEXMTXIDX6 = (1 << 6), + VB_HAS_TEXMTXIDX7 = (1 << 7), + VB_HAS_TEXMTXIDXALL = (0xff << 0), + + VB_HAS_POSMTXIDX = (1 << 8), // VB_HAS_POS=0, // Implied, it always has pos! don't bother testing - VB_HAS_NORMAL = (1 << 10), - VB_HAS_TANGENT = (1 << 11), - VB_HAS_BINORMAL = (1 << 12), - - VB_COL_SHIFT = 13, - VB_HAS_COL0 = (1 << 13), - VB_HAS_COL1 = (1 << 14), - - VB_HAS_UV0 = (1 << 15), - VB_HAS_UV1 = (1 << 16), - VB_HAS_UV2 = (1 << 17), - VB_HAS_UV3 = (1 << 18), - VB_HAS_UV4 = (1 << 19), - VB_HAS_UV5 = (1 << 20), - VB_HAS_UV6 = (1 << 21), - VB_HAS_UV7 = (1 << 22), - VB_HAS_UVALL = (0xff << 15), - VB_HAS_UVTEXMTXSHIFT = 13, + VB_HAS_NORMAL = (1 << 9), + VB_HAS_TANGENT = (1 << 10), + VB_HAS_BINORMAL = (1 << 11), + + VB_COL_SHIFT = 12, + VB_HAS_COL0 = (1 << 12), + VB_HAS_COL1 = (1 << 13), + VB_HAS_SHARED = 0x3f << 8, + + VB_HAS_UV0 = (1 << 16), + VB_HAS_UV1 = (1 << 17), + VB_HAS_UV2 = (1 << 18), + VB_HAS_UV3 = (1 << 19), + VB_HAS_UV4 = (1 << 20), + VB_HAS_UV5 = (1 << 21), + VB_HAS_UV6 = (1 << 22), + VB_HAS_UV7 = (1 << 23), + VB_HAS_UVALL = (0xff << 16), + VB_HAS_UVTEXMTXSHIFT = 16, }; struct AttributeFormat |
