Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r2147 - trunk/Model/Materials


Chronological Thread 
  • From: "Thiago Ize" <thiago@sci.utah.edu>
  • To: manta@sci.utah.edu
  • Subject: [Manta] r2147 - trunk/Model/Materials
  • Date: Mon, 24 Mar 2008 16:45:52 -0600 (MDT)

Author: thiago
Date: Mon Mar 24 16:45:52 2008
New Revision: 2147

Modified:
   trunk/Model/Materials/Lambertian.cc
Log:
Added an sse sampleBSDF version. This results in about a 1.05x speedup
in the cornell box.

Modified: trunk/Model/Materials/Lambertian.cc
==============================================================================
--- trunk/Model/Materials/Lambertian.cc (original)
+++ trunk/Model/Materials/Lambertian.cc Mon Mar 24 16:45:52 2008
@@ -37,6 +37,7 @@
 #include <Interface/ShadowAlgorithm.h>
 #include <Core/Math/Expon.h>
 #include <Core/Math/Trig.h>
+#include <Core/Math/TrigSSE.h>
 #include <Core/Persistent/MantaRTTI.h>
 #include <Core/Persistent/ArchiveElement.h>
 #include <Interface/InterfaceRTTI.h>
@@ -243,11 +244,85 @@
                           RayPacket& rays, Packet<Color>& reflectance) const
 {
   rays.computeHitPositions();
+
   Packet<Real> r1;
   context.sample_generator->nextSeeds(context, r1, rays);
   Packet<Real> r2;
   context.sample_generator->nextSeeds(context, r2, rays);
   rays.computeFFNormals(context);
+
+#ifdef MANTA_SSE
+  int b = (rays.rayBegin + 3) & (~3);
+  int e = rays.rayEnd & (~3);
+  if(b >= e){
+    for(int i=rays.begin();i<rays.end();i++){
+      Real sintheta2 = r1.get(i);
+      Real sintheta=Sqrt(sintheta2);
+      Real costheta=Sqrt(1-sintheta2);
+      Real phi=2*M_PI*r2.get(i);
+      Real cosphi=Cos(phi)*sintheta;
+      Real sinphi=Sin(phi)*sintheta;
+      Vector normal = rays.getFFNormal(i);
+      Vector v1 = normal.findPerpendicular();
+      v1.normalize();
+      Vector v2 = Cross(v1, normal);
+      rays.setDirection(i, normal * costheta + v1 * cosphi + v2 * sinphi);
+      rays.setOrigin(i, rays.getHitPosition(i));
+    }
+  } else {
+    int i = rays.rayBegin;
+    for(;i<b;i++){
+      Real sintheta2 = r1.get(i);
+      Real sintheta=Sqrt(sintheta2);
+      Real costheta=Sqrt(1-sintheta2);
+      Real phi=2*M_PI*r2.get(i);
+      Real cosphi=Cos(phi)*sintheta;
+      Real sinphi=Sin(phi)*sintheta;
+      Vector normal = rays.getFFNormal(i);
+      Vector v1 = normal.findPerpendicular();
+      v1.normalize();
+      Vector v2 = Cross(v1, normal);
+      rays.setDirection(i, normal * costheta + v1 * cosphi + v2 * sinphi);
+      rays.setOrigin(i, rays.getHitPosition(i));
+    }
+
+    for(;i<e;i+=4){
+      sse_t sintheta2 = load44(&r1.data[i]);
+      sse_t sintheta=sqrt4(sintheta2);
+      sse_union costheta;
+      costheta.sse = sqrt4(sub4(_mm_one,sintheta2));
+      sse_t phi= mul4(set4(2*M_PI), load44(&r2.data[i]));
+      sse_union cosphi, sinphi;
+      sincos4(phi, &sinphi.sse, &cosphi.sse);
+      cosphi.sse = mul4(cosphi.sse, sintheta);
+      sinphi.sse = mul4(sinphi.sse, sintheta);
+
+      for (int k=0; k < 4; ++k) {
+        //TODO: Turn this into SSE code.
+        Vector normal = rays.getFFNormal(i+k);
+        Vector v1 = normal.findPerpendicular();
+        v1.normalize();
+        Vector v2 = Cross(v1, normal);
+        rays.setDirection(i+k, normal * costheta.f[k] + v1 * cosphi.f[k] + 
v2 * sinphi.f[k]);
+        rays.setOrigin(i+k, rays.getHitPosition(i+k));
+      }
+    }
+    for(;i<rays.rayEnd;i++){
+      Real sintheta2 = r1.get(i);
+      Real sintheta=Sqrt(sintheta2);
+      Real costheta=Sqrt(1-sintheta2);
+      Real phi=2*M_PI*r2.get(i);
+      Real cosphi=Cos(phi)*sintheta;
+      Real sinphi=Sin(phi)*sintheta;
+      Vector normal = rays.getFFNormal(i);
+      Vector v1 = normal.findPerpendicular();
+      v1.normalize();
+      Vector v2 = Cross(v1, normal);
+      rays.setDirection(i, normal * costheta + v1 * cosphi + v2 * sinphi);
+      rays.setOrigin(i, rays.getHitPosition(i));
+    }
+  }
+#else
   for(int i=rays.begin();i<rays.end();i++){
     Real sintheta2 = r1.get(i);
     Real sintheta=Sqrt(sintheta2);
@@ -262,7 +337,7 @@
     rays.setDirection(i, normal * costheta + v1 * cosphi + v2 * sinphi);
     rays.setOrigin(i, rays.getHitPosition(i));
   }
-
+#endif
   colortex->mapValues(reflectance, context, rays);
 }
 




  • [Manta] r2147 - trunk/Model/Materials, Thiago Ize, 03/24/2008

Archive powered by MHonArc 2.6.16.

Top of page