[Bf-blender-cvs] [3269c9e] temp-cycles-microdisplacement: Merge branch 'master' into temp-cycles-microdisplacement

Mai Lavelle noreply at git.blender.org
Mon Jul 11 03:12:50 CEST 2016


Commit: 3269c9e1376d27b5ecac2d9a0f1e6cc6fbb3bb28
Author: Mai Lavelle
Date:   Sun Jul 10 21:12:01 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB3269c9e1376d27b5ecac2d9a0f1e6cc6fbb3bb28

Merge branch 'master' into temp-cycles-microdisplacement

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



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

diff --cc intern/cycles/kernel/geom/geom.h
index 9ff246a,33e91d1..175cbae
--- a/intern/cycles/kernel/geom/geom.h
+++ b/intern/cycles/kernel/geom/geom.h
@@@ -21,24 -21,10 +21,11 @@@
  /* 64 object BVH + 64 mesh BVH + 64 object node splitting */
  #define BVH_STACK_SIZE 192
  #define BVH_QSTACK_SIZE 384
- #define BVH_NODE_SIZE 4
- #define BVH_NODE_LEAF_SIZE 1
- #define BVH_QNODE_SIZE 7
- #define BVH_QNODE_LEAF_SIZE 1
  #define TRI_NODE_SIZE 3
  
- /* silly workaround for float extended precision that happens when compiling
-  * without sse support on x86, it results in different results for float ops
-  * that you would otherwise expect to compare correctly */
- #if !defined(__i386__) || defined(__SSE__)
- #  define NO_EXTENDED_PRECISION
- #else
- #  define NO_EXTENDED_PRECISION volatile
- #endif
- 
  #include "geom_attribute.h"
  #include "geom_object.h"
 +#include "geom_patch.h"
  #include "geom_triangle.h"
  #include "geom_triangle_intersect.h"
  #include "geom_motion_triangle.h"
diff --cc intern/cycles/kernel/geom/geom_triangle.h
index 712ff40,0c2351e..e211534
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@@ -116,14 -111,14 +111,14 @@@ ccl_device float triangle_attribute_flo
  		if(dx) *dx = 0.0f;
  		if(dy) *dy = 0.0f;
  
 -		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_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
 +	else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
- 		float4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
+ 		uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
  
- 		float f0 = kernel_tex_fetch(__attributes_float, desc->offset + __float_as_int(tri_vindex.x));
- 		float f1 = kernel_tex_fetch(__attributes_float, desc->offset + __float_as_int(tri_vindex.y));
- 		float f2 = kernel_tex_fetch(__attributes_float, desc->offset + __float_as_int(tri_vindex.z));
 -		float f0 = kernel_tex_fetch(__attributes_float, offset + tri_vindex.x);
 -		float f1 = kernel_tex_fetch(__attributes_float, offset + tri_vindex.y);
 -		float f2 = kernel_tex_fetch(__attributes_float, offset + tri_vindex.z);
++		float f0 = kernel_tex_fetch(__attributes_float, desc->offset + tri_vindex.x);
++		float f1 = kernel_tex_fetch(__attributes_float, desc->offset + tri_vindex.y);
++		float f2 = kernel_tex_fetch(__attributes_float, desc->offset + tri_vindex.z);
  
  #ifdef __RAY_DIFFERENTIALS__
  		if(dx) *dx = ccl_fetch(sd, du).dx*f0 + ccl_fetch(sd, dv).dx*f1 - (ccl_fetch(sd, du).dx + ccl_fetch(sd, dv).dx)*f2;
@@@ -159,14 -154,14 +154,14 @@@ ccl_device float3 triangle_attribute_fl
  		if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f);
  		if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
  
 -		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_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
 +	else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
- 		float4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
+ 		uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
  
- 		float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + __float_as_int(tri_vindex.x)));
- 		float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + __float_as_int(tri_vindex.y)));
- 		float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + __float_as_int(tri_vindex.z)));
 -		float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + tri_vindex.x));
 -		float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + tri_vindex.y));
 -		float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + tri_vindex.z));
