Fix for Cycles (CUDA) compilation (again ...). Moved the AttributeStandard enum typed...
[blender.git] / intern / cycles / kernel / kernel_attribute.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #ifndef __KERNEL_ATTRIBUTE_CL__
20 #define __KERNEL_ATTRIBUTE_CL__
21
22 #include "util_types.h"
23
24 #ifdef __OSL__
25 #include <string>
26 #include "util_attribute.h"
27 #endif
28
29 CCL_NAMESPACE_BEGIN
30
31 /* note: declared in kernel.h, have to add it here because kernel.h is not available */
32 bool kernel_osl_use(KernelGlobals *kg);
33
34 __device_inline int find_attribute(KernelGlobals *kg, ShaderData *sd, uint id)
35 {
36
37 #ifdef __OSL__
38         if (kernel_osl_use(kg)) {
39                 /* for OSL, a hash map is used to lookup the attribute by name. */
40                 OSLGlobals::AttributeMap &attr_map = kg->osl.attribute_map[sd->object];
41                 ustring stdname(std::string("std::") + std::string(attribute_standard_name((AttributeStandard)id)));
42                 OSLGlobals::AttributeMap::const_iterator it = attr_map.find(stdname);
43                 if (it != attr_map.end()) {
44                         const OSLGlobals::Attribute &osl_attr = it->second;
45                         /* return result */
46                         return (osl_attr.elem == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : osl_attr.offset;
47                 }
48                 else
49                         return (int)ATTR_STD_NOT_FOUND;
50         }
51         else
52 #endif
53         {
54                 /* for SVM, find attribute by unique id */
55                 uint attr_offset = sd->object*kernel_data.bvh.attributes_map_stride;
56                 uint4 attr_map = kernel_tex_fetch(__attributes_map, attr_offset);
57                 
58                 while(attr_map.x != id)
59                         attr_map = kernel_tex_fetch(__attributes_map, ++attr_offset);
60                 
61                 /* return result */
62                 return (attr_map.y == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : attr_map.z;
63         }
64 }
65
66 CCL_NAMESPACE_END
67
68 #endif /* __KERNEL_ATTRIBUTE_CL__ */