freedreno/ir3: fix register usage calculations
[mesa.git] / src / gallium / auxiliary / os / os_misc.c
index 384988017b7f46014a9003184722db00bbac640f..c46078bb07dfc4ad23632ec6d4160961b6f8c7da 100644 (file)
 #include <stdarg.h>
 
 
-#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY
-
-#include <windows.h>
-#include <winddi.h>
-
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_CE)
-
-#include <stdio.h> 
-#include <stdlib.h> 
-#include <windows.h> 
-#include <types.h> 
-
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
 
 #ifndef WIN32_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN      // Exclude rarely-used stuff from Windows headers
 #endif
 
 
-#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY
-static INLINE void 
-_EngDebugPrint(const char *format, ...)
-{
-   va_list ap;
-   va_start(ap, format);
-   EngDebugPrint("", (PCHAR)format, ap);
-   va_end(ap);
-}
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
+#  include <unistd.h>
+#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
+#  include <sys/sysctl.h>
+#elif defined(PIPE_OS_HAIKU)
+#  include <kernel/OS.h>
+#elif defined(PIPE_OS_WINDOWS)
+#  include <windows.h>
+#else
+#error unexpected platform in os_sysinfo.c
 #endif
 
 
 void
 os_log_message(const char *message)
 {
-#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
-   _EngDebugPrint("%s", message);
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+   /* If the GALLIUM_LOG_FILE environment variable is set to a valid filename,
+    * write all messages to that file.
+    */
+   static FILE *fout = NULL;
+
+   if (!fout) {
+      /* one-time init */
+      const char *filename = os_get_option("GALLIUM_LOG_FILE");
+      if (filename)
+         fout = fopen(filename, "w");
+      if (!fout)
+         fout = stderr;
+   }
+
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
    OutputDebugStringA(message);
    if(GetConsoleWindow() && !IsDebuggerPresent()) {
       fflush(stdout);
-      fputs(message, stderr);
-      fflush(stderr);
+      fputs(message, fout);
+      fflush(fout);
+   }
+   else if (fout != stderr) {
+      fputs(message, fout);
+      fflush(fout);
    }
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_CE)
-   wchar_t *wide_format;
-   long wide_str_len;   
-   /* Format is ascii - needs to be converted to wchar_t for printing */   
-   wide_str_len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0);
-   wide_format = (wchar_t *) malloc((wide_str_len+1) * sizeof(wchar_t));   
-   if (wide_format) {   
-      MultiByteToWideChar(CP_ACP, 0, message, -1,
-            wide_format, wide_str_len);   
-      NKDbgPrintfW(wide_format, wide_format);   
-      free(wide_format);   
-   } 
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT)
-   /* TODO */
 #else /* !PIPE_SUBSYSTEM_WINDOWS */
    fflush(stdout);
-   fputs(message, stderr);
+   fputs(message, fout);
+   fflush(fout);
 #endif
 }
 
 
-#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY
-static const char *
-find(const char *start, const char *end, char c)
-{
-   const char *p;
-   for(p = start; !end || p != end; ++p) {
-      if(*p == c)
-         return p;
-      if(*p < 32)
-         break;
-   }
-   return NULL;
-}
-
-static int
-compare(const char *start, const char *end, const char *s)
-{
-   const char *p, *q;
-   for(p = start, q = s; p != end && *q != '\0'; ++p, ++q) {
-      if(*p != *q)
-         return 0;
-   }
-   return p == end && *q == '\0';
-}
-
-static void
-copy(char *dst, const char *start, const char *end, size_t n)
+const char *
+os_get_option(const char *name)
 {
-   const char *p;
-   char *q;
-   for(p = start, q = dst, n = n - 1; p != end && n; ++p, ++q, --n)
-      *q = *p;
-   *q = '\0';
+   return getenv(name);
 }
-#endif
 
 
-const char *
-os_get_option(const char *name)
+/**
+ * Return the size of the total physical memory.
+ * \param size returns the size of the total physical memory
+ * \return true for success, or false on failure
+ */
+bool
+os_get_total_physical_memory(uint64_t *size)
 {
-#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
-   /* EngMapFile creates the file if it does not exists, so it must either be
-    * disabled on release versions (or put in a less conspicuous place). */
-#ifdef DEBUG
-   const char *result = NULL;
-   ULONG_PTR iFile = 0;
-   const void *pMap = NULL;
-   const char *sol, *eol, *sep;
-   static char output[1024];
-   
-   pMap = EngMapFile(L"\\??\\c:\\gallium.cfg", 0, &iFile);
-   if(pMap) {
-      sol = (const char *)pMap;
-      while(1) {
-        /* TODO: handle LF line endings */
-        eol = find(sol, NULL, '\r');
-        if(!eol || eol == sol)
-           break;
-        sep = find(sol, eol, '=');
-        if(!sep)
-           break;
-        if(compare(sol, sep, name)) {
-           copy(output, sep + 1, eol, sizeof(output));
-           result = output;
-           break;
-        }
-        sol = eol + 2;
-      }
-      EngUnmapFile(iFile);
-   }
-   return result;
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
+   const long phys_pages = sysconf(_SC_PHYS_PAGES);
+   const long page_size = sysconf(_SC_PAGE_SIZE);
+
+   *size = phys_pages * page_size;
+   return (phys_pages > 0 && page_size > 0);
+#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
+   size_t len = sizeof(*size);
+   int mib[2];
+
+   mib[0] = CTL_HW;
+#if defined(PIPE_OS_APPLE)
+   mib[1] = HW_MEMSIZE;
+#elif defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD)
+   mib[1] = HW_PHYSMEM64;
+#elif defined(PIPE_OS_FREEBSD)
+   mib[1] = HW_REALMEM;
+#elif defined(PIPE_OS_DRAGONFLY)
+   mib[1] = HW_PHYSMEM;
 #else
-   return NULL;
+#error Unsupported *BSD
 #endif
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_CE) || defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT) 
-   /* TODO: implement */
-   return NULL;
+
+   return (sysctl(mib, 2, size, &len, NULL, 0) == 0);
+#elif defined(PIPE_OS_HAIKU)
+   system_info info;
+   status_t ret;
+
+   ret = get_system_info(&info);
+   *size = info.max_pages * B_PAGE_SIZE;
+   return (ret == B_OK);
+#elif defined(PIPE_OS_WINDOWS)
+   MEMORYSTATUSEX status;
+   BOOL ret;
+
+   status.dwLength = sizeof(status);
+   ret = GlobalMemoryStatusEx(&status);
+   *size = status.ullTotalPhys;
+   return (ret == TRUE);
 #else
-   return getenv(name);
+#error unexpected platform in os_sysinfo.c
+   return false;
 #endif
 }
-