Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-08 08:48:14 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-10 06:54:05 +0300
commitb66efbecf4780c65833f72ac8de5d18b5bca7e15 (patch)
tree58f258df9e797f55ad1a77082115989df147e6db /intern/cycles/kernel
parent623141f339d5066ed6b96ad70ab45fb294e3e612 (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.h1
-rw-r--r--intern/cycles/kernel/geom/geom_attribute.h1
-rw-r--r--intern/cycles/kernel/geom/geom_curve_intersect.h3
-rw-r--r--intern/cycles/kernel/geom/geom_object.h27
-rw-r--r--intern/cycles/kernel/kernel_textures.h2
-rw-r--r--intern/cycles/kernel/kernel_types.h8
-rw-r--r--intern/cycles/kernel/osl/osl_services.cpp6
-rw-r--r--intern/cycles/kernel/svm/svm_mapping.h1
-rw-r--r--intern/cycles/kernel/svm/svm_tex_coord.h3
-rw-r--r--intern/cycles/kernel/svm/svm_voxel.h1
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);
}