++		float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + tri_vindex.x));
++		float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + tri_vindex.y));
++		float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + tri_vindex.z));
  
  #ifdef __RAY_DIFFERENTIALS__
  		if(dx) *dx = ccl_fetch(sd, du).dx*f0 + ccl_fetch(sd, dv).dx*f1 - (ccl_fetch(sd, du).dx + ccl_fetch(sd, dv).dx)*f2;
@@@ -205,282 -200,4 +200,282 @@@
  	}
  }
  
 +/* Patch index for triangle, -1 if not subdivision triangle */
 +
 +ccl_device_inline uint subd_triangle_patch(KernelGlobals *kg, const ShaderData *sd)
 +{
 +	return kernel_tex_fetch(__tri_patch, ccl_fetch(sd, prim));
 +}
 +
 +/* UV coords of triangle within patch */
 +
 +ccl_device_inline void subd_triangle_patch_uv(KernelGlobals *kg, const ShaderData *sd, float2 uv[3])
 +{
- 	float4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
++	uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
 +
- 	uv[0] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.x));
- 	uv[1] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.y));
- 	uv[2] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.z));
++	uv[0] = kernel_tex_fetch(__tri_patch_uv, tri_vindex.x);
++	uv[1] = kernel_tex_fetch(__tri_patch_uv, tri_vindex.y);
++	uv[2] = kernel_tex_fetch(__tri_patch_uv, tri_vindex.z);
 +}
 +
 +/* Vertex indices of patch */
 +
 +ccl_device_inline uint4 subd_triangle_patch_indices(KernelGlobals *kg, int patch)
 +{
 +	uint4 indices;
 +
 +	indices.x = kernel_tex_fetch(__patches, patch+0);
 +	indices.y = kernel_tex_fetch(__patches, patch+1);
 +	indices.z = kernel_tex_fetch(__patches, patch+2);
 +	indices.w = kernel_tex_fetch(__patches, patch+3);
 +
 +	return indices;
 +}
 +
 +/* Originating face for patch */
 +
 +ccl_device_inline uint subd_triangle_patch_face(KernelGlobals *kg, int patch)
 +{
 +	return kernel_tex_fetch(__patches, patch+4);
 +}
 +
 +/* Number of corners on originating face */
 +
 +ccl_device_inline uint subd_triangle_patch_num_corners(KernelGlobals *kg, int patch)
 +{
 +	return kernel_tex_fetch(__patches, patch+5) & 0xffff;
 +}
 +
 +/* Indices of the four corners that are used by the patch */
 +
 +ccl_device_inline void subd_triangle_patch_corners(KernelGlobals *kg, int patch, int corners[4])
 +{
 +	uint4 data;
 +
 +	data.x = kernel_tex_fetch(__patches, patch+4);
 +	data.y = kernel_tex_fetch(__patches, patch+5);
 +	data.z = kernel_tex_fetch(__patches, patch+6);
 +	data.w = kernel_tex_fetch(__patches, patch+7);
 +
 +	int num_corners = data.y & 0xffff;
 +
 +	if(num_corners == 4) {
 +		/* quad */
 +		corners[0] = data.z;
 +		corners[1] = data.z+1;
 +		corners[2] = data.z+2;
 +		corners[3] = data.z+3;
 +	}
 +	else {
 +		/* ngon */
 +		int c = data.y >> 16;
 +
 +		corners[0] = data.z + c;
 +		corners[1] = data.z + mod(c+1, num_corners);
 +		corners[2] = data.w;
 +		corners[3] = data.z + mod(c-1, num_corners);
 +	}
 +}
 +
 +/* Reading attributes on various subdivision triangle elements */
 +
 +ccl_device float subd_triangle_attribute_float(KernelGlobals *kg, const ShaderData *sd, const AttributeDescriptor *desc, float *dx, float *dy)
 +{
 +	int patch = subd_triangle_patch(kg, sd);
 +
 +	if(desc->element == ATTR_ELEMENT_FACE) {
 +		if(dx) *dx = 0.0f;
 +		if(dy) *dy = 0.0f;
 +
 +		return kernel_tex_fetch(__attributes_float, desc->offset + subd_triangle_patch_face(kg, patch));
 +	}
 +	else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
 +		float2 uv[3];
 +		subd_triangle_patch_uv(kg, sd, uv);
 +
 +		float a, b, c;
 +
 +		if(desc->flags & ATTR_SUBDIVIDED) {
 +			a = patch_eval_float(kg, sd, desc->offset, patch, uv[0].x, uv[0].y, 0, NULL, NULL);
 +			b = patch_eval_float(kg, sd, desc->offset, patch, uv[1].x, uv[1].y, 0, NULL, NULL);
 +			c = patch_eval_float(kg, sd, desc->offset, patch, uv[2].x, uv[2].y, 0, NULL, NULL);
 +		}
 +		else {
 +			uint4 v = subd_triangle_patch_indices(kg, patch);
 +
 +			float f0 = kernel_tex_fetch(__attributes_float, desc->offset + v.x);
 +			float f1 = kernel_tex_fetch(__attributes_float, desc->offset + v.y);
 +			float f2 = kernel_tex_fetch(__attributes_float, desc->offset + v.z);
 +			float f3 = kernel_tex_fetch(__attributes_float, desc->offset + v.w);
 +
 +			if(subd_triangle_patch_num_corners(kg, patch) != 4) {
 +				f1 = (f1+f0)*0.5f;
 +				f3 = (f3+f0)*0.5f;
 +			}
 +
 +			a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y);
 +			b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y);
 +			c = mix(mix(f0, f1, uv[2].x), mix(f3, f2, uv[2].x), uv[2].y);
 +		}
 +
 +#ifdef __RAY_DIFFERENTIALS__
 +		if(dx) *dx = ccl_fetch(sd, du).dx*a + ccl_fetch(sd, dv).dx*b - (ccl_fetch(sd, du).dx + ccl_fetch(sd, dv).dx)*c;
 +		if(dy) *dy = ccl_fetch(sd, du).dy*a + ccl_fetch(sd, dv).dy*b - (ccl_fetch(sd, du).dy + ccl_fetch(sd, dv).dy)*c;
 +#endif
 +
 +		return ccl_fetch(sd, u)*a + ccl_fetch(sd, v)*b + (1.0f - ccl_fetch(sd, u) - ccl_fetch(sd, v))*c;
 +	}
 +	else if(desc->element == ATTR_ELEMENT_CORNER) {
 +		float2 uv[3];
 +		subd_triangle_patch_uv(kg, sd, uv);
 +
 +		float a, b, c;
 +
 +		if(desc->flags & ATTR_SUBDIVIDED) {
 +			a = patch_eval_float(kg, sd, desc->offset, patch, uv[0].x, uv[0].y, 0, NULL, NULL);
 +			b = patch_eval_float(kg, sd, desc->offset, patch, uv[1].x, uv[1].y, 0, NULL, NULL);
 +			c = patch_eval_float(kg, sd, desc->offset, patch, uv[2].x, uv[2].y, 0, NULL, NULL);
 +		}
 +		else {
 +			int corners[4];
 +			subd_triangle_patch_corners(kg, patch, corners);
 +
 +			float f0 = kernel_tex_fetch(__attributes_float, corners[0] + desc->offset);
 +			float f1 = kernel_tex_fetch(__attributes_float, corners[1] + desc->offset);
 +			float f2 = kernel_tex_fetch(__attributes_float, corners[2] + desc->offset);
 +			float f3 = kernel_tex_fetch(__attributes_float, corners[3] + desc->offset);
 +
 +			if(subd_triangle_patch_num_corners(kg, patch) != 4) {
 +				f1 = (f1+f0)*0.5f;
 +				f3 = (f3+f0)*0.5f;
 +			}
 +
 +			a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y);
 +			b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list