blob: 1f93ded2e0b173cee68c749f9db168ca0da39fb7 [file] [log] [blame]
Nicolas Capens68a82382018-10-02 13:16:55 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "Constants.hpp"
16
Nicolas Capens1d8c8db2018-11-05 16:30:42 -050017#include "System/Half.hpp"
Ben Claytonbc1c067be2019-12-17 20:37:37 +000018#include "System/Math.hpp"
Nicolas Capens68a82382018-10-02 13:16:55 -040019
Nicolas Capens318d5e02018-11-16 14:28:36 -050020#include <cstring>
Nicolas Capens68a82382018-10-02 13:16:55 -040021
Nicolas Capens157ba262019-12-10 17:49:14 -050022namespace sw {
23
24Constants constants;
25
26Constants::Constants()
Nicolas Capens68a82382018-10-02 13:16:55 -040027{
Ben Claytonbc1c067be2019-12-17 20:37:37 +000028 static const unsigned int transposeBit0[16] = {
Nicolas Capens157ba262019-12-10 17:49:14 -050029 0x00000000,
30 0x00000001,
31 0x00000010,
32 0x00000011,
33 0x00000100,
34 0x00000101,
35 0x00000110,
36 0x00000111,
37 0x00001000,
38 0x00001001,
39 0x00001010,
40 0x00001011,
41 0x00001100,
42 0x00001101,
43 0x00001110,
44 0x00001111
45 };
46
Ben Claytonbc1c067be2019-12-17 20:37:37 +000047 static const unsigned int transposeBit1[16] = {
Nicolas Capens157ba262019-12-10 17:49:14 -050048 0x00000000,
49 0x00000002,
50 0x00000020,
51 0x00000022,
52 0x00000200,
53 0x00000202,
54 0x00000220,
55 0x00000222,
56 0x00002000,
57 0x00002002,
58 0x00002020,
59 0x00002022,
60 0x00002200,
61 0x00002202,
62 0x00002220,
63 0x00002222
64 };
65
Ben Claytonbc1c067be2019-12-17 20:37:37 +000066 static const unsigned int transposeBit2[16] = {
Nicolas Capens157ba262019-12-10 17:49:14 -050067 0x00000000,
68 0x00000004,
69 0x00000040,
70 0x00000044,
71 0x00000400,
72 0x00000404,
73 0x00000440,
74 0x00000444,
75 0x00004000,
76 0x00004004,
77 0x00004040,
78 0x00004044,
79 0x00004400,
80 0x00004404,
81 0x00004440,
82 0x00004444
83 };
84
85 memcpy(&this->transposeBit0, transposeBit0, sizeof(transposeBit0));
86 memcpy(&this->transposeBit1, transposeBit1, sizeof(transposeBit1));
87 memcpy(&this->transposeBit2, transposeBit2, sizeof(transposeBit2));
88
Ben Claytonbc1c067be2019-12-17 20:37:37 +000089 static const ushort4 cWeight[17] = {
90 { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, // 0xFFFF / 1 = 0xFFFF
91 { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, // 0xFFFF / 1 = 0xFFFF
92 { 0x8000, 0x8000, 0x8000, 0x8000 }, // 0xFFFF / 2 = 0x8000
93 { 0x5555, 0x5555, 0x5555, 0x5555 }, // 0xFFFF / 3 = 0x5555
94 { 0x4000, 0x4000, 0x4000, 0x4000 }, // 0xFFFF / 4 = 0x4000
95 { 0x3333, 0x3333, 0x3333, 0x3333 }, // 0xFFFF / 5 = 0x3333
96 { 0x2AAA, 0x2AAA, 0x2AAA, 0x2AAA }, // 0xFFFF / 6 = 0x2AAA
97 { 0x2492, 0x2492, 0x2492, 0x2492 }, // 0xFFFF / 7 = 0x2492
98 { 0x2000, 0x2000, 0x2000, 0x2000 }, // 0xFFFF / 8 = 0x2000
99 { 0x1C71, 0x1C71, 0x1C71, 0x1C71 }, // 0xFFFF / 9 = 0x1C71
100 { 0x1999, 0x1999, 0x1999, 0x1999 }, // 0xFFFF / 10 = 0x1999
101 { 0x1745, 0x1745, 0x1745, 0x1745 }, // 0xFFFF / 11 = 0x1745
102 { 0x1555, 0x1555, 0x1555, 0x1555 }, // 0xFFFF / 12 = 0x1555
103 { 0x13B1, 0x13B1, 0x13B1, 0x13B1 }, // 0xFFFF / 13 = 0x13B1
104 { 0x1249, 0x1249, 0x1249, 0x1249 }, // 0xFFFF / 14 = 0x1249
105 { 0x1111, 0x1111, 0x1111, 0x1111 }, // 0xFFFF / 15 = 0x1111
106 { 0x1000, 0x1000, 0x1000, 0x1000 }, // 0xFFFF / 16 = 0x1000
Nicolas Capens157ba262019-12-10 17:49:14 -0500107 };
108
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000109 static const float4 uvWeight[17] = {
110 { 1.0f / 1.0f, 1.0f / 1.0f, 1.0f / 1.0f, 1.0f / 1.0f },
111 { 1.0f / 1.0f, 1.0f / 1.0f, 1.0f / 1.0f, 1.0f / 1.0f },
112 { 1.0f / 2.0f, 1.0f / 2.0f, 1.0f / 2.0f, 1.0f / 2.0f },
113 { 1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f },
114 { 1.0f / 4.0f, 1.0f / 4.0f, 1.0f / 4.0f, 1.0f / 4.0f },
115 { 1.0f / 5.0f, 1.0f / 5.0f, 1.0f / 5.0f, 1.0f / 5.0f },
116 { 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f },
117 { 1.0f / 7.0f, 1.0f / 7.0f, 1.0f / 7.0f, 1.0f / 7.0f },
118 { 1.0f / 8.0f, 1.0f / 8.0f, 1.0f / 8.0f, 1.0f / 8.0f },
119 { 1.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f },
120 { 1.0f / 10.0f, 1.0f / 10.0f, 1.0f / 10.0f, 1.0f / 10.0f },
121 { 1.0f / 11.0f, 1.0f / 11.0f, 1.0f / 11.0f, 1.0f / 11.0f },
122 { 1.0f / 12.0f, 1.0f / 12.0f, 1.0f / 12.0f, 1.0f / 12.0f },
123 { 1.0f / 13.0f, 1.0f / 13.0f, 1.0f / 13.0f, 1.0f / 13.0f },
124 { 1.0f / 14.0f, 1.0f / 14.0f, 1.0f / 14.0f, 1.0f / 14.0f },
125 { 1.0f / 15.0f, 1.0f / 15.0f, 1.0f / 15.0f, 1.0f / 15.0f },
126 { 1.0f / 16.0f, 1.0f / 16.0f, 1.0f / 16.0f, 1.0f / 16.0f },
Nicolas Capens157ba262019-12-10 17:49:14 -0500127 };
128
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000129 static const float4 uvStart[17] = {
130 { -0.0f / 2.0f, -0.0f / 2.0f, -0.0f / 2.0f, -0.0f / 2.0f },
131 { -0.0f / 2.0f, -0.0f / 2.0f, -0.0f / 2.0f, -0.0f / 2.0f },
132 { -1.0f / 4.0f, -1.0f / 4.0f, -1.0f / 4.0f, -1.0f / 4.0f },
133 { -2.0f / 6.0f, -2.0f / 6.0f, -2.0f / 6.0f, -2.0f / 6.0f },
134 { -3.0f / 8.0f, -3.0f / 8.0f, -3.0f / 8.0f, -3.0f / 8.0f },
135 { -4.0f / 10.0f, -4.0f / 10.0f, -4.0f / 10.0f, -4.0f / 10.0f },
136 { -5.0f / 12.0f, -5.0f / 12.0f, -5.0f / 12.0f, -5.0f / 12.0f },
137 { -6.0f / 14.0f, -6.0f / 14.0f, -6.0f / 14.0f, -6.0f / 14.0f },
138 { -7.0f / 16.0f, -7.0f / 16.0f, -7.0f / 16.0f, -7.0f / 16.0f },
139 { -8.0f / 18.0f, -8.0f / 18.0f, -8.0f / 18.0f, -8.0f / 18.0f },
140 { -9.0f / 20.0f, -9.0f / 20.0f, -9.0f / 20.0f, -9.0f / 20.0f },
141 { -10.0f / 22.0f, -10.0f / 22.0f, -10.0f / 22.0f, -10.0f / 22.0f },
142 { -11.0f / 24.0f, -11.0f / 24.0f, -11.0f / 24.0f, -11.0f / 24.0f },
143 { -12.0f / 26.0f, -12.0f / 26.0f, -12.0f / 26.0f, -12.0f / 26.0f },
144 { -13.0f / 28.0f, -13.0f / 28.0f, -13.0f / 28.0f, -13.0f / 28.0f },
145 { -14.0f / 30.0f, -14.0f / 30.0f, -14.0f / 30.0f, -14.0f / 30.0f },
146 { -15.0f / 32.0f, -15.0f / 32.0f, -15.0f / 32.0f, -15.0f / 32.0f },
Nicolas Capens157ba262019-12-10 17:49:14 -0500147 };
148
149 memcpy(&this->cWeight, cWeight, sizeof(cWeight));
150 memcpy(&this->uvWeight, uvWeight, sizeof(uvWeight));
151 memcpy(&this->uvStart, uvStart, sizeof(uvStart));
152
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000153 static const unsigned int occlusionCount[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
Nicolas Capens157ba262019-12-10 17:49:14 -0500154
155 memcpy(&this->occlusionCount, &occlusionCount, sizeof(occlusionCount));
156
157 for(int i = 0; i < 16; i++)
158 {
159 maskB4Q[i][0] = -(i >> 0 & 1);
160 maskB4Q[i][1] = -(i >> 1 & 1);
161 maskB4Q[i][2] = -(i >> 2 & 1);
162 maskB4Q[i][3] = -(i >> 3 & 1);
163 maskB4Q[i][4] = -(i >> 0 & 1);
164 maskB4Q[i][5] = -(i >> 1 & 1);
165 maskB4Q[i][6] = -(i >> 2 & 1);
166 maskB4Q[i][7] = -(i >> 3 & 1);
167
168 invMaskB4Q[i][0] = ~maskB4Q[i][0];
169 invMaskB4Q[i][1] = ~maskB4Q[i][1];
170 invMaskB4Q[i][2] = ~maskB4Q[i][2];
171 invMaskB4Q[i][3] = ~maskB4Q[i][3];
172 invMaskB4Q[i][4] = ~maskB4Q[i][4];
173 invMaskB4Q[i][5] = ~maskB4Q[i][5];
174 invMaskB4Q[i][6] = ~maskB4Q[i][6];
175 invMaskB4Q[i][7] = ~maskB4Q[i][7];
176
177 maskW4Q[i][0] = -(i >> 0 & 1);
178 maskW4Q[i][1] = -(i >> 1 & 1);
179 maskW4Q[i][2] = -(i >> 2 & 1);
180 maskW4Q[i][3] = -(i >> 3 & 1);
181
182 invMaskW4Q[i][0] = ~maskW4Q[i][0];
183 invMaskW4Q[i][1] = ~maskW4Q[i][1];
184 invMaskW4Q[i][2] = ~maskW4Q[i][2];
185 invMaskW4Q[i][3] = ~maskW4Q[i][3];
186
187 maskD4X[i][0] = -(i >> 0 & 1);
188 maskD4X[i][1] = -(i >> 1 & 1);
189 maskD4X[i][2] = -(i >> 2 & 1);
190 maskD4X[i][3] = -(i >> 3 & 1);
191
192 invMaskD4X[i][0] = ~maskD4X[i][0];
193 invMaskD4X[i][1] = ~maskD4X[i][1];
194 invMaskD4X[i][2] = ~maskD4X[i][2];
195 invMaskD4X[i][3] = ~maskD4X[i][3];
196
197 maskQ0Q[i] = -(i >> 0 & 1);
198 maskQ1Q[i] = -(i >> 1 & 1);
199 maskQ2Q[i] = -(i >> 2 & 1);
200 maskQ3Q[i] = -(i >> 3 & 1);
201
202 invMaskQ0Q[i] = ~maskQ0Q[i];
203 invMaskQ1Q[i] = ~maskQ1Q[i];
204 invMaskQ2Q[i] = ~maskQ2Q[i];
205 invMaskQ3Q[i] = ~maskQ3Q[i];
206
207 maskX0X[i][0] = maskX0X[i][1] = maskX0X[i][2] = maskX0X[i][3] = -(i >> 0 & 1);
208 maskX1X[i][0] = maskX1X[i][1] = maskX1X[i][2] = maskX1X[i][3] = -(i >> 1 & 1);
209 maskX2X[i][0] = maskX2X[i][1] = maskX2X[i][2] = maskX2X[i][3] = -(i >> 2 & 1);
210 maskX3X[i][0] = maskX3X[i][1] = maskX3X[i][2] = maskX3X[i][3] = -(i >> 3 & 1);
211
212 invMaskX0X[i][0] = invMaskX0X[i][1] = invMaskX0X[i][2] = invMaskX0X[i][3] = ~maskX0X[i][0];
213 invMaskX1X[i][0] = invMaskX1X[i][1] = invMaskX1X[i][2] = invMaskX1X[i][3] = ~maskX1X[i][0];
214 invMaskX2X[i][0] = invMaskX2X[i][1] = invMaskX2X[i][2] = invMaskX2X[i][3] = ~maskX2X[i][0];
215 invMaskX3X[i][0] = invMaskX3X[i][1] = invMaskX3X[i][2] = invMaskX3X[i][3] = ~maskX3X[i][0];
216
217 maskD01Q[i][0] = -(i >> 0 & 1);
218 maskD01Q[i][1] = -(i >> 1 & 1);
219 maskD23Q[i][0] = -(i >> 2 & 1);
220 maskD23Q[i][1] = -(i >> 3 & 1);
221
222 invMaskD01Q[i][0] = ~maskD01Q[i][0];
223 invMaskD01Q[i][1] = ~maskD01Q[i][1];
224 invMaskD23Q[i][0] = ~maskD23Q[i][0];
225 invMaskD23Q[i][1] = ~maskD23Q[i][1];
226
227 maskQ01X[i][0] = -(i >> 0 & 1);
228 maskQ01X[i][1] = -(i >> 1 & 1);
229 maskQ23X[i][0] = -(i >> 2 & 1);
230 maskQ23X[i][1] = -(i >> 3 & 1);
231
232 invMaskQ01X[i][0] = ~maskQ01X[i][0];
233 invMaskQ01X[i][1] = ~maskQ01X[i][1];
234 invMaskQ23X[i][0] = ~maskQ23X[i][0];
235 invMaskQ23X[i][1] = ~maskQ23X[i][1];
236 }
237
238 for(int i = 0; i < 8; i++)
239 {
Nicolas Capens53f2a7a2019-12-13 11:53:32 -0500240 mask565Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x07E0 : 0) | (i & 0x4 ? 0xF800 : 0));
Alexis Hetuf97fb9d2019-12-17 14:40:19 -0500241 mask11X[i] = dword4((i & 0x1 ? 0x000007FFu : 0) | (i & 0x2 ? 0x003FF800u : 0) | (i & 0x4 ? 0xFFC00000u : 0));
Nicolas Capens157ba262019-12-10 17:49:14 -0500242 }
243
Nicolas Capens81bc9d92019-12-16 15:05:57 -0500244 for(int i = 0; i < 16; i++)
Nicolas Capens157ba262019-12-10 17:49:14 -0500245 {
Nicolas Capens53f2a7a2019-12-13 11:53:32 -0500246 mask5551Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x03E0 : 0) | (i & 0x4 ? 0x7C00 : 0) | (i & 8 ? 0x8000 : 0));
Nicolas Capens157ba262019-12-10 17:49:14 -0500247 }
248
249 for(int i = 0; i < 4; i++)
250 {
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000251 maskW01Q[i][0] = -(i >> 0 & 1);
252 maskW01Q[i][1] = -(i >> 1 & 1);
253 maskW01Q[i][2] = -(i >> 0 & 1);
254 maskW01Q[i][3] = -(i >> 1 & 1);
Nicolas Capens157ba262019-12-10 17:49:14 -0500255
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000256 maskD01X[i][0] = -(i >> 0 & 1);
257 maskD01X[i][1] = -(i >> 1 & 1);
258 maskD01X[i][2] = -(i >> 0 & 1);
259 maskD01X[i][3] = -(i >> 1 & 1);
Nicolas Capens157ba262019-12-10 17:49:14 -0500260 }
261
Nicolas Capens81bc9d92019-12-16 15:05:57 -0500262 for(int i = 0; i < 16; i++)
Nicolas Capens157ba262019-12-10 17:49:14 -0500263 {
264 mask10Q[i][0] = mask10Q[i][1] =
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000265 (i & 0x1 ? 0x3FF : 0) |
266 (i & 0x2 ? 0xFFC00 : 0) |
267 (i & 0x4 ? 0x3FF00000 : 0) |
268 (i & 0x8 ? 0xC0000000 : 0);
Nicolas Capens157ba262019-12-10 17:49:14 -0500269 }
270
271 for(int i = 0; i < 256; i++)
272 {
Nicolas Capens9e5d5472019-12-17 10:16:30 -0500273 sRGBtoLinear8_16[i] = (unsigned short)(sRGBtoLinear((float)i / 0xFF) * 0xFFFF + 0.5f);
Nicolas Capens157ba262019-12-10 17:49:14 -0500274 }
275
276 for(int i = 0; i < 0x1000; i++)
277 {
Nicolas Capens9e5d5472019-12-17 10:16:30 -0500278 linearToSRGB12_16[i] = (unsigned short)(clamp(linearToSRGB((float)i / 0x0FFF) * 0xFFFF + 0.5f, 0.0f, (float)0xFFFF));
279 sRGBtoLinear12_16[i] = (unsigned short)(clamp(sRGBtoLinear((float)i / 0x0FFF) * 0xFFFF + 0.5f, 0.0f, (float)0xFFFF));
Nicolas Capens157ba262019-12-10 17:49:14 -0500280 }
281
Nicolas Capens9e5d5472019-12-17 10:16:30 -0500282 const float4 X[4] = {
283 float4(SampleLocationsX[0]),
284 float4(SampleLocationsX[1]),
285 float4(SampleLocationsX[2]),
286 float4(SampleLocationsX[3]),
Nicolas Capens157ba262019-12-10 17:49:14 -0500287 };
288
Nicolas Capens9e5d5472019-12-17 10:16:30 -0500289 const float4 Y[4] = {
290 float4(SampleLocationsY[0]),
291 float4(SampleLocationsY[1]),
292 float4(SampleLocationsY[2]),
293 float4(SampleLocationsY[3]),
Nicolas Capens157ba262019-12-10 17:49:14 -0500294 };
295
296 for(int q = 0; q < 4; q++)
297 {
298 for(int c = 0; c < 16; c++)
Nicolas Capens68a82382018-10-02 13:16:55 -0400299 {
Nicolas Capens157ba262019-12-10 17:49:14 -0500300 for(int i = 0; i < 4; i++)
Nicolas Capens68a82382018-10-02 13:16:55 -0400301 {
Alexis Hetub9fc42d2020-01-23 17:00:58 -0500302 sampleX[q][c][i] = c & (1 << i) ? X[q][0] : 0.0f;
303 sampleY[q][c][i] = c & (1 << i) ? Y[q][0] : 0.0f;
Nicolas Capens157ba262019-12-10 17:49:14 -0500304 weight[c][i] = c & (1 << i) ? 1.0f : 0.0f;
Nicolas Capens68a82382018-10-02 13:16:55 -0400305 }
306 }
Nicolas Capens68a82382018-10-02 13:16:55 -0400307 }
Nicolas Capens157ba262019-12-10 17:49:14 -0500308
309 constexpr auto subPixB = vk::SUBPIXEL_PRECISION_BITS;
310
Alexis Hetub9fc42d2020-01-23 17:00:58 -0500311 const int Xf[4] = { toFixedPoint(X[0][0], subPixB), toFixedPoint(X[1][0], subPixB), toFixedPoint(X[2][0], subPixB), toFixedPoint(X[3][0], subPixB) };
312 const int Yf[4] = { toFixedPoint(Y[0][0], subPixB), toFixedPoint(Y[1][0], subPixB), toFixedPoint(Y[2][0], subPixB), toFixedPoint(Y[3][0], subPixB) };
Nicolas Capens157ba262019-12-10 17:49:14 -0500313
314 memcpy(&this->Xf, &Xf, sizeof(Xf));
315 memcpy(&this->Yf, &Yf, sizeof(Yf));
316
317 memcpy(&this->X, &X, sizeof(X));
318 memcpy(&this->Y, &Y, sizeof(Y));
319
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000320 const dword maxX[16] = { 0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00010000, 0x00010001, 0x00010100, 0x00010101, 0x01000000, 0x01000001, 0x01000100, 0x01000101, 0x01010000, 0x01010001, 0x01010100, 0x01010101 };
321 const dword maxY[16] = { 0x00000000, 0x00000002, 0x00000200, 0x00000202, 0x00020000, 0x00020002, 0x00020200, 0x00020202, 0x02000000, 0x02000002, 0x02000200, 0x02000202, 0x02020000, 0x02020002, 0x02020200, 0x02020202 };
322 const dword maxZ[16] = { 0x00000000, 0x00000004, 0x00000400, 0x00000404, 0x00040000, 0x00040004, 0x00040400, 0x00040404, 0x04000000, 0x04000004, 0x04000400, 0x04000404, 0x04040000, 0x04040004, 0x04040400, 0x04040404 };
323 const dword minX[16] = { 0x00000000, 0x00000008, 0x00000800, 0x00000808, 0x00080000, 0x00080008, 0x00080800, 0x00080808, 0x08000000, 0x08000008, 0x08000800, 0x08000808, 0x08080000, 0x08080008, 0x08080800, 0x08080808 };
324 const dword minY[16] = { 0x00000000, 0x00000010, 0x00001000, 0x00001010, 0x00100000, 0x00100010, 0x00101000, 0x00101010, 0x10000000, 0x10000010, 0x10001000, 0x10001010, 0x10100000, 0x10100010, 0x10101000, 0x10101010 };
325 const dword minZ[16] = { 0x00000000, 0x00000020, 0x00002000, 0x00002020, 0x00200000, 0x00200020, 0x00202000, 0x00202020, 0x20000000, 0x20000020, 0x20002000, 0x20002020, 0x20200000, 0x20200020, 0x20202000, 0x20202020 };
326 const dword fini[16] = { 0x00000000, 0x00000080, 0x00008000, 0x00008080, 0x00800000, 0x00800080, 0x00808000, 0x00808080, 0x80000000, 0x80000080, 0x80008000, 0x80008080, 0x80800000, 0x80800080, 0x80808000, 0x80808080 };
Nicolas Capens157ba262019-12-10 17:49:14 -0500327
328 memcpy(&this->maxX, &maxX, sizeof(maxX));
329 memcpy(&this->maxY, &maxY, sizeof(maxY));
330 memcpy(&this->maxZ, &maxZ, sizeof(maxZ));
331 memcpy(&this->minX, &minX, sizeof(minX));
332 memcpy(&this->minY, &minY, sizeof(minY));
333 memcpy(&this->minZ, &minZ, sizeof(minZ));
334 memcpy(&this->fini, &fini, sizeof(fini));
335
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000336 static const dword4 maxPos = { 0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFE };
Nicolas Capens157ba262019-12-10 17:49:14 -0500337
338 memcpy(&this->maxPos, &maxPos, sizeof(maxPos));
339
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000340 static const float4 unscaleByte = { 1.0f / 0xFF, 1.0f / 0xFF, 1.0f / 0xFF, 1.0f / 0xFF };
341 static const float4 unscaleSByte = { 1.0f / 0x7F, 1.0f / 0x7F, 1.0f / 0x7F, 1.0f / 0x7F };
342 static const float4 unscaleShort = { 1.0f / 0x7FFF, 1.0f / 0x7FFF, 1.0f / 0x7FFF, 1.0f / 0x7FFF };
343 static const float4 unscaleUShort = { 1.0f / 0xFFFF, 1.0f / 0xFFFF, 1.0f / 0xFFFF, 1.0f / 0xFFFF };
344 static const float4 unscaleInt = { 1.0f / 0x7FFFFFFF, 1.0f / 0x7FFFFFFF, 1.0f / 0x7FFFFFFF, 1.0f / 0x7FFFFFFF };
345 static const float4 unscaleUInt = { 1.0f / 0xFFFFFFFF, 1.0f / 0xFFFFFFFF, 1.0f / 0xFFFFFFFF, 1.0f / 0xFFFFFFFF };
346 static const float4 unscaleFixed = { 1.0f / 0x00010000, 1.0f / 0x00010000, 1.0f / 0x00010000, 1.0f / 0x00010000 };
Nicolas Capens157ba262019-12-10 17:49:14 -0500347
348 memcpy(&this->unscaleByte, &unscaleByte, sizeof(unscaleByte));
349 memcpy(&this->unscaleSByte, &unscaleSByte, sizeof(unscaleSByte));
350 memcpy(&this->unscaleShort, &unscaleShort, sizeof(unscaleShort));
351 memcpy(&this->unscaleUShort, &unscaleUShort, sizeof(unscaleUShort));
352 memcpy(&this->unscaleInt, &unscaleInt, sizeof(unscaleInt));
353 memcpy(&this->unscaleUInt, &unscaleUInt, sizeof(unscaleUInt));
354 memcpy(&this->unscaleFixed, &unscaleFixed, sizeof(unscaleFixed));
355
356 for(int i = 0; i <= 0xFFFF; i++)
357 {
Ben Claytonbc1c067be2019-12-17 20:37:37 +0000358 half2float[i] = (float)reinterpret_cast<half &>(i);
Nicolas Capens157ba262019-12-10 17:49:14 -0500359 }
360}
361
362} // namespace sw