[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52885] trunk/blender/intern/cycles/render /osl.cpp: Cycles: trick to make building with OSL trunk work as well, it has a different

Xavier Thomas xavier.thomas.1980 at gmail.com
Wed Dec 12 15:46:59 CET 2012


Hi Brecht,

Sorry to make noise here, but I thought I knew a bit of C++ templates and
cannot understand how this works.
Do you have a link that can help me understand what is going on here?

Xavier




2012/12/11 Brecht Van Lommel <brechtvanlommel at pandora.be>

> Revision: 52885
>
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52885
> Author:   blendix
> Date:     2012-12-11 14:39:32 +0000 (Tue, 11 Dec 2012)
> Log Message:
> -----------
> 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.
>
> Modified Paths:
> --------------
>     trunk/blender/intern/cycles/render/osl.cpp
>
> Modified: trunk/blender/intern/cycles/render/osl.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/render/osl.cpp  2012-12-11 14:39:30 UTC
> (rev 52884)
> +++ trunk/blender/intern/cycles/render/osl.cpp  2012-12-11 14:39:32 UTC
> (rev 52885)
> @@ -268,9 +268,43 @@
>         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();
>  }
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-committers mailing list