44#include < process.h>
55#include < powerbase.h>
66
7- // mmsystem.h
8- #define MMNOSOUND
9- #define MMNOMIDI
10- #define MMNOAUX
11- #define MMNOMIXER
12- #define MMNOJOY
13- #include < mmsystem.h>
14-
157typedef struct _PROCESSOR_POWER_INFORMATION
168{
179 ULONG Number;
@@ -27,124 +19,65 @@ XRCORE_API Fmatrix Fidentity;
2719XRCORE_API Dmatrix Didentity;
2820XRCORE_API CRandom Random;
2921
30- #ifdef _M_AMD64
31- u16 getFPUsw () { return 0 ; }
32- namespace FPU
33- {
34- XRCORE_API void m24 (void )
35- {
36- _control87 (_PC_24, MCW_PC);
37- _control87 (_RC_CHOP, MCW_RC);
38- }
39-
40- XRCORE_API void m24r (void )
41- {
42- _control87 (_PC_24, MCW_PC);
43- _control87 (_RC_NEAR, MCW_RC);
44- }
45-
46- XRCORE_API void m53 (void )
47- {
48- _control87 (_PC_53, MCW_PC);
49- _control87 (_RC_CHOP, MCW_RC);
50- }
51-
52- XRCORE_API void m53r (void )
53- {
54- _control87 (_PC_53, MCW_PC);
55- _control87 (_RC_NEAR, MCW_RC);
56- }
57-
58- XRCORE_API void m64 (void )
59- {
60- _control87 (_PC_64, MCW_PC);
61- _control87 (_RC_CHOP, MCW_RC);
62- }
63-
64- XRCORE_API void m64r (void )
65- {
66- _control87 (_PC_64, MCW_PC);
67- _control87 (_RC_NEAR, MCW_RC);
68- }
69-
70- void initialize () {}
71- };
72- #else
73- u16 getFPUsw ()
74- {
75- u16 SW;
76- __asm fstcw SW;
77- return SW;
78- }
79-
22+ /*
23+ Функции управления точностью вычислений с плавающей точкой.
24+ Более подробную информацию можно получить здесь:
25+ https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/control87-controlfp-control87-2
26+ Число 24, 53 и 64 - определяют ограничение точности в битах.
27+ Наличие 'r' - включает округление результатов.
28+ Реально в движке используются только m24r и m64r. И один раз m64 - возможно ошибка?
29+ */
8030namespace FPU
8131{
82- u16 _24 = 0 ;
83- u16 _24r = 0 ;
84- u16 _53 = 0 ;
85- u16 _53r = 0 ;
86- u16 _64 = 0 ;
87- u16 _64r = 0 ;
88-
8932XRCORE_API void m24 ()
9033{
91- u16 p = _24 ;
92- __asm fldcw p ;
34+ _controlfp (_PC_24, MCW_PC) ;
35+ _controlfp (_RC_CHOP, MCW_RC) ;
9336}
37+
9438XRCORE_API void m24r ()
9539{
96- u16 p = _24r ;
97- __asm fldcw p ;
40+ _controlfp (_PC_24, MCW_PC) ;
41+ _controlfp (_RC_NEAR, MCW_RC) ;
9842}
43+
9944XRCORE_API void m53 ()
10045{
101- u16 p = _53 ;
102- __asm fldcw p ;
46+ _controlfp (_PC_53, MCW_PC) ;
47+ _controlfp (_RC_CHOP, MCW_RC) ;
10348}
49+
10450XRCORE_API void m53r ()
10551{
106- u16 p = _53r ;
107- __asm fldcw p ;
52+ _controlfp (_PC_53, MCW_PC) ;
53+ _controlfp (_RC_NEAR, MCW_RC) ;
10854}
55+
10956XRCORE_API void m64 ()
11057{
111- u16 p = _64 ;
112- __asm fldcw p ;
58+ _controlfp (_PC_64, MCW_PC) ;
59+ _controlfp (_RC_CHOP, MCW_RC) ;
11360}
61+
11462XRCORE_API void m64r ()
11563{
116- u16 p = _64r ;
117- __asm fldcw p ;
64+ _controlfp (_PC_64, MCW_PC) ;
65+ _controlfp (_RC_NEAR, MCW_RC) ;
11866}
11967
12068void initialize ()
12169{
122- _clear87 ();
123-
124- _control87 (_PC_24, MCW_PC);
125- _control87 (_RC_CHOP, MCW_RC);
126- _24 = getFPUsw (); // 24, chop
127- _control87 (_RC_NEAR, MCW_RC);
128- _24r = getFPUsw (); // 24, rounding
129-
130- _control87 (_PC_53, MCW_PC);
131- _control87 (_RC_CHOP, MCW_RC);
132- _53 = getFPUsw (); // 53, chop
133- _control87 (_RC_NEAR, MCW_RC);
134- _53r = getFPUsw (); // 53, rounding
135-
136- _control87 (_PC_64, MCW_PC);
137- _control87 (_RC_CHOP, MCW_RC);
138- _64 = getFPUsw (); // 64, chop
139- _control87 (_RC_NEAR, MCW_RC);
140- _64r = getFPUsw (); // 64, rounding
141-
142- if (!Core.PluginMode )
70+ _clearfp ();
71+
72+ // По-умолчанию для плагинов экспорта из 3D-редакторов включена высокая точность вычислений с плавающей точкой
73+ if (Core.PluginMode )
74+ m64r ();
75+ else
14376 m24r ();
77+
14478 ::Random.seed (u32 (CPU::GetCLK () % (1i64 << 32i64)));
14579}
14680};
147- #endif
14881
14982namespace CPU
15083{
@@ -251,8 +184,13 @@ extern void __cdecl _terminate();
251184void _initialize_cpu_thread ()
252185{
253186 xrDebug::OnThreadSpawn ();
254- if (!Core.PluginMode )
187+
188+ // По-умолчанию для плагинов экспорта из 3D-редакторов включена высокая точность вычислений с плавающей точкой
189+ if (Core.PluginMode )
190+ FPU::m64r ();
191+ else
255192 FPU::m24r ();
193+
256194 if (CPU::ID.hasFeature (CpuFeature::Sse))
257195 {
258196 // _mm_setcsr ( _mm_getcsr() | (_MM_FLUSH_ZERO_ON+_MM_DENORMALS_ZERO_ON) );
0 commit comments