Fix T37817: cycles CUDA detection problem on Windows with non-ascii paths.

This commit is contained in:
Brecht Van Lommel 2014-01-11 00:47:58 +01:00
parent 9e1ca28589
commit 241fccaf6a
5 changed files with 66 additions and 20 deletions

@ -355,7 +355,14 @@ public:
/* open module */ /* open module */
cuda_push_context(); cuda_push_context();
CUresult result = cuModuleLoad(&cuModule, cubin.c_str()); string cubin_data;
CUresult result;
if (path_read_text(cubin, cubin_data))
result = cuModuleLoadData(&cuModule, cubin_data.c_str());
else
result = CUDA_ERROR_FILE_NOT_FOUND;
if(cuda_error_(result, "cuModuleLoad")) if(cuda_error_(result, "cuModuleLoad"))
cuda_error_message(string_printf("Failed loading CUDA kernel %s.", cubin.c_str())); cuda_error_message(string_printf("Failed loading CUDA kernel %s.", cubin.c_str()));

@ -79,7 +79,7 @@ void Cache::insert(CacheData& key, CacheData& value)
{ {
string filename = data_filename(key); string filename = data_filename(key);
path_create_directories(filename); path_create_directories(filename);
FILE *f = fopen(filename.c_str(), "wb"); FILE *f = path_fopen(filename, "wb");
if(!f) { if(!f) {
fprintf(stderr, "Failed to open file %s for writing.\n", filename.c_str()); fprintf(stderr, "Failed to open file %s for writing.\n", filename.c_str());
@ -100,7 +100,7 @@ void Cache::insert(CacheData& key, CacheData& value)
bool Cache::lookup(CacheData& key, CacheData& value) bool Cache::lookup(CacheData& key, CacheData& value)
{ {
string filename = data_filename(key); string filename = data_filename(key);
FILE *f = fopen(filename.c_str(), "rb"); FILE *f = path_fopen(filename, "rb");
if(!f) if(!f)
return false; return false;

@ -24,6 +24,7 @@
/* Minor modifications done to remove some code and change style. */ /* Minor modifications done to remove some code and change style. */
#include "util_md5.h" #include "util_md5.h"
#include "util_path.h"
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
@ -311,7 +312,7 @@ void MD5Hash::append(const uint8_t *data, int nbytes)
bool MD5Hash::append_file(const string& filepath) bool MD5Hash::append_file(const string& filepath)
{ {
FILE *f = fopen(filepath.c_str(), "rb"); FILE *f = path_fopen(filepath, "rb");
if(!f) { if(!f) {
fprintf(stderr, "MD5: failed to open file %s\n", filepath.c_str()); fprintf(stderr, "MD5: failed to open file %s\n", filepath.c_str());

@ -19,6 +19,7 @@
#include "util_path.h" #include "util_path.h"
#include "util_string.h" #include "util_string.h"
#include <OpenImageIO/strutil.h>
#include <OpenImageIO/sysutil.h> #include <OpenImageIO/sysutil.h>
OIIO_NAMESPACE_USING OIIO_NAMESPACE_USING
@ -38,6 +39,25 @@ CCL_NAMESPACE_BEGIN
static string cached_path = ""; static string cached_path = "";
static string cached_user_path = ""; static string cached_user_path = "";
static boost::filesystem::path to_boost(const string& path)
{
#ifdef _MSC_VER
std::wstring path_utf16 = Strutil::utf8_to_utf16(path);
return boost::filesystem::path(path_utf16);
#else
return boost::filesystem::path(path);
#endif
}
static string from_boost(const boost::filesystem::path& path)
{
#ifdef _MSC_VER
return Strutil::utf16_to_utf8(path.wstring());
#else
return path.string();
#endif
}
void path_init(const string& path, const string& user_path) void path_init(const string& path, const string& user_path)
{ {
cached_path = path; cached_path = path;
@ -45,7 +65,7 @@ void path_init(const string& path, const string& user_path)
#ifdef _MSC_VER #ifdef _MSC_VER
// fix for https://svn.boost.org/trac/boost/ticket/6320 // fix for https://svn.boost.org/trac/boost/ticket/6320
boost::filesystem::path::imbue( std::locale( "" ) ); boost::filesystem::path::imbue( std::locale( "" ) );
#endif #endif
} }
@ -68,20 +88,20 @@ string path_user_get(const string& sub)
string path_filename(const string& path) string path_filename(const string& path)
{ {
#if (BOOST_FILESYSTEM_VERSION == 2) #if (BOOST_FILESYSTEM_VERSION == 2)
return boost::filesystem::path(path).filename(); return to_boost(path).filename();
#else #else
return boost::filesystem::path(path).filename().string(); return from_boost(to_boost(path).filename());
#endif #endif
} }
string path_dirname(const string& path) string path_dirname(const string& path)
{ {
return boost::filesystem::path(path).parent_path().string(); return from_boost(to_boost(path).parent_path());
} }
string path_join(const string& dir, const string& file) string path_join(const string& dir, const string& file)
{ {
return (boost::filesystem::path(dir) / boost::filesystem::path(file)).string(); return from_boost((to_boost(dir) / to_boost(file)));
} }
string path_escape(const string& path) string path_escape(const string& path)
@ -93,20 +113,22 @@ string path_escape(const string& path)
bool path_exists(const string& path) bool path_exists(const string& path)
{ {
return boost::filesystem::exists(path); return boost::filesystem::exists(to_boost(path));
} }
static void path_files_md5_hash_recursive(MD5Hash& hash, const string& dir) static void path_files_md5_hash_recursive(MD5Hash& hash, const string& dir)
{ {
if(boost::filesystem::exists(dir)) { boost::filesystem::path dirpath = to_boost(dir);
boost::filesystem::directory_iterator it(dir), it_end;
if(boost::filesystem::exists(dirpath)) {
boost::filesystem::directory_iterator it(dirpath), it_end;
for(; it != it_end; it++) { for(; it != it_end; it++) {
if(boost::filesystem::is_directory(it->status())) { if(boost::filesystem::is_directory(it->status())) {
path_files_md5_hash_recursive(hash, it->path().string()); path_files_md5_hash_recursive(hash, from_boost(it->path()));
} }
else { else {
string filepath = it->path().string(); string filepath = from_boost(it->path());
hash.append((const uint8_t*)filepath.c_str(), filepath.size()); hash.append((const uint8_t*)filepath.c_str(), filepath.size());
hash.append_file(filepath); hash.append_file(filepath);
@ -127,7 +149,7 @@ string path_files_md5_hash(const string& dir)
void path_create_directories(const string& path) void path_create_directories(const string& path)
{ {
boost::filesystem::create_directories(path_dirname(path)); boost::filesystem::create_directories(to_boost(path_dirname(path)));
} }
bool path_write_binary(const string& path, const vector<uint8_t>& binary) bool path_write_binary(const string& path, const vector<uint8_t>& binary)
@ -135,7 +157,7 @@ bool path_write_binary(const string& path, const vector<uint8_t>& binary)
path_create_directories(path); path_create_directories(path);
/* write binary file from memory */ /* write binary file from memory */
FILE *f = fopen(path.c_str(), "wb"); FILE *f = path_fopen(path, "wb");
if(!f) if(!f)
return false; return false;
@ -158,10 +180,10 @@ bool path_write_text(const string& path, string& text)
bool path_read_binary(const string& path, vector<uint8_t>& binary) bool path_read_binary(const string& path, vector<uint8_t>& binary)
{ {
binary.resize(boost::filesystem::file_size(path)); binary.resize(boost::filesystem::file_size(to_boost(path)));
/* read binary file into memory */ /* read binary file into memory */
FILE *f = fopen(path.c_str(), "rb"); FILE *f = path_fopen(path, "rb");
if(!f) if(!f)
return false; return false;
@ -197,8 +219,8 @@ bool path_read_text(const string& path, string& text)
uint64_t path_modified_time(const string& path) uint64_t path_modified_time(const string& path)
{ {
if(boost::filesystem::exists(path)) if(boost::filesystem::exists(to_boost(path)))
return (uint64_t)boost::filesystem::last_write_time(path); return (uint64_t)boost::filesystem::last_write_time(to_boost(path));
return 0; return 0;
} }
@ -230,5 +252,17 @@ string path_source_replace_includes(const string& source_, const string& path)
return source; return source;
} }
FILE *path_fopen(const string& path, const string& mode)
{
#ifdef _WIN32
std::wstring path_utf16 = Strutil::utf8_to_utf16(path);
std::wstring mode_utf16 = Strutil::utf8_to_utf16(mode);
return _wfopen(path_utf16.c_str(), mode_utf16.c_str());
#else
return fopen(path.c_str(), mode.c_str());
#endif
}
CCL_NAMESPACE_END CCL_NAMESPACE_END

@ -22,6 +22,8 @@
* linked libraries, the path to the library may be set with path_init, which * linked libraries, the path to the library may be set with path_init, which
* then makes all paths relative to that. */ * then makes all paths relative to that. */
#include <stdio.h>
#include "util_string.h" #include "util_string.h"
#include "util_types.h" #include "util_types.h"
#include "util_vector.h" #include "util_vector.h"
@ -50,6 +52,8 @@ uint64_t path_modified_time(const string& path);
string path_source_replace_includes(const string& source, const string& path); string path_source_replace_includes(const string& source, const string& path);
FILE *path_fopen(const string& path, const string& mode);
CCL_NAMESPACE_END CCL_NAMESPACE_END
#endif #endif