18
18
using namespace nbl ;
19
19
using namespace core ;
20
20
21
- // #define TEST_FORMAT
22
-
23
- #ifdef TEST_FORMAT
24
- struct Test_RGB19E7
25
- {
26
- static constexpr const char * name = " rgb19e7" ;
27
-
28
- static uint64_t acc_;
29
- static core::vectorSIMDf fetch ()
30
- {
31
- auto rgb = core::rgb19e7_to_rgb32f (acc_);
32
- return core::vectorSIMDf (rgb.x , rgb.y , rgb.z );
33
- }
34
- static void store (const core::vectorSIMDf& x)
35
- {
36
- acc_ = core::rgb32f_to_rgb19e7 (x.pointer );
37
- }
38
- };
39
- uint64_t Test_RGB19E7::acc_ = core::rgb32f_to_rgb19e7(0 .f, 0 .f, 0 .f);
40
- struct Test_Expected
41
- {
42
- static constexpr const char * name = " expected" ;
43
-
44
- static core::vectorSIMDf acc_;
45
- static core::vectorSIMDf fetch ()
46
- {
47
- return acc_;
48
- }
49
- static void store (const core::vectorSIMDf& x)
50
- {
51
- acc_ = x;
52
- }
53
- };
54
- core::vectorSIMDf Test_Expected::acc_ = core::vectorSIMDf(0 .f);
55
- void print (const core::vectorSIMDf v)
56
- {
57
- std::cout << v.x << " , " << v.y << " , " << v.z << std::endl;
58
- }
59
-
60
- // raygen=0, resolve=1
61
- template <typename Test>
62
- auto test_ ()
63
- {
64
- const core::vectorSIMDf em (0 .f , 0 .5f , 0 .25f );
65
- const core::vectorSIMDf dir (0 .0f );
66
- for (int i = 0 ; i <= 30 ; ++i)
67
- {
68
- std::cout << " i = " << i << std::endl;
69
- float rcp = 1 .f / float (i);
70
- if (rcp < 1 .f )
71
- {
72
- auto acc = Test::fetch ();
73
- acc += core::vectorSIMDf (em / float (i - 1 ));
74
- Test::store (acc);
75
- }
76
- else Test::store (em);
77
- // std::cout << "step 1: "; print(Test::fetch());
78
-
79
- if (rcp < 1 .f )
80
- {
81
- auto acc = Test::fetch ();
82
- acc += (dir - acc) * rcp;
83
- Test::store (acc);
84
- }
85
- else
86
- {
87
- auto acc = Test::fetch ();
88
- acc += dir;
89
- Test::store (acc);
90
- }
91
- std::cout << " step 2: " ; print (Test::fetch ());
92
- }
93
-
94
- return Test::fetch ();
95
- }
96
- template <typename T>
97
- auto test ()
98
- {
99
- const auto result = test_<T>();
100
- std::cout << std::left << std::setw (15 ) << T::name << " result = " << result.x << " , " << result.y << " , " << result.z << " ;\n " ;
101
- return result;
102
- }
103
-
104
21
int main ()
105
22
{
106
- test<Test_RGB19E7>();
107
- /* auto error = core::abs(test<Test_Expected>() - test<Test_RGB19E7>());
108
- std::cout << std::setprecision(15) << error.x << ", " << error.y << ", " << error.z << "\n";*/
109
- return 0 ;
110
- }
111
-
112
- #else
113
-
114
- struct uvec2
115
- {
116
- uvec2 () : x{ 0 ,0 } {}
117
- uvec2 (uint32_t xx, uint32_t yy) : x{ xx,yy } {}
118
- uvec2 (uint64_t xx) : u64 (xx) {}
119
-
120
- operator uint64_t () const { return *reinterpret_cast <const uint64_t *>(x); }
121
-
122
- uint32_t & operator [](int a) { return x[a]; }
123
- private:
124
- union {
125
- uint32_t x[2 ];
126
- uint64_t u64 ;
127
- };
128
- };
129
-
130
- core::rgb32f decode (uvec2 x)
131
- {
132
- int _exp = int ((bitfieldExtract (x[1 ], 25 , 7 ) - 63u ) - 19u );
133
- float scale = exp2 (float (_exp));
134
- rgb32f v;
135
- v.x = float (bitfieldExtract (x[0 ], 0 , 19 ));
136
- v.y = float (bitfieldInsert (bitfieldExtract (x[0 ], 19 , 13 ), bitfieldExtract (x[1 ], 0 , 6 ), 13 , 6 ));
137
- v.z = float (bitfieldExtract (x[1 ], 6 , 19 ));
138
- v.x *= scale;
139
- v.y *= scale;
140
- v.z *= scale;
141
- return v;
142
- }
143
- uvec2 encode (rgb32f col)
144
- {
145
- rgb32f clamped;
146
- clamped.x = clamp (col.x , 0 .f , 35184304979968 .0f );
147
- clamped.y = clamp (col.y , 0 .f , 35184304979968 .0f );
148
- clamped.z = clamp (col.z , 0 .f , 35184304979968 .0f );
149
- float maxrgb = max (max (clamped.x , clamped.y ), clamped.z );
150
- int f32_exp = ((floatBitsToInt (maxrgb) >> 23 ) & 255 ) - 127 ;
151
- int shared_exp = clamp (f32_exp, -64 , 64 ) + 1 ;
152
- uint32_t mantissas[3 ];// = uvec3((clamped * exp2(float(19 - shared_exp))) + vec3(0.5));
153
- float scale = ::exp2 (19 - shared_exp);
154
- uint32_t maxm = maxrgb*scale + 0 .5f ;
155
- bool need = (maxm == float (1u <<19 ));
156
- scale = need ? (scale*0 .5f ) : scale;
157
- shared_exp = need ? (shared_exp+1 ) : shared_exp;
158
- mantissas[0 ] = uint32_t ((clamped.x * scale) + 0 .5f );
159
- mantissas[1 ] = uint32_t ((clamped.y * scale) + 0 .5f );
160
- mantissas[2 ] = uint32_t ((clamped.z * scale) + 0 .5f );
161
- uvec2 encoded;
162
- encoded[0 ] = bitfieldInsert (mantissas[0 ], mantissas[1 ], 19 , 13 );
163
- encoded[1 ] = bitfieldInsert (mantissas[1 ] >> 13 , mantissas[2 ], 6 , 19 ) | ((shared_exp + 63 ) << 25 );
164
- return encoded;
165
- }
166
-
167
-
168
-
169
- int main ()
170
- {
171
- float rgb32_[3 ]{ 0 .f , 0 .333333333f , 0 .f };
172
- rgb32f rgb32; memcpy (&rgb32.x , rgb32_, 12 );
173
- const uvec2 rgb19e7_frame109_input = encode (rgb32); // uvec2(2863136768, 2080374826);
174
-
175
- const float rcp = 0 .14286f ;
176
-
177
- /* uint32_t rgb_[2]{ 2863136768, 2080374826 }; // frame 108
178
- //uint32_t rgb_[2]{ 0, 2080374784 }; // frame 109 step 1
179
- uint64_t* rgb = reinterpret_cast<uint64_t*>(rgb_);
180
- auto _19e7 = core::rgb19e7_to_rgb32f(*rgb);
181
- float t = 1.f;
182
- t /= 6.f;
183
- _19e7.y += t;
184
- *rgb = core::rgb32f_to_rgb19e7(&_19e7.x); // step 1 store (end)
185
- // step 2 start
186
- _19e7 = core::rgb19e7_to_rgb32f(*rgb);
187
- _19e7.y += (0.f - _19e7.y) * rcp;
188
- *rgb = core::rgb32f_to_rgb19e7(&_19e7.x);
189
- _19e7 = core::rgb19e7_to_rgb32f(*rgb);
190
- printf("");
191
- */
192
- uvec2 rgb19e7 = rgb19e7_frame109_input;
193
- auto acc = decode (rgb19e7);
194
- float t = 1 .f ;
195
- t /= 6 .f ;
196
- acc.y += t;
197
- rgb19e7 = encode (acc); // step 1 store (end)
198
- // step 2
199
- acc = decode (rgb19e7);
200
- acc.y += (0 .f - acc.y ) * rcp;
201
- rgb19e7 = encode (acc);
202
- // put into fbo
203
- rgb32f fbo = decode (rgb19e7);
204
- printf (" " );
205
-
206
-
207
23
// create device with full flexibility over creation parameters
208
24
// you can add more parameters if desired, check nbl::SIrrlichtCreationParameters
209
25
nbl::SIrrlichtCreationParameters params;
@@ -497,5 +313,4 @@ int main()
497
313
renderer = nullptr ;
498
314
499
315
return 0 ;
500
- }
501
- #endif
316
+ }
0 commit comments