source: Plugins/rdtscTimeSource/Cpu.h @ 1

Revision 1, 4.8 KB checked in by art, 13 years ago (diff)
Line 
1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13#ifndef __NR_ENGINE_CPU_H_
14#define __NR_ENGINE_CPU_H_
15
16//----------------------------------------------------------------------------------
17// Includes
18//----------------------------------------------------------------------------------
19#include <nrEngine/nrEngine.h>
20
21using namespace nrEngine;
22
23/**
24* Cpu class represents a CPU found in the system where the engine
25* is running. It can be used to get inforamtion about CPU features.
26* It is also needed to setup high performance counter.
27*
28**/
29class Cpu{
30        public:
31                /**
32                * Standard constructor, setting up the cpu features to unknown
33                **/
34                Cpu();
35
36                /**
37                * Detect all information about the used CPU.
38                * THe infromation about the CPU will be getted from cpuid
39                * assembler function. This will full registers with cpu flags
40                * which then will be readed and transformed into readable text.
41                **/
42                void detect();
43
44
45                /**
46                * Calculate the CPU-Speed through high performance timers.
47                * Because the calculation is done through the rdtsc timer you are not able
48                * to retrive the cpu speed information if such instruction is not supported
49                * by your CPU.<br>
50                * Because the calculation need some time to take, you can specify the parameter
51                * here. Longer time calculation produce more representative results.<br>
52                * You need to recalculate the speed if you using a CPU which does support
53                * freqeuncy stepping. (on some motherboards it can also be done by FSB stepping).
54                * So to get the timers working fine also by changing the frequency, you have
55                * to poll for right speed sometimes.
56                **/
57                void calculateSpeed(uint32 calcTimeInMilliseconds = 100);
58
59                /**
60                * Run the rdtsc assembler instruction and return the tick value
61                * to the given variable back.
62                * If such an instruction is not supported, 0 will be given back
63                **/
64                void rdtsc(uint64& ticks);
65
66                /**
67                * Return the name of the Vendor of the CPU
68                **/
69                NR_FORCEINLINE const std::string& getVendor() const     { return m_strVendor; }
70
71                /**
72                * Get the Name of the CPU i.e. K7, 486i, ...
73                **/
74                NR_FORCEINLINE const std::string& getName() const       { return m_strName; }
75
76                /**
77                * Generate a string containing all data about the CPU
78                **/
79                NR_FORCEINLINE const std::string& getCPUDescription() const { return m_strDescr; }
80
81                /**
82                * Get  the speed in Hz how fast the CPU is
83                **/
84                NR_FORCEINLINE uint64 getSpeed()                                        { return m_nSpeed; }
85
86                /**
87                * Get the speed in Mhz of the CPU
88                **/
89                NR_FORCEINLINE float32 getSpeedMhz()                            { return m_fSpeedMhz; }
90
91                //! Is the high performance tick counter supported
92                NR_FORCEINLINE bool isRDTSC()   {return m_bRDTSC;}
93
94                //! Is MMX supported
95                NR_FORCEINLINE bool isMMX()     {return m_bMMX; }
96
97                //! Is MMX-Ex supported
98                NR_FORCEINLINE bool isMMXEx()   {return m_bMMXEx; }
99
100                //! Are SSE Extensions supported
101                NR_FORCEINLINE bool isSSE()     { return m_bSSE; }
102
103                //! True if CPU supports SSE2 Extensions
104                NR_FORCEINLINE bool isSSE2()    { return m_bSSE2; }
105
106                //! If the CPU support 3DNow! Extension, return true
107                NR_FORCEINLINE bool is3dNow()   { return m_b3DNow; }
108
109                //! Extended 3DNow! Extensions support
110                NR_FORCEINLINE bool is3dNowEx(){ return m_b3DNowEx; }
111
112        private:
113
114                /** CPUID Wrapper Funktion **/
115                void _cpuid(uint32 function,
116                                        uint32 &out_eax,
117                                        uint32 &out_ebx,
118                                        uint32 &out_ecx,
119                                        uint32 &out_edx);
120
121                /** Check whenever CPUID - Assembler feature is supported **/
122                bool _cpuidSupported();
123
124                //! CPU Vendor
125                std::string             m_strVendor;
126
127                //! CPU Name
128                std::string             m_strName;
129
130                //! Formatted description of the CPU
131                std::string                             m_strDescr;
132
133                //! Speed of CPU in Hz
134                uint64  m_nSpeed;
135
136                //! Speed of CPU in Mhz
137                float32 m_fSpeedMhz;
138
139                //! High performance real timer support
140                bool    m_bRDTSC;
141
142                //! MMX support
143                bool    m_bMMX;
144
145                //! Extended MMX support
146                bool    m_bMMXEx;
147
148                //! Streaming SIMD Extensions
149                bool    m_bSSE;
150
151                //! Streaming SIMD Extensions 2
152                bool    m_bSSE2;
153
154                //! 3DNow! (AMD specific extensions)
155                bool    m_b3DNowEx;
156
157                //! 3DNow! (vendor independant)
158                bool    m_b3DNow;
159
160                //! Provide the scripts with information
161                ScriptFunctionDef(getCpuString);
162
163};
164
165#endif
166
Note: See TracBrowser for help on using the repository browser.