diff options
| author | 2021-06-24 02:41:09 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:39 -0400 | |
| commit | 7dafa96ab59892b7f1fbffdb61e4326e6443955f (patch) | |
| tree | 5ab58d56860db635542ea1ec24be258bd86b40b9 /src/shader_recompiler/program_header.h | |
| parent | vk_graphics_pipeline: Implement conservative rendering (diff) | |
| download | yuzu-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.h | 62 |
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 | ||