Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-12-11 18:39:32 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-12-11 18:39:32 +0400
commit7c81952179f0ff08cfdd8f571eb1c0f06e224070 (patch)
tree84c3ebe5a1f3e5889870d69313232f48a487e264 /intern/cycles
parent1e5cc7c51b3c7d3c2f99fc748d3978a90d2133d3 (diff)
Cycles: trick to make building with OSL trunk work as well, it has a different
name for LoadMemoryShader so we make it call the right name depending on which is available.
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/render/osl.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index e4ee40d881e..b3b838be25b 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -268,9 +268,43 @@ const char *OSLShaderManager::shader_load_filepath(string filepath)
return shader_load_bytecode(bytecode_hash, bytecode);
}
+/* don't try this at home .. this is a template trick to use either
+ * LoadMemoryShader or LoadMemoryCompiledShader which are the function
+ * names in our custom branch and the official repository. */
+
+template<bool C, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename T, typename Sign>
+struct has_LoadMemoryCompiledShader {
+ typedef int yes;
+ typedef char no;
+
+ template<typename U, U> struct type_check;
+ template<typename _1> static yes &chk(type_check<Sign, &_1::LoadMemoryCompiledShader>*);
+ template<typename > static no &chk(...);
+ static bool const value = sizeof(chk<T>(0)) == sizeof(yes);
+};
+
+template<typename T>
+typename enable_if<has_LoadMemoryCompiledShader<T,
+ bool(T::*)(const char*, const char*)>::value, bool>::type
+load_memory_shader(T *ss, const char *name, const char *buffer)
+{
+ return ss->LoadMemoryCompiledShader(name, buffer);
+}
+
+template<typename T>
+typename enable_if<!has_LoadMemoryCompiledShader<T,
+ bool(T::*)(const char*, const char*)>::value, bool>::type
+load_memory_shader(T *ss, const char *name, const char *buffer)
+{
+ return ss->LoadMemoryShader(name, buffer);
+}
+
const char *OSLShaderManager::shader_load_bytecode(const string& hash, const string& bytecode)
{
- ss->LoadMemoryShader(hash.c_str(), bytecode.c_str());
+ load_memory_shader(ss, hash.c_str(), bytecode.c_str());
return loaded_shaders.insert(hash).first->c_str();
}