Commit: cd809b95d828677468298f1eba54fc52bbb9db60
Author: Mai Lavelle
Date:   Fri Jul 1 17:36:27 2016 -0400
Branches: master
https://developer.blender.org/rBcd809b95d828677468298f1eba54fc52bbb9db60

Cycles: Add AttributeDescriptor

Adds a descriptor for attributes that can easily be passed around and extended
to contain more data. Will be used for attributes on subdivision meshes.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D2110

===================================================================

M       intern/cycles/kernel/geom/geom_attribute.h
M       intern/cycles/kernel/geom/geom_curve.h
M       intern/cycles/kernel/geom/geom_primitive.h
M       intern/cycles/kernel/geom/geom_subd_triangle.h
M       intern/cycles/kernel/geom/geom_triangle.h
M       intern/cycles/kernel/geom/geom_volume.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/osl/osl_globals.h
M       intern/cycles/kernel/osl/osl_services.cpp
M       intern/cycles/kernel/osl/osl_shader.cpp
M       intern/cycles/kernel/osl/osl_shader.h
M       intern/cycles/kernel/svm/svm_attribute.h
M       intern/cycles/kernel/svm/svm_tex_coord.h
M       intern/cycles/render/attribute.cpp
M       intern/cycles/render/attribute.h
M       intern/cycles/render/mesh.cpp

===================================================================

diff --git a/intern/cycles/kernel/geom/geom_attribute.h 
b/intern/cycles/kernel/geom/geom_attribute.h
index 5d78cf8..e036c27 100644
--- a/intern/cycles/kernel/geom/geom_attribute.h
+++ b/intern/cycles/kernel/geom/geom_attribute.h
@@ -43,12 +43,19 @@ ccl_device_inline uint 
attribute_primitive_type(KernelGlobals *kg, const ShaderD
        }
 }
 
+ccl_device_inline AttributeDescriptor attribute_not_found()
+{
+       const AttributeDescriptor desc = {ATTR_ELEMENT_NONE, 
(NodeAttributeType)0, ATTR_STD_NOT_FOUND};
+       return desc;
+}
+
 /* Find attribute based on ID */
 
