summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/NativeVertexFormat.h
diff options
context:
space:
mode:
authorScott Mansell <phiren@gmail.com>2026-08-07 17:12:00 +1200
committerScott Mansell <phiren@gmail.com>2026-08-07 18:42:52 +1200
commite5eabd08f583fbdd3bb2551778e5ecb67dff0843 (patch)
treebe3f2202e01d477b2de1fa7df11945691028528a /Source/Core/VideoCommon/NativeVertexFormat.h
parent4af65cbed06816bf4626831af369d3cb3dd18675 (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.h58
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