diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-03-08 08:48:14 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-03-10 06:54:05 +0300 |
commit | b66efbecf4780c65833f72ac8de5d18b5bca7e15 (patch) | |
tree | 58f258df9e797f55ad1a77082115989df147e6db /intern/cycles/kernel | |
parent | 623141f339d5066ed6b96ad70ab45fb294e3e612 (diff) |
Code refactor: make Transform always affine, dropping last row.
This save a little memory and copying in the kernel by storing only a 4x3
matrix instead of a 4x4 matrix. We already did this in a few places, and
those don't need to be special exceptions anymore now.
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/bvh/bvh_nodes.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/geom/geom_attribute.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/geom/geom_curve_intersect.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/geom/geom_object.h | 27 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_textures.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 8 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_services.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_mapping.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_tex_coord.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_voxel.h | 1 |
10 files changed, 13 insertions, 40 deletions
diff --git a/intern/cycles/kernel/bvh/bvh_nodes.h b/intern/cycles/kernel/bvh/bvh_nodes.h index 6c33dad5426..060b3934a41 100644 --- a/intern/cycles/kernel/bvh/bvh_nodes.h +++ b/intern/cycles/kernel/bvh/bvh_nodes.h @@ -25,7 +25,6 @@ ccl_device_forceinline Transform bvh_unaligned_node_fetch_space(KernelGlobals *k space.x = kernel_tex_fetch(__bvh_nodes, child_addr+1); space.y = kernel_tex_fetch(__bvh_nodes, child_addr+2); space.z = kernel_tex_fetch(__bvh_nodes, child_addr+3); - space.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f); return space; } diff --git a/intern/cycles/kernel/geom/geom_attribute.h b/intern/cycles/kernel/geom/geom_attribute.h index 6e2ee3b62d7..42c053704d5 100644 --- a/intern/cycles/kernel/geom/geom_attribute.h +++ b/intern/cycles/kernel/geom/geom_attribute.h @@ -103,7 +103,6 @@ ccl_device Transform primitive_attribute_matrix(KernelGlobals *kg, const ShaderD 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_intersect.h b/intern/cycles/kernel/geom/geom_curve_intersect.h index faf3e3cdf2b..46c3f408f0b 100644 --- a/intern/cycles/kernel/geom/geom_curve_intersect.h +++ b/intern/cycles/kernel/geom/geom_curve_intersect.h @@ -170,8 +170,7 @@ ccl_device_forceinline bool cardinal_curve_intersect( htfm = make_transform( dir.z / d, 0, -dir.x /d, 0, -dir.x * dir.y /d, d, -dir.y * dir.z /d, 0, - dir.x, dir.y, dir.z, 0, - 0, 0, 0, 1); + dir.x, dir.y, dir.z, 0); float4 v00 = kernel_tex_fetch(__curves, prim); diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h index cd330308e07..62bc46dc21b 100644 --- a/intern/cycles/kernel/geom/geom_object.h +++ b/intern/cycles/kernel/geom/geom_object.h @@ -28,12 +28,12 @@ CCL_NAMESPACE_BEGIN enum ObjectTransform { OBJECT_TRANSFORM = 0, - OBJECT_INVERSE_TRANSFORM = 4, + OBJECT_INVERSE_TRANSFORM = 1, }; enum ObjectVectorTransform { OBJECT_VECTOR_MOTION_PRE = 0, - OBJECT_VECTOR_MOTION_POST = 3 + OBJECT_VECTOR_MOTION_POST = 1 }; /* Object to world space transformation */ @@ -51,8 +51,6 @@ ccl_device_inline Transform object_fetch_transform(KernelGlobals *kg, int object tfm.y = kernel_tex_fetch(__objects, object).tfm.pre.y; tfm.z = kernel_tex_fetch(__objects, object).tfm.pre.z; } - tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f); - return tfm; } @@ -60,20 +58,12 @@ ccl_device_inline Transform object_fetch_transform(KernelGlobals *kg, int object ccl_device_inline Transform lamp_fetch_transform(KernelGlobals *kg, int lamp, bool inverse) { - Transform tfm; if(inverse) { - tfm.x = kernel_tex_fetch(__lights, lamp).itfm[0]; - tfm.y = kernel_tex_fetch(__lights, lamp).itfm[1]; - tfm.z = kernel_tex_fetch(__lights, lamp).itfm[2]; + return kernel_tex_fetch(__lights, lamp).itfm; } else { - tfm.x = kernel_tex_fetch(__lights, lamp).tfm[0]; - tfm.y = kernel_tex_fetch(__lights, lamp).tfm[1]; - tfm.z = kernel_tex_fetch(__lights, lamp).tfm[2]; + return kernel_tex_fetch(__lights, lamp).tfm; } - tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f); - - return tfm; } /* Object to world space transformation for motion vectors */ @@ -81,14 +71,7 @@ ccl_device_inline Transform lamp_fetch_transform(KernelGlobals *kg, int lamp, bo ccl_device_inline Transform object_fetch_vector_transform(KernelGlobals *kg, int object, enum ObjectVectorTransform type) { int offset = object*OBJECT_VECTOR_SIZE + (int)type; - - Transform tfm; - tfm.x = kernel_tex_fetch(__objects_vector, offset + 0); - tfm.y = kernel_tex_fetch(__objects_vector, offset + 1); - tfm.z = kernel_tex_fetch(__objects_vector, offset + 2); - tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f); - - return tfm; + return kernel_tex_fetch(__objects_vector, offset); } /* Motion blurred object transformations */ diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h index 892e0c84cba..6e07d88008e 100644 --- a/intern/cycles/kernel/kernel_textures.h +++ b/intern/cycles/kernel/kernel_textures.h @@ -32,7 +32,7 @@ KERNEL_TEX(float2, __prim_time) /* objects */ KERNEL_TEX(KernelObject, __objects) -KERNEL_TEX(float4, __objects_vector) +KERNEL_TEX(Transform, __objects_vector) /* triangles */ KERNEL_TEX(uint, __tri_shader) diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 5934ff53f57..567f2a04028 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -35,10 +35,10 @@ CCL_NAMESPACE_BEGIN /* Constants */ -#define OBJECT_VECTOR_SIZE 6 +#define OBJECT_VECTOR_SIZE 2 #define FILTER_TABLE_SIZE 1024 #define RAMP_TABLE_SIZE 256 -#define SHUTTER_TABLE_SIZE 256 +#define SHUTTER_TABLE_SIZE 256 #define BSSRDF_MIN_RADIUS 1e-8f #define BSSRDF_MAX_HITS 4 @@ -1483,8 +1483,8 @@ typedef struct KernelLight { int samples; float max_bounces; float random; - float4 tfm[3]; - float4 itfm[3]; + Transform tfm; + Transform itfm; union { KernelSpotLight spot; KernelAreaLight area; diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index dec56c6665b..0c5e5e30e47 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -64,8 +64,7 @@ CCL_NAMESPACE_BEGIN static void copy_matrix(OSL::Matrix44& m, const Transform& tfm) { - // TODO: remember when making affine - Transform t = transform_transpose(tfm); + ProjectionTransform t = projection_transpose(ProjectionTransform(tfm)); memcpy(&m, &t, sizeof(m)); } @@ -553,8 +552,7 @@ static bool set_attribute_float3_3(float3 P[3], TypeDesc type, bool derivatives, static bool set_attribute_matrix(const Transform& tfm, TypeDesc type, void *val) { if(type == TypeDesc::TypeMatrix) { - Transform transpose = transform_transpose(tfm); - memcpy(val, &transpose, sizeof(Transform)); + copy_matrix(*(OSL::Matrix44*)val, tfm); return true; } diff --git a/intern/cycles/kernel/svm/svm_mapping.h b/intern/cycles/kernel/svm/svm_mapping.h index 0a890545af4..42a7ae9946f 100644 --- a/intern/cycles/kernel/svm/svm_mapping.h +++ b/intern/cycles/kernel/svm/svm_mapping.h @@ -26,7 +26,6 @@ ccl_device void svm_node_mapping(KernelGlobals *kg, ShaderData *sd, float *stack tfm.x = read_node_float(kg, offset); tfm.y = read_node_float(kg, offset); tfm.z = read_node_float(kg, offset); - tfm.w = read_node_float(kg, offset); float3 r = transform_point(&tfm, v); stack_store_float3(stack, out_offset, r); diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h index c94327401f5..6ff39e5f587 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -42,7 +42,6 @@ ccl_device void svm_node_tex_coord(KernelGlobals *kg, tfm.x = read_node_float(kg, offset); tfm.y = read_node_float(kg, offset); tfm.z = read_node_float(kg, offset); - tfm.w = read_node_float(kg, offset); data = transform_point(&tfm, data); } break; @@ -123,7 +122,6 @@ ccl_device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, tfm.x = read_node_float(kg, offset); tfm.y = read_node_float(kg, offset); tfm.z = read_node_float(kg, offset); - tfm.w = read_node_float(kg, offset); data = transform_point(&tfm, data); } break; @@ -207,7 +205,6 @@ ccl_device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, tfm.x = read_node_float(kg, offset); tfm.y = read_node_float(kg, offset); tfm.z = read_node_float(kg, offset); - tfm.w = read_node_float(kg, offset); data = transform_point(&tfm, data); } break; diff --git a/intern/cycles/kernel/svm/svm_voxel.h b/intern/cycles/kernel/svm/svm_voxel.h index d967516a5c9..43b433683e0 100644 --- a/intern/cycles/kernel/svm/svm_voxel.h +++ b/intern/cycles/kernel/svm/svm_voxel.h @@ -39,7 +39,6 @@ ccl_device void svm_node_tex_voxel(KernelGlobals *kg, tfm.x = read_node_float(kg, offset); tfm.y = read_node_float(kg, offset); tfm.z = read_node_float(kg, offset); - tfm.w = read_node_float(kg, offset); co = transform_point(&tfm, co); } |