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.
This commit is contained in:
Brecht Van Lommel 2012-12-11 14:39:32 +00:00
parent 1e5cc7c51b
commit 7c81952179

@ -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();
}