diff options
-rw-r--r-- | intern/cycles/kernel/kernel_triangle.h | 42 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 26 | ||||
-rw-r--r-- | intern/cycles/render/attribute.cpp | 26 | ||||
-rw-r--r-- | intern/cycles/render/attribute.h | 1 | ||||
-rw-r--r-- | intern/cycles/render/mesh.cpp | 2 |
5 files changed, 61 insertions, 36 deletions
diff --git a/intern/cycles/kernel/kernel_triangle.h b/intern/cycles/kernel/kernel_triangle.h index 492800e8aab..60d6d9356ec 100644 --- a/intern/cycles/kernel/kernel_triangle.h +++ b/intern/cycles/kernel/kernel_triangle.h @@ -15,9 +15,11 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - + #include "kernel_projection.h" +#include "util_param.h" + CCL_NAMESPACE_BEGIN /* Point on triangle for Moller-Trumbore triangles */ @@ -183,17 +185,39 @@ __device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData *s /* motion */ +/* note: declared in kernel.h, have to add it here because kernel.h is not available */ +bool kernel_osl_use(KernelGlobals *kg); + __device int triangle_find_attribute(KernelGlobals *kg, ShaderData *sd, uint id) { - /* find attribute by unique id */ - uint attr_offset = sd->object*kernel_data.bvh.attributes_map_stride; - uint4 attr_map = kernel_tex_fetch(__attributes_map, attr_offset); - - while(attr_map.x != id) - attr_map = kernel_tex_fetch(__attributes_map, ++attr_offset); - /* return result */ - return (attr_map.y == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : attr_map.z; +#ifdef __OSL__ + if (kernel_osl_use(kg)) { + /* for OSL, a hash map is used to lookup the attribute by name. */ + OSLGlobals::AttributeMap &attr_map = kg->osl.attribute_map[sd->object]; + ustring stdname = ustring(std::string("std::") + attribute_standard_name((AttributeStandard)id).c_str()); + OSLGlobals::AttributeMap::const_iterator it = attr_map.find(stdname); + if (it != attr_map.end()) { + const OSLGlobals::Attribute &osl_attr = it->second; + /* return result */ + return (osl_attr.elem == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : osl_attr.offset; + } + else + return (int)ATTR_STD_NOT_FOUND; + } + else +#endif + { + /* for SVM, find attribute by unique id */ + uint attr_offset = sd->object*kernel_data.bvh.attributes_map_stride; + uint4 attr_map = kernel_tex_fetch(__attributes_map, attr_offset); + + while(attr_map.x != id) + attr_map = kernel_tex_fetch(__attributes_map, ++attr_offset); + + /* return result */ + return (attr_map.y == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : attr_map.z; + } } __device float4 triangle_motion_vector(KernelGlobals *kg, ShaderData *sd) diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 39e088583c4..738d459df30 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -22,6 +22,8 @@ #include "kernel_math.h" #include "svm/svm_types.h" +#include "util_param.h" + #ifndef __KERNEL_GPU__ #define __KERNEL_CPU__ #endif @@ -368,6 +370,30 @@ typedef enum AttributeStandard { ATTR_STD_NOT_FOUND = ~0 } AttributeStandard; +__device ustring attribute_standard_name(AttributeStandard std) +{ + if(std == ATTR_STD_VERTEX_NORMAL) + return ustring("N"); + else if(std == ATTR_STD_FACE_NORMAL) + return ustring("Ng"); + else if(std == ATTR_STD_UV) + return ustring("uv"); + else if(std == ATTR_STD_GENERATED) + return ustring("generated"); + else if(std == ATTR_STD_POSITION_UNDEFORMED) + return ustring("undeformed"); + else if(std == ATTR_STD_POSITION_UNDISPLACED) + return ustring("undisplaced"); + else if(std == ATTR_STD_MOTION_PRE) + return ustring("motion_pre"); + else if(std == ATTR_STD_MOTION_POST) + return ustring("motion_post"); + else if(std == ATTR_STD_PARTICLE) + return ustring("particle"); + + return ustring(); +} + /* Closure data */ #define MAX_CLOSURE 8 diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp index 7296f8bebba..5122c1af410 100644 --- a/intern/cycles/render/attribute.cpp +++ b/intern/cycles/render/attribute.cpp @@ -84,30 +84,6 @@ bool Attribute::same_storage(TypeDesc a, TypeDesc b) return false; } -ustring Attribute::standard_name(AttributeStandard std) -{ - if(std == ATTR_STD_VERTEX_NORMAL) - return ustring("N"); - else if(std == ATTR_STD_FACE_NORMAL) - return ustring("Ng"); - else if(std == ATTR_STD_UV) - return ustring("uv"); - else if(std == ATTR_STD_GENERATED) - return ustring("generated"); - else if(std == ATTR_STD_POSITION_UNDEFORMED) - return ustring("undeformed"); - else if(std == ATTR_STD_POSITION_UNDISPLACED) - return ustring("undisplaced"); - else if(std == ATTR_STD_MOTION_PRE) - return ustring("motion_pre"); - else if(std == ATTR_STD_MOTION_POST) - return ustring("motion_post"); - else if(std == ATTR_STD_PARTICLE) - return ustring("particle"); - - return ustring(); -} - /* Attribute Set */ AttributeSet::AttributeSet() @@ -178,7 +154,7 @@ Attribute *AttributeSet::add(AttributeStandard std, ustring name) Attribute *attr = NULL; if(name == ustring()) - name = Attribute::standard_name(std); + name = attribute_standard_name(std); if(std == ATTR_STD_VERTEX_NORMAL) attr = add(name, TypeDesc::TypeNormal, Attribute::VERTEX); diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h index 707d558fc79..e95bf42f6ae 100644 --- a/intern/cycles/render/attribute.h +++ b/intern/cycles/render/attribute.h @@ -71,7 +71,6 @@ public: const float *data_float() const { return (float*)data(); } static bool same_storage(TypeDesc a, TypeDesc b); - static ustring standard_name(AttributeStandard std); }; /* Attribute Set diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 8f5f2647ebf..1d9683f25cc 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -366,7 +366,7 @@ void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<Att if(req.std != ATTR_STD_NONE) { /* if standard attribute, add lookup by std:: name convention */ - ustring stdname = ustring(string("std::") + Attribute::standard_name(req.std).c_str()); + ustring stdname = ustring(string("std::") + attribute_standard_name(req.std).c_str()); og->attribute_map[i][stdname] = osl_attr; } else if(req.name != ustring()) { |