summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/XFMemory.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/XFMemory.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/XFMemory.h')
-rw-r--r--Source/Core/VideoCommon/XFMemory.h16
1 files changed, 8 insertions, 8 deletions
diff --git a/Source/Core/VideoCommon/XFMemory.h b/Source/Core/VideoCommon/XFMemory.h
index 4077e50859..04d22dc9f3 100644
--- a/Source/Core/VideoCommon/XFMemory.h
+++ b/Source/Core/VideoCommon/XFMemory.h
@@ -18,7 +18,7 @@ constexpr size_t NUM_XF_COLOR_CHANNELS = 2;
// Lighting
// Projection
-enum class TexSize : u32
+enum class TexSize : u8
{
ST = 0,
STQ = 1
@@ -30,7 +30,7 @@ struct fmt::formatter<TexSize> : EnumFormatter<TexSize::STQ>
};
// Input form
-enum class TexInputForm : u32
+enum class TexInputForm : u8
{
AB11 = 0,
ABC1 = 1
@@ -63,7 +63,7 @@ struct fmt::formatter<NormalCount> : EnumFormatter<NormalCount::Invalid>
};
// Texture generation type
-enum class TexGenType : u32
+enum class TexGenType : u8
{
Regular = 0,
EmbossMap = 1, // Used when bump mapping
@@ -83,7 +83,7 @@ struct fmt::formatter<TexGenType> : EnumFormatter<TexGenType::Color1>
};
// Source row
-enum class SourceRow : u32
+enum class SourceRow : u8
{
Geom = 0, // Input is abc
Normal = 1, // Input is abc
@@ -318,11 +318,11 @@ struct fmt::formatter<INVTXSPEC>
union TexMtxInfo
{
BitField<0, 1, u32> unknown;
- BitField<1, 1, TexSize> projection;
- BitField<2, 1, TexInputForm> inputform;
+ BitField<1, 1, TexSize, u32> projection;
+ BitField<2, 1, TexInputForm, u32> inputform;
BitField<3, 1, u32> unknown2;
- BitField<4, 3, TexGenType> texgentype;
- BitField<7, 5, SourceRow> sourcerow;
+ BitField<4, 3, TexGenType, u32> texgentype;
+ BitField<7, 5, SourceRow, u32> sourcerow;
BitField<12, 3, u32> embosssourceshift; // what generated texcoord to use
BitField<15, 3, u32> embosslightshift; // light index that is used
u32 hex;