diff options
| author | 2021-04-04 06:47:14 +0200 | |
|---|---|---|
| committer | 2021-07-22 21:51:26 -0400 | |
| commit | 1d51803169f72f79e19995072fb9e8a371dbdcbf (patch) | |
| tree | eb668d924985e4b0bd599a695a0a2eee30fd0090 /src/shader_recompiler/program_header.h | |
| parent | shader: Implement AL2P (diff) | |
| download | yuzu-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.h | 83 |
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; |