diff options
author | Lukas Toenne <lukas.toenne@googlemail.com> | 2012-09-07 15:06:45 +0400 |
---|---|---|
committer | Lukas Toenne <lukas.toenne@googlemail.com> | 2012-09-07 15:06:45 +0400 |
commit | a9105a7deaccbd98c4e994d8f0f041bef4179bfa (patch) | |
tree | fc7fcebc23cdd2f580b32c7c629198497c6531ef /intern/cycles/kernel | |
parent | 8b6046cdad1325a82e0d161fdca0118e62f36b2d (diff) |
Fix for Cycles (CUDA) compilation (again ...). Moved the AttributeStandard enum typedef and the attribute_standard_name mapping function to util_attribute/util_types headers, so they can properly be used by kernel and render files alike. This should avoid any std C includes which are not available in CUDA. Thanks to Sergey for help!
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/CMakeLists.txt | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_attribute.h | 68 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_triangle.h | 42 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 42 |
4 files changed, 73 insertions, 80 deletions
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index c26954e23b6..b43aca24496 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -16,6 +16,7 @@ set(SRC set(SRC_HEADERS kernel.h kernel_accumulate.h + kernel_attribute.h kernel_bvh.h kernel_camera.h kernel_compat_cpu.h diff --git a/intern/cycles/kernel/kernel_attribute.h b/intern/cycles/kernel/kernel_attribute.h new file mode 100644 index 00000000000..115de2fdbdb --- /dev/null +++ b/intern/cycles/kernel/kernel_attribute.h @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __KERNEL_ATTRIBUTE_CL__ +#define __KERNEL_ATTRIBUTE_CL__ + +#include "util_types.h" + +#ifdef __OSL__ +#include <string> +#include "util_attribute.h" +#endif + +CCL_NAMESPACE_BEGIN + +/* note: declared in kernel.h, have to add it here because kernel.h is not available */ +bool kernel_osl_use(KernelGlobals *kg); + +__device_inline int find_attribute(KernelGlobals *kg, ShaderData *sd, uint id) +{ + +#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(std::string("std::") + std::string(attribute_standard_name((AttributeStandard)id))); + 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; + } +} + +CCL_NAMESPACE_END + +#endif /* __KERNEL_ATTRIBUTE_CL__ */ diff --git a/intern/cycles/kernel/kernel_triangle.h b/intern/cycles/kernel/kernel_triangle.h index 901034cfac6..f57c59a45eb 100644 --- a/intern/cycles/kernel/kernel_triangle.h +++ b/intern/cycles/kernel/kernel_triangle.h @@ -16,6 +16,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "kernel_attribute.h" #include "kernel_projection.h" CCL_NAMESPACE_BEGIN @@ -183,48 +184,13 @@ __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) -{ - -#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) { float3 motion_pre = sd->P, motion_post = sd->P; /* deformation motion */ - int offset_pre = triangle_find_attribute(kg, sd, ATTR_STD_MOTION_PRE); - int offset_post = triangle_find_attribute(kg, sd, ATTR_STD_MOTION_POST); + int offset_pre = find_attribute(kg, sd, ATTR_STD_MOTION_PRE); + int offset_post = find_attribute(kg, sd, ATTR_STD_MOTION_POST); if(offset_pre != ATTR_STD_NOT_FOUND) motion_pre = triangle_attribute_float3(kg, sd, ATTR_ELEMENT_VERTEX, offset_pre, NULL, NULL); @@ -283,7 +249,7 @@ __device float4 triangle_motion_vector(KernelGlobals *kg, ShaderData *sd) __device float3 triangle_uv(KernelGlobals *kg, ShaderData *sd) { - int offset_uv = triangle_find_attribute(kg, sd, ATTR_STD_UV); + int offset_uv = find_attribute(kg, sd, ATTR_STD_UV); if(offset_uv == ATTR_STD_NOT_FOUND) return make_float3(0.0f, 0.0f, 0.0f); diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 06babe78493..ce21ab994f0 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -19,8 +19,6 @@ #ifndef __KERNEL_TYPES_H__ #define __KERNEL_TYPES_H__ -#include <string> - #include "kernel_math.h" #include "svm/svm_types.h" @@ -354,46 +352,6 @@ typedef enum AttributeElement { ATTR_ELEMENT_NONE } AttributeElement; -typedef enum AttributeStandard { - ATTR_STD_NONE = 0, - ATTR_STD_VERTEX_NORMAL, - ATTR_STD_FACE_NORMAL, - ATTR_STD_UV, - ATTR_STD_GENERATED, - ATTR_STD_POSITION_UNDEFORMED, - ATTR_STD_POSITION_UNDISPLACED, - ATTR_STD_MOTION_PRE, - ATTR_STD_MOTION_POST, - ATTR_STD_PARTICLE, - ATTR_STD_NUM, - - ATTR_STD_NOT_FOUND = ~0 -} AttributeStandard; - -__device std::string attribute_standard_name(AttributeStandard std) -{ - if(std == ATTR_STD_VERTEX_NORMAL) - return std::string("N"); - else if(std == ATTR_STD_FACE_NORMAL) - return std::string("Ng"); - else if(std == ATTR_STD_UV) - return std::string("uv"); - else if(std == ATTR_STD_GENERATED) - return std::string("generated"); - else if(std == ATTR_STD_POSITION_UNDEFORMED) - return std::string("undeformed"); - else if(std == ATTR_STD_POSITION_UNDISPLACED) - return std::string("undisplaced"); - else if(std == ATTR_STD_MOTION_PRE) - return std::string("motion_pre"); - else if(std == ATTR_STD_MOTION_POST) - return std::string("motion_post"); - else if(std == ATTR_STD_PARTICLE) - return std::string("particle"); - - return std::string(); -} - /* Closure data */ #define MAX_CLOSURE 8 |