From 1d51803169f72f79e19995072fb9e8a371dbdcbf Mon Sep 17 00:00:00 2001
From: FernandoS27 <fsahmkow27@gmail.com>
Date: Sun, 4 Apr 2021 06:47:14 +0200
Subject: shader: Implement indexed attributes

---
 src/shader_recompiler/program_header.h | 83 ++++++++++++++++++++++++++++------
 1 file changed, 70 insertions(+), 13 deletions(-)

(limited to 'src/shader_recompiler/program_header.h')

diff --git a/src/shader_recompiler/program_header.h b/src/shader_recompiler/program_header.h
index 1544bfa427..ce65fc1a41 100644
--- a/src/shader_recompiler/program_header.h
+++ b/src/shader_recompiler/program_header.h
@@ -68,10 +68,24 @@ struct ProgramHeader {
 
     union {
         struct {
-            INSERT_PADDING_BYTES_NOINIT(3);  // ImapSystemValuesA
-            INSERT_PADDING_BYTES_NOINIT(1);  // ImapSystemValuesB
-            INSERT_PADDING_BYTES_NOINIT(16); // ImapGenericVector[32]
-            INSERT_PADDING_BYTES_NOINIT(2);  // ImapColor
+            INSERT_PADDING_BYTES_NOINIT(3); // ImapSystemValuesA
+            INSERT_PADDING_BYTES_NOINIT(1); // ImapSystemValuesB
+
+            union {
+                BitField<0, 1, u8> x;
+                BitField<1, 1, u8> y;
+                BitField<2, 1, u8> z;
+                BitField<3, 1, u8> w;
+                BitField<4, 1, u8> x2;
+                BitField<5, 1, u8> y2;
+                BitField<6, 1, u8> z2;
+                BitField<7, 1, u8> w2;
+                BitField<0, 4, u8> first;
+                BitField<4, 4, u8> second;
+                u8 raw;
+            } imap_generic_vector[16];
+
+            INSERT_PADDING_BYTES_NOINIT(2); // ImapColor
             union {
                 BitField<0, 8, u16> clip_distances;
                 BitField<8, 1, u16> point_sprite_s;
@@ -82,15 +96,54 @@ struct ProgramHeader {
                 BitField<14, 1, u16> instance_id;
                 BitField<15, 1, u16> vertex_id;
             };
-            INSERT_PADDING_BYTES_NOINIT(5);  // ImapFixedFncTexture[10]
-            INSERT_PADDING_BYTES_NOINIT(1);  // ImapReserved
-            INSERT_PADDING_BYTES_NOINIT(3);  // OmapSystemValuesA
-            INSERT_PADDING_BYTES_NOINIT(1);  // OmapSystemValuesB
-            INSERT_PADDING_BYTES_NOINIT(16); // OmapGenericVector[32]
-            INSERT_PADDING_BYTES_NOINIT(2);  // OmapColor
-            INSERT_PADDING_BYTES_NOINIT(2);  // OmapSystemValuesC
-            INSERT_PADDING_BYTES_NOINIT(5);  // OmapFixedFncTexture[10]
-            INSERT_PADDING_BYTES_NOINIT(1);  // OmapReserved
+            INSERT_PADDING_BYTES_NOINIT(5); // ImapFixedFncTexture[10]
+            INSERT_PADDING_BYTES_NOINIT(1); // ImapReserved
+            INSERT_PADDING_BYTES_NOINIT(3); // OmapSystemValuesA
+            INSERT_PADDING_BYTES_NOINIT(1); // OmapSystemValuesB
+
+            union {
+                BitField<0, 1, u8> x;
+                BitField<1, 1, u8> y;
+                BitField<2, 1, u8> z;
+                BitField<3, 1, u8> w;
+                BitField<4, 1, u8> x2;
+                BitField<5, 1, u8> y2;
+                BitField<6, 1, u8> z2;
+                BitField<7, 1, u8> w2;
+                BitField<0, 4, u8> first;
+                BitField<4, 4, u8> second;
+                u8 raw;
+            } omap_generic_vector[16];
+
+            INSERT_PADDING_BYTES_NOINIT(2); // OmapColor
+
+            union {
+                BitField<0, 8, u16> clip_distances;
+                BitField<8, 1, u16> point_sprite_s;
+                BitField<9, 1, u16> point_sprite_t;
+                BitField<10, 1, u16> fog_coordinate;
+                BitField<12, 1, u16> tessellation_eval_point_u;
+                BitField<13, 1, u16> tessellation_eval_point_v;
+                BitField<14, 1, u16> instance_id;
+                BitField<15, 1, u16> vertex_id;
+            } omap_systemc;
+
+            INSERT_PADDING_BYTES_NOINIT(5); // OmapFixedFncTexture[10]
+            INSERT_PADDING_BYTES_NOINIT(1); // OmapReserved
+
+            [[nodiscard]] bool IsInputGenericVectorActive(size_t index) const {
+                if ((index & 1) == 0) {
+                    return imap_generic_vector[index >> 1].first != 0;
+                }
+                return imap_generic_vector[index >> 1].second != 0;
+            }
+
+            [[nodiscard]] bool IsOutputGenericVectorActive(size_t index) const {
+                if ((index & 1) == 0) {
+                    return omap_generic_vector[index >> 1].first != 0;
+                }
+                return omap_generic_vector[index >> 1].second != 0;
+            }
         } vtg;
 
         struct {
@@ -128,6 +181,10 @@ struct ProgramHeader {
                 const auto& vector{imap_generic_vector[attribute]};
                 return {vector.x, vector.y, vector.z, vector.w};
             }
+
+            [[nodiscard]] bool IsGenericVectorActive(size_t index) const {
+                return imap_generic_vector[index].raw != 0;
+            }
         } ps;
 
         std::array<u32, 0xf> raw;
-- 
cgit v1.2.3-70-g09d2