-ccl_device_inline int find_attribute(KernelGlobals *kg, const ShaderData *sd, 
uint id, AttributeElement *elem)
+ccl_device_inline AttributeDescriptor find_attribute(KernelGlobals *kg, const 
ShaderData *sd, uint id)
 {
-       if(ccl_fetch(sd, object) == PRIM_NONE)
-               return (int)ATTR_STD_NOT_FOUND;
+       if(ccl_fetch(sd, object) == PRIM_NONE) {
+               return attribute_not_found();
+       }
 
        /* for SVM, find attribute by unique id */
        uint attr_offset = ccl_fetch(sd, 
object)*kernel_data.bvh.attributes_map_stride;
@@ -57,31 +64,36 @@ ccl_device_inline int find_attribute(KernelGlobals *kg, 
const ShaderData *sd, ui
        
        while(attr_map.x != id) {
                if(UNLIKELY(attr_map.x == ATTR_STD_NONE)) {
-                       return ATTR_STD_NOT_FOUND;
+                       return attribute_not_found();
                }
                attr_offset += ATTR_PRIM_TYPES;
                attr_map = kernel_tex_fetch(__attributes_map, attr_offset);
        }
 
-       *elem = (AttributeElement)attr_map.y;
+       AttributeDescriptor desc;
+       desc.element = (AttributeElement)attr_map.y;
        
-       if(ccl_fetch(sd, prim) == PRIM_NONE && (AttributeElement)attr_map.y != 
ATTR_ELEMENT_MESH)
-               return ATTR_STD_NOT_FOUND;
+       if(ccl_fetch(sd, prim) == PRIM_NONE && desc.element != 
ATTR_ELEMENT_MESH) {
+               return attribute_not_found();
+       }
 
        /* return result */
-       return (attr_map.y == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : 
(int)attr_map.z;
+       desc.offset = (attr_map.y == ATTR_ELEMENT_NONE) ? 
(int)ATTR_STD_NOT_FOUND : (int)attr_map.z;
+       desc.type = (NodeAttributeType)attr_map.w;
+
+       return desc;
 }
 
 /* Transform matrix attribute on meshes */
 
-ccl_device Transform primitive_attribute_matrix(KernelGlobals *kg, const 
ShaderData *sd, int offset)
+ccl_device Transform primitive_attribute_matrix(KernelGlobals *kg, const 
ShaderData *sd, const AttributeDescriptor desc)
 {
        Transform tfm;
 
-       tfm.x = kernel_tex_fetch(__attributes_float3, offset + 0);
-       tfm.y = kernel_tex_fetch(__attributes_float3, offset + 1);
-       tfm.z = kernel_tex_fetch(__attributes_float3, offset + 2);
-       tfm.w = kernel_tex_fetch(__attributes_float3, offset + 3);
+       tfm.x = kernel_tex_fetch(__attributes_float3, desc.offset + 0);
+       tfm.y = kernel_tex_fetch(__attributes_float3, desc.offset + 1);
+       tfm.z = kernel_tex_fetch(__attributes_float3, desc.offset + 2);
+       tfm.w = kernel_tex_fetch(__attributes_float3, desc.offset + 3);
 
        return tfm;
 }
diff --git a/intern/cycles/kernel/geom/geom_curve.h 
b/intern/cycles/kernel/geom/geom_curve.h
index 292e1bf..aa9cd29 100644
--- a/intern/cycles/kernel/geom/geom_curve.h
+++ b/intern/cycles/kernel/geom/geom_curve.h
@@ -24,23 +24,23 @@ CCL_NAMESPACE_BEGIN
 
 /* Reading attributes on various curve elements */
 
-ccl_device float curve_attribute_float(KernelGlobals *kg, const ShaderData 
*sd, AttributeElement elem, int offset, float *dx, float *dy)
+ccl_device float curve_attribute_float(KernelGlobals *kg, const ShaderData 
*sd, const AttributeDescriptor desc, float *dx, float *dy)
 {
-       if(elem == ATTR_ELEMENT_CURVE) {
+       if(desc.element == ATTR_ELEMENT_CURVE) {
 #ifdef __RAY_DIFFERENTIALS__
                if(dx) *dx = 0.0f;
                if(dy) *dy = 0.0f;
 #endif
 
-               return kernel_tex_fetch(__attributes_float, offset + 
ccl_fetch(sd, prim));
+               return kernel_tex_fetch(__attributes_float, desc.offset + 
ccl_fetch(sd, prim));
        }
-       else if(elem == ATTR_ELEMENT_CURVE_KEY || elem == 
ATTR_ELEMENT_CURVE_KEY_MOTION) {
+       else if(desc.element == ATTR_ELEMENT_CURVE_KEY || desc.element == 
ATTR_ELEMENT_CURVE_KEY_MOTION) {
                float4 curvedata = kernel_tex_fetch(__curves, ccl_fetch(sd, 
prim));
                int k0 = __float_as_int(curvedata.x) + 
PRIMITIVE_UNPACK_SEGMENT(ccl_fetch(sd, type));
                int k1 = k0 + 1;
 
-               float f0 = kernel_tex_fetch(__attributes_float, offset + k0);
-               float f1 = kernel_tex_fetch(__attributes_float, offset + k1);
+               float f0 = kernel_tex_fetch(__attributes_float, desc.offset + 
k0);
+               float f1 = kernel_tex_fetch(__attributes_float, desc.offset + 
k1);
 
 #ifdef __RAY_DIFFERENTIALS__
                if(dx) *dx = ccl_fetch(sd, du).dx*(f1 - f0);
@@ -59,9 +59,9 @@ ccl_device float curve_attribute_float(KernelGlobals *kg, 
const ShaderData *sd,
        }
 }
 
-ccl_device float3 curve_attribute_float3(KernelGlobals *kg, const ShaderData 
*sd, AttributeElement elem, int offset, float3 *dx, float3 *dy)
+ccl_device float3 curve_attribute_float3(KernelGlobals *kg, const ShaderData 
*sd, const AttributeDescriptor desc, float3 *dx, float3 *dy)
 {
-       if(elem == ATTR_ELEMENT_CURVE) {
+       if(desc.element == ATTR_ELEMENT_CURVE) {
                /* idea: we can't derive any useful differentials here, but for 
tiled
                 * mipmap image caching it would be useful to avoid reading the 
highest
                 * detail level always. maybe a derivative based on the hair 
density
@@ -71,15 +71,15 @@ ccl_device float3 curve_attribute_float3(KernelGlobals *kg, 
const ShaderData *sd
                if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 
-               return float4_to_float3(kernel_tex_fetch(__attributes_float3, 
offset + ccl_fetch(sd, prim)));
+               return float4_to_float3(kernel_tex_fetch(__attributes_float3, 
desc.offset + ccl_fetch(sd, prim)));
        }
-       else if(elem == ATTR_ELEMENT_CURVE_KEY || elem == 
ATTR_ELEMENT_CURVE_KEY_MOTION) {
+       else if(desc.element == ATTR_ELEMENT_CURVE_KEY || desc.element == 
ATTR_ELEMENT_CURVE_KEY_MOTION) {
                float4 curvedata = kernel_tex_fetch(__curves, ccl_fetch(sd, 
prim));
                int k0 = __float_as_int(curvedata.x) + 
PRIMITIVE_UNPACK_SEGMENT(ccl_fetch(sd, type));
                int k1 = k0 + 1;
 
-               float3 f0 = 
float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + k0));
-               float3 f1 = 
float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + k1));
+               float3 f0 = 
float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + k0));
+               float3 f1 = 
float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + k1));
 
 #ifdef __RAY_DIFFERENTIALS__
                if(dx) *dx = ccl_fetch(sd, du).dx*(f1 - f0);
diff --git a/intern/cycles/kernel/geom/geom_primitive.h 
b/intern/cycles/kernel/geom/geom_primitive.h
index b16f0c9..4384c20 100644
--- a/intern/cycles/kernel/geom/geom_primitive.h
+++ b/intern/cycles/kernel/geom/geom_primitive.h
@@ -25,24 +25,23 @@ CCL_NAMESPACE_BEGIN
 
 ccl_device_inline float primitive_attribute_float(KernelGlobals *kg,
                                                   const ShaderData *sd,
-                                                  AttributeElement elem,
-                                                  int offset,
+                                                  const AttributeDescriptor 
desc,
                                                   float *dx, float *dy)
 {
        if(ccl_fetch(sd, type) & PRIMITIVE_ALL_TRIANGLE) {
                if(subd_triangle_patch(kg, sd) == ~0)
-                       return triangle_attribute_float(kg, sd, elem, offset, 
dx, dy);
+                       return triangle_attribute_float(kg, sd, desc, dx, dy);
                else
-                       return subd_triangle_attribute_float(kg, sd, elem, 
offset, dx, dy);
+                       return subd_triangle_attribute_float(kg, sd, desc, dx, 
dy);
        }
 #ifdef __HAIR__
        else if(ccl_fetch(sd, type) & PRIMITIVE_ALL_CURVE) {
-               return curve_attribute_float(kg, sd, elem, offset, dx, dy);
+               return curve_attribute_float(kg, sd, desc, dx, dy);
        }
 #endif
 #ifdef __VOLUME__
-       else if(ccl_fetch(sd, object) != OBJECT_NONE && elem == 
ATTR_ELEMENT_VOXEL) {
-               return volume_attribute_float(kg, sd, elem, offset, dx, dy);
+       else if(ccl_fetch(sd, object) != OBJECT_NONE && desc.element == 
ATTR_ELEMENT_VOXEL) {
+               return volume_attribute_float(kg, sd, desc, dx, dy);
        }
 #endif
        else {
@@ -54,25 +53,23 @@ ccl_device_inline float 
primitive_attribute_float(KernelGlobals *kg,
 
 ccl_device_inline float3 primitive_attribute_float3(KernelGlobals *kg,
                                                     const ShaderData *sd,
-                                                    AttributeElement elem,
-                                                    int offset,
-                                                    float3 *dx,
-                                                    float3 *dy)
+                                                    const AttributeDescriptor 
desc,
+                                                    float3 *dx, float3 *dy)
 {
        if(ccl_fetch(sd, type) & PRIMITIVE_ALL_TRIANGLE) {
                if(subd_triangle_patch(kg, sd) == ~0)
-                       return triangle_attribute_float3(kg, sd, elem, offset, 
dx, dy);
+                       return triangle_attribute_float3(kg, sd, desc, dx, dy);
                else
-                       return subd_triangle_attribute_float3(kg, sd, elem, 
offset, dx, dy);
+                       return subd_triangle_attribute_float3(kg, sd, desc, dx, 
dy);
        }
 #ifdef __HAIR__
        else if(ccl_fetch(sd, type) & PRIMITIVE_ALL_CURVE) {
-               return curve_attribute_float3(kg, sd, elem, offset, dx, dy);
+               return curve_attribute_float3(kg, sd, desc, dx, dy);
        }
 #endif
 #ifdef __VOLUME__
-       else if(ccl_fetch(sd, object) != OBJECT_NONE && elem == 
ATTR_ELEMENT_VOXEL) {
-               return volume_attribute_float3(kg, sd, elem, offset, dx, dy);
+       else if(ccl_fetch(sd, object) != OBJECT_NONE && desc.element == 
ATTR_ELEMENT_VOXEL) {
+               return volume_attribute_float3(kg, sd, desc, dx, dy);
        }
 #endif
        else {
@@ -86,13 +83,12 @@ ccl_device_inline float3 
primitive_attribute_float3(KernelGlobals *kg,
 
 ccl_device_inline float3 primitive_uv(KernelGlobals *kg, ShaderData *sd)
 {
-       AttributeElement elem_uv;
-       int offset_uv = find_attribute(kg, sd, ATTR_STD_UV, &elem_uv);
+       const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_UV);
 
-       if(offset_uv == ATTR_STD_NOT_FOUND)
+       if(desc.offset == ATTR_STD_NOT_FOUND)
                return make_float3(0.0f, 0.0f, 0.0f);
 
-       float3 uv = primitive_attribute_float3(kg, sd, elem_uv, offset_uv, 
NULL, NULL);
+       float3 uv = primitive_attribute_float3(kg, sd, desc, NULL, NULL);
        uv.z = 1.0f;
        return uv;
 }
@@ -102,15 +98,14 @@ ccl_device_inline float3 primitive_uv(KernelGlobals 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to