+inline u32 getTime(TimePrecision prec)
+{
+ switch (prec) {
+ case PRECISION_SECONDS:
+ return getTimeS();
+ case PRECISION_MILLI:
+ return getTimeMs();
+ case PRECISION_MICRO:
+ return getTimeUs();
+ case PRECISION_NANO:
+ return getTimeNs();
+ }
+ return 0;
+}
+
+/**
+ * Delta calculation function taking two 32bit arguments.
+ * @param old_time_ms old time for delta calculation (order is relevant!)
+ * @param new_time_ms new time for delta calculation (order is relevant!)
+ * @return positive 32bit delta value
+ */
+inline u32 getDeltaMs(u32 old_time_ms, u32 new_time_ms)
+{
+ if (new_time_ms >= old_time_ms) {
+ return (new_time_ms - old_time_ms);
+ } else {
+ return (old_time_ms - new_time_ms);
+ }
+}
+
+#if defined(linux) || defined(__linux)
+ #include <sys/prctl.h>
+
+ inline void setThreadName(const char *name) {
+ /* It would be cleaner to do this with pthread_setname_np,
+ * which was added to glibc in version 2.12, but some major
+ * distributions are still runing 2.11 and previous versions.
+ */
+ prctl(PR_SET_NAME, name);
+ }
+#elif defined(__FreeBSD__) || defined(__OpenBSD__)
+ #include <pthread.h>
+ #include <pthread_np.h>
+
+ inline void setThreadName(const char *name) {
+ pthread_set_name_np(pthread_self(), name);
+ }
+#elif defined(__NetBSD__)
+ #include <pthread.h>
+
+ inline void setThreadName(const char *name) {
+ pthread_setname_np(pthread_self(), name);
+ }
+#elif defined(_MSC_VER)
+ typedef struct tagTHREADNAME_INFO {
+ DWORD dwType; // must be 0x1000
+ LPCSTR szName; // pointer to name (in user addr space)
+ DWORD dwThreadID; // thread ID (-1=caller thread)
+ DWORD dwFlags; // reserved for future use, must be zero
+ } THREADNAME_INFO;
+
+ inline void setThreadName(const char *name) {
+ THREADNAME_INFO info;
+ info.dwType = 0x1000;
+ info.szName = name;
+ info.dwThreadID = -1;
+ info.dwFlags = 0;
+ __try {
+ RaiseException(0x406D1388, 0, sizeof(info) / sizeof(DWORD), (ULONG_PTR *) &info);
+ } __except (EXCEPTION_CONTINUE_EXECUTION) {}
+ }
+#elif defined(__APPLE__)
+ #include <pthread.h>
+
+ inline void setThreadName(const char *name) {
+ pthread_setname_np(name);
+ }
+#elif defined(_WIN32)
+ inline void setThreadName(const char* name) {}
+#else
+ #warning "Unrecognized platform, thread names will not be available."
+ inline void setThreadName(const char* name) {}
+#endif
+
+#ifndef SERVER
+float getDisplayDensity();
+
+v2u32 getDisplaySize();
+v2u32 getWindowSize();
+
+std::vector<irr::video::E_DRIVER_TYPE> getSupportedVideoDrivers();
+const char *getVideoDriverName(irr::video::E_DRIVER_TYPE type);
+const char *getVideoDriverFriendlyName(irr::video::E_DRIVER_TYPE type);
+#endif
+
+inline const char * getPlatformName()
+{
+ return
+#if defined(ANDROID)
+ "Android"
+#elif defined(linux) || defined(__linux) || defined(__linux__)
+ "Linux"
+#elif defined(_WIN32) || defined(_WIN64)
+ "Windows"
+#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
+ defined(__NetBSD__) || defined(__OpenBSD__)
+ "BSD"
+#elif defined(__APPLE__) && defined(__MACH__)
+ #if TARGET_OS_MAC
+ "OSX"
+ #elif TARGET_OS_IPHONE
+ "iOS"
+ #else
+ "Apple"
+ #endif
+#elif defined(_AIX)
+ "AIX"
+#elif defined(__hpux)
+ "HP-UX"
+#elif defined(__sun) && defined(__SVR4)
+ "Solaris"
+#elif defined(__CYGWIN__)
+ "Cygwin"
+#elif defined(__unix__) || defined(__unix)
+ #if defined(_POSIX_VERSION)
+ "Posix"
+ #else
+ "Unix"
+ #endif
+#else
+ "?"
+#endif
+ ;
+}
+
+void setXorgClassHint(const video::SExposedVideoData &video_data,
+ const std::string &name);
+