diff options
| author | 2018-03-24 16:26:14 -0400 | |
|---|---|---|
| committer | 2018-03-26 21:16:54 -0400 | |
| commit | 15925b82930cf619f81c26acca9cc8208e009149 (patch) | |
| tree | cdc0c48fda84a5dcbb354527ba6cafff4a5ec360 /src | |
| parent | gl_rasterizer: Use 32 texture units instead of 3. (diff) | |
| download | yuzu-15925b82930cf619f81c26acca9cc8208e009149.tar.gz yuzu-15925b82930cf619f81c26acca9cc8208e009149.tar.xz yuzu-15925b82930cf619f81c26acca9cc8208e009149.zip | |
maxwell_3d: Add VertexAttribute struct and cleanup.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 281 |
1 files changed, 160 insertions, 121 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 869ddde90..c242786da 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -60,88 +60,169 @@ public: | |||
| 60 | Fragment = 4, | 60 | Fragment = 4, |
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | enum class VertexSize : u32 { | 63 | struct VertexAttribute { |
| 64 | Size_32_32_32_32 = 0x01, | 64 | enum class Size : u32 { |
| 65 | Size_32_32_32 = 0x02, | 65 | Size_32_32_32_32 = 0x01, |
| 66 | Size_16_16_16_16 = 0x03, | 66 | Size_32_32_32 = 0x02, |
| 67 | Size_32_32 = 0x04, | 67 | Size_16_16_16_16 = 0x03, |
| 68 | Size_16_16_16 = 0x05, | 68 | Size_32_32 = 0x04, |
| 69 | Size_8_8_8_8 = 0x0a, | 69 | Size_16_16_16 = 0x05, |
| 70 | Size_16_16 = 0x0f, | 70 | Size_8_8_8_8 = 0x0a, |
| 71 | Size_32 = 0x12, | 71 | Size_16_16 = 0x0f, |
| 72 | Size_8_8_8 = 0x13, | 72 | Size_32 = 0x12, |
| 73 | Size_8_8 = 0x18, | 73 | Size_8_8_8 = 0x13, |
| 74 | Size_16 = 0x1b, | 74 | Size_8_8 = 0x18, |
| 75 | Size_8 = 0x1d, | 75 | Size_16 = 0x1b, |
| 76 | Size_10_10_10_2 = 0x30, | 76 | Size_8 = 0x1d, |
| 77 | Size_11_11_10 = 0x31, | 77 | Size_10_10_10_2 = 0x30, |
| 78 | }; | 78 | Size_11_11_10 = 0x31, |
| 79 | }; | ||
| 80 | |||
| 81 | enum class Type : u32 { | ||
| 82 | SignedNorm = 1, | ||
| 83 | UnsignedNorm = 2, | ||
| 84 | SignedInt = 3, | ||
| 85 | UnsignedInt = 4, | ||
| 86 | UnsignedScaled = 5, | ||
| 87 | SignedScaled = 6, | ||
| 88 | Float = 7, | ||
| 89 | }; | ||
| 79 | 90 | ||
| 80 | static std::string VertexSizeToString(VertexSize vertex_size) { | 91 | union { |
| 81 | switch (vertex_size) { | 92 | BitField<0, 5, u32> buffer; |
| 82 | case VertexSize::Size_32_32_32_32: | 93 | BitField<6, 1, u32> constant; |
| 83 | return "32_32_32_32"; | 94 | BitField<7, 14, u32> offset; |
| 84 | case VertexSize::Size_32_32_32: | 95 | BitField<21, 6, Size> size; |
| 85 | return "32_32_32"; | 96 | BitField<27, 3, Type> type; |
| 86 | case VertexSize::Size_16_16_16_16: | 97 | BitField<31, 1, u32> bgra; |
| 87 | return "16_16_16_16"; | 98 | }; |
| 88 | case VertexSize::Size_32_32: | 99 | |
| 89 | return "32_32"; | 100 | u32 ComponentCount() const { |
| 90 | case VertexSize::Size_16_16_16: | 101 | switch (size) { |
| 91 | return "16_16_16"; | 102 | case Size::Size_32_32_32_32: |
| 92 | case VertexSize::Size_8_8_8_8: | 103 | return 4; |
| 93 | return "8_8_8_8"; | 104 | case Size::Size_32_32_32: |
| 94 | case VertexSize::Size_16_16: | 105 | return 3; |
| 95 | return "16_16"; | 106 | case Size::Size_16_16_16_16: |
| 96 | case VertexSize::Size_32: | 107 | return 4; |
| 97 | return "32"; | 108 | case Size::Size_32_32: |
| 98 | case VertexSize::Size_8_8_8: | 109 | return 2; |
| 99 | return "8_8_8"; | 110 | case Size::Size_16_16_16: |
| 100 | case VertexSize::Size_8_8: | 111 | return 3; |
| 101 | return "8_8"; | 112 | case Size::Size_8_8_8_8: |
| 102 | case VertexSize::Size_16: | 113 | return 4; |
| 103 | return "16"; | 114 | case Size::Size_16_16: |
| 104 | case VertexSize::Size_8: | 115 | return 2; |
| 105 | return "8"; | 116 | case Size::Size_32: |
| 106 | case VertexSize::Size_10_10_10_2: | 117 | return 1; |
| 107 | return "10_10_10_2"; | 118 | case Size::Size_8_8_8: |
| 108 | case VertexSize::Size_11_11_10: | 119 | return 3; |
| 109 | return "11_11_10"; | 120 | case Size::Size_8_8: |
| 121 | return 2; | ||
| 122 | case Size::Size_16: | ||
| 123 | return 1; | ||
| 124 | case Size::Size_8: | ||
| 125 | return 1; | ||
| 126 | case Size::Size_10_10_10_2: | ||
| 127 | return 4; | ||
| 128 | case Size::Size_11_11_10: | ||
| 129 | return 3; | ||
| 130 | default: | ||
| 131 | UNREACHABLE(); | ||
| 132 | } | ||
| 110 | } | 133 | } |
| 111 | UNIMPLEMENTED(); | ||
| 112 | return {}; | ||
| 113 | } | ||
| 114 | |||
| 115 | enum class VertexType : u32 { | ||
| 116 | SignedNorm = 1, | ||
| 117 | UnsignedNorm = 2, | ||
| 118 | SignedInt = 3, | ||
| 119 | UnsignedInt = 4, | ||
| 120 | UnsignedScaled = 5, | ||
| 121 | SignedScaled = 6, | ||
| 122 | Float = 7, | ||
| 123 | }; | ||
| 124 | 134 | ||
| 125 | static std::string VertexTypeToString(VertexType vertex_type) { | 135 | u32 SizeInBytes() const { |
| 126 | switch (vertex_type) { | 136 | switch (size) { |
| 127 | case VertexType::SignedNorm: | 137 | case Size::Size_32_32_32_32: |
| 128 | return "SignedNorm"; | 138 | return 16; |
| 129 | case VertexType::UnsignedNorm: | 139 | case Size::Size_32_32_32: |
| 130 | return "UnsignedNorm"; | 140 | return 12; |
| 131 | case VertexType::SignedInt: | 141 | case Size::Size_16_16_16_16: |
| 132 | return "SignedInt"; | 142 | return 8; |
| 133 | case VertexType::UnsignedInt: | 143 | case Size::Size_32_32: |
| 134 | return "UnsignedInt"; | 144 | return 8; |
| 135 | case VertexType::UnsignedScaled: | 145 | case Size::Size_16_16_16: |
| 136 | return "UnsignedScaled"; | 146 | return 6; |
| 137 | case VertexType::SignedScaled: | 147 | case Size::Size_8_8_8_8: |
| 138 | return "SignedScaled"; | 148 | return 4; |
| 139 | case VertexType::Float: | 149 | case Size::Size_16_16: |
| 140 | return "Float"; | 150 | return 4; |
| 151 | case Size::Size_32: | ||
| 152 | return 4; | ||
| 153 | case Size::Size_8_8_8: | ||
| 154 | return 3; | ||
| 155 | case Size::Size_8_8: | ||
| 156 | return 2; | ||
| 157 | case Size::Size_16: | ||
| 158 | return 2; | ||
| 159 | case Size::Size_8: | ||
| 160 | return 1; | ||
| 161 | case Size::Size_10_10_10_2: | ||
| 162 | return 4; | ||
| 163 | case Size::Size_11_11_10: | ||
| 164 | return 4; | ||
| 165 | default: | ||
| 166 | UNREACHABLE(); | ||
| 167 | } | ||
| 141 | } | 168 | } |
| 142 | UNIMPLEMENTED(); | 169 | |
| 143 | return {}; | 170 | std::string SizeString() const { |
| 144 | } | 171 | switch (size) { |
| 172 | case Size::Size_32_32_32_32: | ||
| 173 | return "32_32_32_32"; | ||
| 174 | case Size::Size_32_32_32: | ||
| 175 | return "32_32_32"; | ||
| 176 | case Size::Size_16_16_16_16: | ||
| 177 | return "16_16_16_16"; | ||
| 178 | case Size::Size_32_32: | ||
| 179 | return "32_32"; | ||
| 180 | case Size::Size_16_16_16: | ||
| 181 | return "16_16_16"; | ||
| 182 | case Size::Size_8_8_8_8: | ||
| 183 | return "8_8_8_8"; | ||
| 184 | case Size::Size_16_16: | ||
| 185 | return "16_16"; | ||
| 186 | case Size::Size_32: | ||
| 187 | return "32"; | ||
| 188 | case Size::Size_8_8_8: | ||
| 189 | return "8_8_8"; | ||
| 190 | case Size::Size_8_8: | ||
| 191 | return "8_8"; | ||
| 192 | case Size::Size_16: | ||
| 193 | return "16"; | ||
| 194 | case Size::Size_8: | ||
| 195 | return "8"; | ||
| 196 | case Size::Size_10_10_10_2: | ||
| 197 | return "10_10_10_2"; | ||
| 198 | case Size::Size_11_11_10: | ||
| 199 | return "11_11_10"; | ||
| 200 | } | ||
| 201 | UNREACHABLE(); | ||
| 202 | return {}; | ||
| 203 | } | ||
| 204 | |||
| 205 | std::string TypeToString() const { | ||
| 206 | switch (type) { | ||
| 207 | case Type::SignedNorm: | ||
| 208 | return "SignedNorm"; | ||
| 209 | case Type::UnsignedNorm: | ||
| 210 | return "UnsignedNorm"; | ||
| 211 | case Type::SignedInt: | ||
| 212 | return "SignedInt"; | ||
| 213 | case Type::UnsignedInt: | ||
| 214 | return "UnsignedInt"; | ||
| 215 | case Type::UnsignedScaled: | ||
| 216 | return "UnsignedScaled"; | ||
| 217 | case Type::SignedScaled: | ||
| 218 | return "SignedScaled"; | ||
| 219 | case Type::Float: | ||
| 220 | return "Float"; | ||
| 221 | } | ||
| 222 | UNREACHABLE(); | ||
| 223 | return {}; | ||
| 224 | } | ||
| 225 | }; | ||
| 145 | 226 | ||
| 146 | enum class PrimitiveTopology : u32 { | 227 | enum class PrimitiveTopology : u32 { |
| 147 | Points = 0x0, | 228 | Points = 0x0, |
| @@ -222,49 +303,7 @@ public: | |||
| 222 | 303 | ||
| 223 | INSERT_PADDING_WORDS(0x5B); | 304 | INSERT_PADDING_WORDS(0x5B); |
| 224 | 305 | ||
| 225 | union { | 306 | VertexAttribute vertex_attrib_format[NumVertexAttributes]; |
| 226 | BitField<0, 5, u32> buffer; | ||
| 227 | BitField<6, 1, u32> constant; | ||
| 228 | BitField<7, 14, u32> offset; | ||
| 229 | BitField<21, 6, VertexSize> size; | ||
| 230 | BitField<27, 3, VertexType> type; | ||
| 231 | BitField<31, 1, u32> bgra; | ||
| 232 | |||
| 233 | u32 SizeInBytes() const { | ||
| 234 | switch (size) { | ||
| 235 | case VertexSize::Size_32_32_32_32: | ||
| 236 | return 16; | ||
| 237 | case VertexSize::Size_32_32_32: | ||
| 238 | return 12; | ||
| 239 | case VertexSize::Size_16_16_16_16: | ||
| 240 | return 8; | ||
| 241 | case VertexSize::Size_32_32: | ||
| 242 | return 8; | ||
| 243 | case VertexSize::Size_16_16_16: | ||
| 244 | return 6; | ||
| 245 | case VertexSize::Size_8_8_8_8: | ||
| 246 | return 4; | ||
| 247 | case VertexSize::Size_16_16: | ||
| 248 | return 4; | ||
| 249 | case VertexSize::Size_32: | ||
| 250 | return 4; | ||
| 251 | case VertexSize::Size_8_8_8: | ||
| 252 | return 3; | ||
| 253 | case VertexSize::Size_8_8: | ||
| 254 | return 2; | ||
| 255 | case VertexSize::Size_16: | ||
| 256 | return 2; | ||
| 257 | case VertexSize::Size_8: | ||
| 258 | return 1; | ||
| 259 | case VertexSize::Size_10_10_10_2: | ||
| 260 | return 4; | ||
| 261 | case VertexSize::Size_11_11_10: | ||
| 262 | return 4; | ||
| 263 | default: | ||
| 264 | UNREACHABLE(); | ||
| 265 | } | ||
| 266 | } | ||
| 267 | } vertex_attrib_format[NumVertexAttributes]; | ||
| 268 | 307 | ||
| 269 | INSERT_PADDING_WORDS(0xF); | 308 | INSERT_PADDING_WORDS(0xF); |
| 270 | 309 | ||