summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/program_header.h
diff options
context:
space:
mode:
authorGravatar FernandoS272021-04-04 06:47:14 +0200
committerGravatar ameerj2021-07-22 21:51:26 -0400
commit1d51803169f72f79e19995072fb9e8a371dbdcbf (patch)
treeeb668d924985e4b0bd599a695a0a2eee30fd0090 /src/shader_recompiler/program_header.h
parentshader: Implement AL2P (diff)
downloadyuzu-1d51803169f72f79e19995072fb9e8a371dbdcbf.tar.gz
yuzu-1d51803169f72f79e19995072fb9e8a371dbdcbf.tar.xz
yuzu-1d51803169f72f79e19995072fb9e8a371dbdcbf.zip
shader: Implement indexed attributes
Diffstat (limited to 'src/shader_recompiler/program_header.h')
-rw-r--r--src/shader_recompiler/program_header.h83
1 files changed, 70 insertions, 13 deletions
diff --git a/src/shader_recompiler/program_header.h b/src/shader_recompiler/program_header.h
index 1544bfa42..ce65fc1a4 100644
--- a/src/shader_recompiler/program_header.h
+++ b/src/shader_recompiler/program_header.h
@@ -68,10 +68,24 @@ struct ProgramHeader {
68 68
69 union { 69 union {
70 struct { 70 struct {
71 INSERT_PADDING_BYTES_NOINIT(3); // ImapSystemValuesA 71 INSERT_PADDING_BYTES_NOINIT(3); // ImapSystemValuesA
72 INSERT_PADDING_BYTES_NOINIT(1); // ImapSystemValuesB 72 INSERT_PADDING_BYTES_NOINIT(1); // ImapSystemValuesB
73 INSERT_PADDING_BYTES_NOINIT(16); // ImapGenericVector[32] 73
74 INSERT_PADDING_BYTES_NOINIT(2); // ImapColor 74 union {
75 BitField<0, 1, u8> x;
76 BitField<1, 1, u8> y;
77 BitField<2, 1, u8> z;
78 BitField<3, 1, u8> w;
79 BitField<4, 1, u8> x2;
80 BitField<5, 1, u8> y2;
81 BitField<6, 1, u8> z2;
82 BitField<7, 1, u8> w2;
83 BitField<0, 4, u8> first;
84 BitField<4, 4, u8> second;
85 u8 raw;
86 } imap_generic_vector[16];
87
88 INSERT_PADDING_BYTES_NOINIT(2); // ImapColor
75 union { 89 union {
76 BitField<0, 8, u16> clip_distances; 90 BitField<0, 8, u16> clip_distances;
77 BitField<8, 1, u16> point_sprite_s; 91 BitField<8, 1, u16> point_sprite_s;
@@ -82,15 +96,54 @@ struct ProgramHeader {
82 BitField<14, 1, u16> instance_id; 96 BitField<14, 1, u16> instance_id;
83 BitField<15, 1, u16> vertex_id; 97 BitField<15, 1, u16> vertex_id;
84 }; 98 };
85 INSERT_PADDING_BYTES_NOINIT(5); // ImapFixedFncTexture[10] 99 INSERT_PADDING_BYTES_NOINIT(5); // ImapFixedFncTexture[10]
86 INSERT_PADDING_BYTES_NOINIT(1); // ImapReserved 100 INSERT_PADDING_BYTES_NOINIT(1); // ImapReserved
87 INSERT_PADDING_BYTES_NOINIT(3); // OmapSystemValuesA 101 INSERT_PADDING_BYTES_NOINIT(3); // OmapSystemValuesA
88 INSERT_PADDING_BYTES_NOINIT(1); // OmapSystemValuesB 102 INSERT_PADDING_BYTES_NOINIT(1); // OmapSystemValuesB
89 INSERT_PADDING_BYTES_NOINIT(16); // OmapGenericVector[32] 103
90 INSERT_PADDING_BYTES_NOINIT(2); // OmapColor 104 union {
91 INSERT_PADDING_BYTES_NOINIT(2); // OmapSystemValuesC 105 BitField<0, 1, u8> x;
92 INSERT_PADDING_BYTES_NOINIT(5); // OmapFixedFncTexture[10] 106 BitField<1, 1, u8> y;
93 INSERT_PADDING_BYTES_NOINIT(1); // OmapReserved 107 BitField<2, 1, u8> z;
108 BitField<3, 1, u8> w;
109 BitField<4, 1, u8> x2;
110 BitField<5, 1, u8> y2;
111 BitField<6, 1, u8> z2;
112 BitField<7, 1, u8> w2;
113 BitField<0, 4, u8> first;
114 BitField<4, 4, u8> second;
115 u8 raw;
116 } omap_generic_vector[16];
117
118 INSERT_PADDING_BYTES_NOINIT(2); // OmapColor
119
120 union {
121 BitField<0, 8, u16> clip_distances;
122 BitField<8, 1, u16> point_sprite_s;
123 BitField<9, 1, u16> point_sprite_t;
124 BitField<10, 1, u16> fog_coordinate;
125 BitField<12, 1, u16> tessellation_eval_point_u;
126 BitField<13, 1, u16> tessellation_eval_point_v;
127 BitField<14, 1, u16> instance_id;
128 BitField<15, 1, u16> vertex_id;
129 } omap_systemc;
130
131 INSERT_PADDING_BYTES_NOINIT(5); // OmapFixedFncTexture[10]
132 INSERT_PADDING_BYTES_NOINIT(1); // OmapReserved
133
134 [[nodiscard]] bool IsInputGenericVectorActive(size_t index) const {
135 if ((index & 1) == 0) {
136 return imap_generic_vector[index >> 1].first != 0;
137 }
138 return imap_generic_vector[index >> 1].second != 0;
139 }
140
141 [[nodiscard]] bool IsOutputGenericVectorActive(size_t index) const {
142 if ((index & 1) == 0) {
143 return omap_generic_vector[index >> 1].first != 0;
144 }
145 return omap_generic_vector[index >> 1].second != 0;
146 }
94 } vtg; 147 } vtg;
95 148
96 struct { 149 struct {
@@ -128,6 +181,10 @@ struct ProgramHeader {
128 const auto& vector{imap_generic_vector[attribute]}; 181 const auto& vector{imap_generic_vector[attribute]};
129 return {vector.x, vector.y, vector.z, vector.w}; 182 return {vector.x, vector.y, vector.z, vector.w};
130 } 183 }
184
185 [[nodiscard]] bool IsGenericVectorActive(size_t index) const {
186 return imap_generic_vector[index].raw != 0;
187 }
131 } ps; 188 } ps;
132 189
133 std::array<u32, 0xf> raw; 190 std::array<u32, 0xf> raw;