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. @@

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

Reply via email to