summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-03-24 16:26:14 -0400
committerGravatar bunnei2018-03-26 21:16:54 -0400
commit15925b82930cf619f81c26acca9cc8208e009149 (patch)
treecdc0c48fda84a5dcbb354527ba6cafff4a5ec360 /src
parentgl_rasterizer: Use 32 texture units instead of 3. (diff)
downloadyuzu-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.h281
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