diff options
Diffstat (limited to 'intern/cycles/util')
-rw-r--r-- | intern/cycles/util/CMakeLists.txt | 3 | ||||
-rw-r--r-- | intern/cycles/util/util_atomic.h (renamed from intern/cycles/util/util_dynlib.h) | 28 | ||||
-rw-r--r-- | intern/cycles/util/util_dynlib.cpp | 94 | ||||
-rw-r--r-- | intern/cycles/util/util_logging.h | 2 | ||||
-rw-r--r-- | intern/cycles/util/util_math.h | 18 | ||||
-rw-r--r-- | intern/cycles/util/util_md5.cpp | 12 | ||||
-rw-r--r-- | intern/cycles/util/util_optimization.h | 3 | ||||
-rw-r--r-- | intern/cycles/util/util_path.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/util/util_progress.h | 29 | ||||
-rw-r--r-- | intern/cycles/util/util_ssef.h | 2 | ||||
-rw-r--r-- | intern/cycles/util/util_stats.h | 9 | ||||
-rw-r--r-- | intern/cycles/util/util_types.h | 12 | ||||
-rw-r--r-- | intern/cycles/util/util_vector.h | 3 |
13 files changed, 81 insertions, 150 deletions
diff --git a/intern/cycles/util/CMakeLists.txt b/intern/cycles/util/CMakeLists.txt index 842d5efac79..a07deb68b15 100644 --- a/intern/cycles/util/CMakeLists.txt +++ b/intern/cycles/util/CMakeLists.txt @@ -10,7 +10,6 @@ set(INC_SYS set(SRC util_cache.cpp - util_dynlib.cpp util_logging.cpp util_md5.cpp util_path.cpp @@ -31,10 +30,10 @@ endif() set(SRC_HEADERS util_algorithm.h util_args.h + util_atomic.h util_boundbox.h util_cache.h util_debug.h - util_dynlib.h util_foreach.h util_function.h util_half.h diff --git a/intern/cycles/util/util_dynlib.h b/intern/cycles/util/util_atomic.h index b30cf98c1b9..1bbb0a86e23 100644 --- a/intern/cycles/util/util_dynlib.h +++ b/intern/cycles/util/util_atomic.h @@ -1,5 +1,5 @@ /* - * Copyright 2011-2013 Blender Foundation + * Copyright 2014 Blender Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,18 +14,20 @@ * limitations under the License */ -#ifndef __UTIL_DYNLIB_H__ -#define __UTIL_DYNLIB_H__ +#ifndef __UTIL_ATOMIC_H__ +#define __UTIL_ATOMIC_H__ -CCL_NAMESPACE_BEGIN +/* Using atomic ops header from Blender. */ +#include "atomic_ops.h" -struct DynamicLibrary; - -DynamicLibrary *dynamic_library_open(const char *name); -void *dynamic_library_find(DynamicLibrary *lib, const char *name); -void dynamic_library_close(DynamicLibrary *lib); - -CCL_NAMESPACE_END - -#endif /* __UTIL_DYNLIB_H__ */ +ATOMIC_INLINE void atomic_update_max_z(size_t *maximum_value, size_t value) +{ + size_t prev_value = *maximum_value; + while (prev_value < value) { + if (atomic_cas_z(maximum_value, prev_value, value) != prev_value) { + break; + } + } +} +#endif /* __UTIL_ATOMIC_H__ */ diff --git a/intern/cycles/util/util_dynlib.cpp b/intern/cycles/util/util_dynlib.cpp deleted file mode 100644 index 587cad607c8..00000000000 --- a/intern/cycles/util/util_dynlib.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2011-2013 Blender Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -#include <stdlib.h> - -#include "util_dynlib.h" - -#ifdef _WIN32 - -#include <windows.h> - -CCL_NAMESPACE_BEGIN - -struct DynamicLibrary { - HMODULE module; -}; - -DynamicLibrary *dynamic_library_open(const char *name) -{ - HMODULE module = LoadLibrary(name); - - if(!module) - return NULL; - - DynamicLibrary *lib = new DynamicLibrary(); - lib->module = module; - - return lib; -} - -void *dynamic_library_find(DynamicLibrary *lib, const char *name) -{ - return (void*)GetProcAddress(lib->module, name); -} - -void dynamic_library_close(DynamicLibrary *lib) -{ - FreeLibrary(lib->module); - delete lib; -} - -CCL_NAMESPACE_END - -#else - -#include <dlfcn.h> - -CCL_NAMESPACE_BEGIN - -struct DynamicLibrary { - void *module; -}; - -DynamicLibrary *dynamic_library_open(const char *name) -{ - void *module = dlopen(name, RTLD_NOW); - - if(!module) - return NULL; - - DynamicLibrary *lib = new DynamicLibrary(); - lib->module = module; - - return lib; -} - -void *dynamic_library_find(DynamicLibrary *lib, const char *name) -{ - return dlsym(lib->module, name); -} - -void dynamic_library_close(DynamicLibrary *lib) -{ - dlclose(lib->module); - delete lib; -} - -CCL_NAMESPACE_END - -#endif - diff --git a/intern/cycles/util/util_logging.h b/intern/cycles/util/util_logging.h index 991789e7460..2c5455051a4 100644 --- a/intern/cycles/util/util_logging.h +++ b/intern/cycles/util/util_logging.h @@ -43,7 +43,7 @@ public: #endif -class float3; +struct float3; std::ostream& operator <<(std::ostream &os, const float3 &value); diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h index c332e1709db..78005546a01 100644 --- a/intern/cycles/util/util_math.h +++ b/intern/cycles/util/util_math.h @@ -314,6 +314,12 @@ ccl_device_inline float2 normalize_len(const float2 a, float *t) return a/(*t); } +ccl_device_inline float2 safe_normalize(const float2 a) +{ + float t = len(a); + return (t)? a/t: a; +} + ccl_device_inline bool operator==(const float2 a, const float2 b) { return (a.x == b.x && a.y == b.y); @@ -510,6 +516,12 @@ ccl_device_inline float3 normalize_len(const float3 a, float *t) return a/(*t); } +ccl_device_inline float3 safe_normalize(const float3 a) +{ + float t = len(a); + return (t)? a/t: a; +} + #ifndef __KERNEL_OPENCL__ ccl_device_inline bool operator==(const float3 a, const float3 b) @@ -817,6 +829,12 @@ ccl_device_inline float4 normalize(const float4 a) return a/len(a); } +ccl_device_inline float4 safe_normalize(const float4 a) +{ + float t = len(a); + return (t)? a/t: a; +} + ccl_device_inline float4 min(float4 a, float4 b) { #ifdef __KERNEL_SSE__ diff --git a/intern/cycles/util/util_md5.cpp b/intern/cycles/util/util_md5.cpp index add0d18c742..b2a32c45287 100644 --- a/intern/cycles/util/util_md5.cpp +++ b/intern/cycles/util/util_md5.cpp @@ -152,8 +152,8 @@ void MD5Hash::process(const uint8_t *data /*[64]*/) * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) #define SET(a, b, c, d, k, s, Ti)\ - t = a + F(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b + t = a + F(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1); SET(d, a, b, c, 1, 12, T2); @@ -178,8 +178,8 @@ void MD5Hash::process(const uint8_t *data /*[64]*/) * a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) #define SET(a, b, c, d, k, s, Ti)\ - t = a + G(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b + t = a + G(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17); SET(d, a, b, c, 6, 9, T18); @@ -230,8 +230,8 @@ void MD5Hash::process(const uint8_t *data /*[64]*/) * a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ #define I(x, y, z) ((y) ^ ((x) | ~(z))) #define SET(a, b, c, d, k, s, Ti)\ - t = a + I(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b + t = a + I(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 6, T49); SET(d, a, b, c, 7, 10, T50); diff --git a/intern/cycles/util/util_optimization.h b/intern/cycles/util/util_optimization.h index 2feb3d6ab7e..fba8b1105f3 100644 --- a/intern/cycles/util/util_optimization.h +++ b/intern/cycles/util/util_optimization.h @@ -130,6 +130,9 @@ /* MinGW64 has conflicting declarations for these SSE headers in <windows.h>. * Since we can't avoid including <windows.h>, better only include that */ +#define NOGDI +#define NOMINMAX +#define WIN32_LEAN_AND_MEAN #include <windows.h> #endif diff --git a/intern/cycles/util/util_path.cpp b/intern/cycles/util/util_path.cpp index 85d19b6a325..aa424045ece 100644 --- a/intern/cycles/util/util_path.cpp +++ b/intern/cycles/util/util_path.cpp @@ -41,21 +41,12 @@ 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.c_str()); - return boost::filesystem::path(path_utf16.c_str()); -#else return boost::filesystem::path(path.c_str()); -#endif } static string from_boost(const boost::filesystem::path& path) { -#ifdef _MSC_VER - return Strutil::utf16_to_utf8(path.wstring().c_str()); -#else return path.string().c_str(); -#endif } void path_init(const string& path, const string& user_path) @@ -259,14 +250,7 @@ string path_source_replace_includes(const string& source_, const string& path) 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 } void path_cache_clear_except(const string& name, const set<string>& except) diff --git a/intern/cycles/util/util_progress.h b/intern/cycles/util/util_progress.h index e721a3f5047..238fb976778 100644 --- a/intern/cycles/util/util_progress.h +++ b/intern/cycles/util/util_progress.h @@ -46,6 +46,8 @@ public: update_cb = NULL; cancel = false; cancel_message = ""; + error = false; + error_message = ""; cancel_cb = NULL; } @@ -79,6 +81,8 @@ public: sync_substatus = ""; cancel = false; cancel_message = ""; + error = false; + error_message = ""; } /* cancel */ @@ -108,6 +112,28 @@ public: cancel_cb = function; } + /* error */ + void set_error(const string& error_message_) + { + thread_scoped_lock lock(progress_mutex); + error_message = error_message_; + error = true; + /* If error happens we also stop rendering. */ + cancel_message = error_message_; + cancel = true; + } + + bool get_error() + { + return error; + } + + string get_error_message() + { + thread_scoped_lock lock(progress_mutex); + return error_message; + } + /* tile and timing information */ void set_start_time(double start_time_) @@ -259,6 +285,9 @@ protected: volatile bool cancel; string cancel_message; + + volatile bool error; + string error_message; }; CCL_NAMESPACE_END diff --git a/intern/cycles/util/util_ssef.h b/intern/cycles/util/util_ssef.h index f4236cc616e..5e452ea03b4 100644 --- a/intern/cycles/util/util_ssef.h +++ b/intern/cycles/util/util_ssef.h @@ -151,7 +151,7 @@ __forceinline ssef maxi(const ssef& a, const ssef& b) { /// Ternary Operators //////////////////////////////////////////////////////////////////////////////// -#if defined(__KERNEL_AVX2__) +#if defined(__KERNEL_AVX2__) && !defined(_MSC_VER) // see T41066 __forceinline const ssef madd (const ssef& a, const ssef& b, const ssef& c) { return _mm_fmadd_ps(a,b,c); } __forceinline const ssef msub (const ssef& a, const ssef& b, const ssef& c) { return _mm_fmsub_ps(a,b,c); } __forceinline const ssef nmadd(const ssef& a, const ssef& b, const ssef& c) { return _mm_fnmadd_ps(a,b,c); } diff --git a/intern/cycles/util/util_stats.h b/intern/cycles/util/util_stats.h index 8758b823084..fe6c162366e 100644 --- a/intern/cycles/util/util_stats.h +++ b/intern/cycles/util/util_stats.h @@ -17,6 +17,8 @@ #ifndef __UTIL_STATS_H__ #define __UTIL_STATS_H__ +#include "util_atomic.h" + CCL_NAMESPACE_BEGIN class Stats { @@ -24,14 +26,13 @@ public: Stats() : mem_used(0), mem_peak(0) {} void mem_alloc(size_t size) { - mem_used += size; - if(mem_used > mem_peak) - mem_peak = mem_used; + atomic_add_z(&mem_used, size); + atomic_update_max_z(&mem_peak, mem_used); } void mem_free(size_t size) { assert(mem_used >= size); - mem_used -= size; + atomic_sub_z(&mem_used, size); } size_t mem_used; diff --git a/intern/cycles/util/util_types.h b/intern/cycles/util/util_types.h index 2a199e591bf..ce84200d0b6 100644 --- a/intern/cycles/util/util_types.h +++ b/intern/cycles/util/util_types.h @@ -33,11 +33,7 @@ #ifndef __KERNEL_GPU__ -# ifdef NDEBUG -# define ccl_device static inline -# else -# define ccl_device static -# endif +#define ccl_device static inline #define ccl_device_noinline static #define ccl_global #define ccl_constant @@ -53,11 +49,7 @@ #define ccl_try_align(...) /* not support for function arguments (error C2719) */ #endif #define ccl_may_alias -# ifdef NDEBUG -# define ccl_always_inline __forceinline -# else -# define ccl_always_inline -# endif +#define ccl_always_inline __forceinline #define ccl_maybe_unused #else diff --git a/intern/cycles/util/util_vector.h b/intern/cycles/util/util_vector.h index cc6e8a371ed..3d885691c92 100644 --- a/intern/cycles/util/util_vector.h +++ b/intern/cycles/util/util_vector.h @@ -107,9 +107,6 @@ public: if(datasize > 0) { data = (T*)malloc_aligned(sizeof(T)*datasize, alignment); memcpy(data, &from[0], datasize*sizeof(T)); - free_aligned(data); - data = (T*)malloc_aligned(sizeof(T)*datasize, alignment); - memcpy(data, &from[0], datasize*sizeof(T)); } return *this; |