summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/swr/rasterizer/common/os.cpp48
-rw-r--r--src/gallium/drivers/swr/rasterizer/common/os.h3
-rw-r--r--src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp10
3 files changed, 53 insertions, 8 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/common/os.cpp b/src/gallium/drivers/swr/rasterizer/common/os.cpp
index 295556a5678..27ad5e90b66 100644
--- a/src/gallium/drivers/swr/rasterizer/common/os.cpp
+++ b/src/gallium/drivers/swr/rasterizer/common/os.cpp
@@ -22,8 +22,14 @@
****************************************************************************/
#include "common/os.h"
+#include <vector>
+#include <sstream>
-#if defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__)
+#if defined(_WIN32)
+#include <shlobj.h>
+#endif // Windows
+
+#if defined(__APPLE__) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__)
#include <pthread.h>
#endif // Linux
@@ -105,3 +111,43 @@ void SWR_API SetCurrentThreadName(const char* pThreadName)
pthread_setname_np(pthread_self(), pThreadName);
#endif // Linux
}
+
+static void SplitString(std::vector<std::string>& out_segments, const std::string& input, char splitToken)
+{
+ out_segments.clear();
+
+ std::istringstream f(input);
+ std::string s;
+ while (std::getline(f, s, splitToken))
+ {
+ if (s.size())
+ {
+ out_segments.push_back(s);
+ }
+ }
+}
+
+void SWR_API CreateDirectoryPath(const std::string& path)
+{
+#if defined(_WIN32)
+ SHCreateDirectoryExA(nullptr, path.c_str(), nullptr);
+#endif // Windows
+
+#if defined(__APPLE__) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__)
+ std::vector<std::string> pathSegments;
+ SplitString(pathSegments, path, '/');
+
+ std::string tmpPath;
+ for (auto const& segment : pathSegments)
+ {
+ tmpPath.push_back('/');
+ tmpPath += segment;
+
+ int result = mkdir(tmpPath.c_str(), 0777);
+ if (result == -1 && errno != EEXIST)
+ {
+ break;
+ }
+ }
+#endif // Unix
+}
diff --git a/src/gallium/drivers/swr/rasterizer/common/os.h b/src/gallium/drivers/swr/rasterizer/common/os.h
index f9b6ccaee82..6e4d98f13fc 100644
--- a/src/gallium/drivers/swr/rasterizer/common/os.h
+++ b/src/gallium/drivers/swr/rasterizer/common/os.h
@@ -234,8 +234,6 @@ void AlignedFree(void* p)
pid_t gettid(void);
#define GetCurrentThreadId gettid
-#define CreateDirectory(name, pSecurity) mkdir(name, 0777)
-
#define InterlockedCompareExchange(Dest, Exchange, Comparand) __sync_val_compare_and_swap(Dest, Comparand, Exchange)
#define InterlockedExchangeAdd(Addend, Value) __sync_fetch_and_add(Addend, Value)
#define InterlockedDecrement(Append) __sync_sub_and_fetch(Append, 1)
@@ -281,5 +279,6 @@ typedef MEGABYTE GIGABYTE[1024];
// Defined in os.cpp
void SWR_API SetCurrentThreadName(const char* pThreadName);
+void SWR_API CreateDirectoryPath(const std::string& path);
#endif//__SWR_OS_H__
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
index 5d8ad273d36..2009db09feb 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
@@ -159,9 +159,9 @@ JitManager::JitManager(uint32_t simdWidth, const char *arch, const char* core)
#if defined(_WIN32)
if (KNOB_DUMP_SHADER_IR)
{
- CreateDirectory(INTEL_OUTPUT_DIR, NULL);
- CreateDirectory(SWR_OUTPUT_DIR, NULL);
- CreateDirectory(JITTER_OUTPUT_DIR, NULL);
+ CreateDirectoryPath(INTEL_OUTPUT_DIR);
+ CreateDirectoryPath(SWR_OUTPUT_DIR);
+ CreateDirectoryPath(JITTER_OUTPUT_DIR);
}
#endif
}
@@ -204,7 +204,7 @@ void JitManager::DumpAsm(Function* pFunction, const char* fileName)
const char* pBaseName = strrchr(procname, '\\');
std::stringstream outDir;
outDir << JITTER_OUTPUT_DIR << pBaseName << "_" << pid << std::ends;
- CreateDirectory(outDir.str().c_str(), NULL);
+ CreateDirectoryPath(outDir.str().c_str());
#endif
std::error_code EC;
@@ -242,7 +242,7 @@ void JitManager::DumpToFile(Function *f, const char *fileName)
const char* pBaseName = strrchr(procname, '\\');
std::stringstream outDir;
outDir << JITTER_OUTPUT_DIR << pBaseName << "_" << pid << std::ends;
- CreateDirectory(outDir.str().c_str(), NULL);
+ CreateDirectoryPath(outDir.str().c_str());
#endif
std::error_code EC;