summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/program_header.h
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-06-24 02:41:09 -0300
committerGravatar ameerj2021-07-22 21:51:39 -0400
commit7dafa96ab59892b7f1fbffdb61e4326e6443955f (patch)
tree5ab58d56860db635542ea1ec24be258bd86b40b9 /src/shader_recompiler/program_header.h
parentvk_graphics_pipeline: Implement conservative rendering (diff)
downloadyuzu-7dafa96ab59892b7f1fbffdb61e4326e6443955f.tar.gz
yuzu-7dafa96ab59892b7f1fbffdb61e4326e6443955f.tar.xz
yuzu-7dafa96ab59892b7f1fbffdb61e4326e6443955f.zip
shader: Rework varyings and implement passthrough geometry shaders
Put all varyings into a single std::bitset with helpers to access it. Implement passthrough geometry shaders using host's.
Diffstat (limited to 'src/shader_recompiler/program_header.h')
-rw-r--r--src/shader_recompiler/program_header.h62
1 files changed, 21 insertions, 41 deletions
diff --git a/src/shader_recompiler/program_header.h b/src/shader_recompiler/program_header.h
index 6933750aa..bd6c2bfb5 100644
--- a/src/shader_recompiler/program_header.h
+++ b/src/shader_recompiler/program_header.h
@@ -37,7 +37,9 @@ struct ProgramHeader {
37 BitField<15, 1, u32> kills_pixels; 37 BitField<15, 1, u32> kills_pixels;
38 BitField<16, 1, u32> does_global_store; 38 BitField<16, 1, u32> does_global_store;
39 BitField<17, 4, u32> sass_version; 39 BitField<17, 4, u32> sass_version;
40 BitField<21, 5, u32> reserved; 40 BitField<21, 2, u32> reserved1;
41 BitField<24, 1, u32> geometry_passthrough;
42 BitField<25, 1, u32> reserved2;
41 BitField<26, 1, u32> does_load_or_store; 43 BitField<26, 1, u32> does_load_or_store;
42 BitField<27, 1, u32> does_fp64; 44 BitField<27, 1, u32> does_fp64;
43 BitField<28, 4, u32> stream_out_mask; 45 BitField<28, 4, u32> stream_out_mask;
@@ -79,24 +81,10 @@ struct ProgramHeader {
79 BitField<5, 1, u8> position_y; 81 BitField<5, 1, u8> position_y;
80 BitField<6, 1, u8> position_z; 82 BitField<6, 1, u8> position_z;
81 BitField<7, 1, u8> position_w; 83 BitField<7, 1, u8> position_w;
82 BitField<0, 4, u8> first;
83 BitField<4, 4, u8> position;
84 u8 raw; 84 u8 raw;
85 } imap_systemb; 85 } imap_systemb;
86 86
87 union { 87 std::array<u8, 16> imap_generic_vector;
88 BitField<0, 1, u8> x;
89 BitField<1, 1, u8> y;
90 BitField<2, 1, u8> z;
91 BitField<3, 1, u8> w;
92 BitField<4, 1, u8> x2;
93 BitField<5, 1, u8> y2;
94 BitField<6, 1, u8> z2;
95 BitField<7, 1, u8> w2;
96 BitField<0, 4, u8> first;
97 BitField<4, 4, u8> second;
98 u8 raw;
99 } imap_generic_vector[16];
100 88
101 INSERT_PADDING_BYTES_NOINIT(2); // ImapColor 89 INSERT_PADDING_BYTES_NOINIT(2); // ImapColor
102 union { 90 union {
@@ -122,24 +110,10 @@ struct ProgramHeader {
122 BitField<5, 1, u8> position_y; 110 BitField<5, 1, u8> position_y;
123 BitField<6, 1, u8> position_z; 111 BitField<6, 1, u8> position_z;
124 BitField<7, 1, u8> position_w; 112 BitField<7, 1, u8> position_w;
125 BitField<0, 4, u8> first;
126 BitField<4, 4, u8> position;
127 u8 raw; 113 u8 raw;
128 } omap_systemb; 114 } omap_systemb;
129 115
130 union { 116 std::array<u8, 16> omap_generic_vector;
131 BitField<0, 1, u8> x;
132 BitField<1, 1, u8> y;
133 BitField<2, 1, u8> z;
134 BitField<3, 1, u8> w;
135 BitField<4, 1, u8> x2;
136 BitField<5, 1, u8> y2;
137 BitField<6, 1, u8> z2;
138 BitField<7, 1, u8> w2;
139 BitField<0, 4, u8> first;
140 BitField<4, 4, u8> second;
141 u8 raw;
142 } omap_generic_vector[16];
143 117
144 INSERT_PADDING_BYTES_NOINIT(2); // OmapColor 118 INSERT_PADDING_BYTES_NOINIT(2); // OmapColor
145 119
@@ -157,18 +131,24 @@ struct ProgramHeader {
157 INSERT_PADDING_BYTES_NOINIT(5); // OmapFixedFncTexture[10] 131 INSERT_PADDING_BYTES_NOINIT(5); // OmapFixedFncTexture[10]
158 INSERT_PADDING_BYTES_NOINIT(1); // OmapReserved 132 INSERT_PADDING_BYTES_NOINIT(1); // OmapReserved
159 133
160 [[nodiscard]] bool IsInputGenericVectorActive(size_t index) const { 134 [[nodiscard]] std::array<bool, 4> InputGeneric(size_t index) const noexcept {
161 if ((index & 1) == 0) { 135 const int data{imap_generic_vector[index >> 1] >> ((index % 2) * 4)};
162 return imap_generic_vector[index >> 1].first != 0; 136 return {
163 } 137 (data & 1) != 0,
164 return imap_generic_vector[index >> 1].second != 0; 138 (data & 2) != 0,
139 (data & 4) != 0,
140 (data & 8) != 0,
141 };
165 } 142 }
166 143
167 [[nodiscard]] bool IsOutputGenericVectorActive(size_t index) const { 144 [[nodiscard]] std::array<bool, 4> OutputGeneric(size_t index) const noexcept {
168 if ((index & 1) == 0) { 145 const int data{omap_generic_vector[index >> 1] >> ((index % 2) * 4)};
169 return omap_generic_vector[index >> 1].first != 0; 146 return {
170 } 147 (data & 1) != 0,
171 return omap_generic_vector[index >> 1].second != 0; 148 (data & 2) != 0,
149 (data & 4) != 0,
150 (data & 8) != 0,
151 };
172 } 152 }
173 } vtg; 153 } vtg;
174 154