[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

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Dec 12 16:06:41 CET 2012


Hi Xavier,

See here for an explanation:
http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error

Anyway, the basic purpose is to not fail building if a certain member
function has a different name. I should have gotten our custom OSL
branch in sync with the trunk name earlier, but now many people have
OSL builds so I decided to keep it compiling using this trick.

Brecht.

On Wed, Dec 12, 2012 at 3:46 PM, Xavier Thomas
<xavier.thomas.1980 at gmail.com> wrote:
> 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
>>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers


More information about the Bf-committers mailing list