Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1486 - trunk/Model/Lights


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1486 - trunk/Model/Lights
  • Date: Tue, 17 Jul 2007 15:16:32 -0600 (MDT)

Author: boulos
Date: Tue Jul 17 15:16:32 2007
New Revision: 1486

Modified:
   trunk/Model/Lights/AreaLight.cc
Log:
Model/Lights/AreaLight.cc
  SSE version of computeLight for AreaLights.


Modified: trunk/Model/Lights/AreaLight.cc
==============================================================================
--- trunk/Model/Lights/AreaLight.cc     (original)
+++ trunk/Model/Lights/AreaLight.cc     Tue Jul 17 15:16:32 2007
@@ -1,4 +1,3 @@
-
 #include <Model/Lights/AreaLight.h>
 #include <MantaSSE.h>
 #include <Interface/Primitive.h>
@@ -25,6 +24,88 @@
   primitive->getRandomPoints(positions, normals, pdfs, context);
   // TODO(boulos): SSE version
 
+#ifdef MANTA_SSE
+  int b = (sourceRays.rayBegin + 3) & (~3);
+  int e = sourceRays.rayEnd & (~3);
+  if(b == e){
+    for(int i = sourceRays.begin(); i < sourceRays.end(); i++){
+      // Generate a point on the light
+      Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
+      Real len = dir.normalize();
+      Real cosine = SCIRun::Max(-Dot(dir, normals.get(i)), Real(0));
+      Real solid_pdf = pdfs.get(i) * (len * len / cosine);
+      destRays.setDirection(i, dir);
+      destRays.setColor(i, color / solid_pdf);
+      destRays.overrideMinT(i, len);
+    }
+  } else {
+    int i = sourceRays.rayBegin;
+    for(;i<b;i++){
+      // Generate a point on the light
+      Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
+      Real len = dir.normalize();
+      Real cosine = SCIRun::Max(-Dot(dir, normals.get(i)), Real(0));
+      Real solid_pdf = pdfs.get(i) * (len * len / cosine);
+      destRays.setDirection(i, dir);
+      destRays.setColor(i, color / solid_pdf);
+      destRays.overrideMinT(i, len);
+    }
+    RayPacketData* sourceData = sourceRays.data;
+    RayPacketData* destData = destRays.data;
+    for(;i<e;i+=4){
+
+      __m128 dir_x = _mm_sub_ps(_mm_load_ps(&positions.vectordata[0][i]),
+                                _mm_load_ps(&sourceData->hitPosition[0][i]));
+      __m128 dir_y = _mm_sub_ps(_mm_load_ps(&positions.vectordata[1][i]),
+                                _mm_load_ps(&sourceData->hitPosition[1][i]));
+      __m128 dir_z = _mm_sub_ps(_mm_load_ps(&positions.vectordata[2][i]),
+                                _mm_load_ps(&sourceData->hitPosition[2][i]));
+
+      __m128 len2 = dot4(dir_x, dir_y, dir_z,
+                         dir_x, dir_y, dir_z);
+      __m128 len = _mm_sqrt_ps(len2);
+
+      dir_x = _mm_div_ps(dir_x, len);
+      dir_y = _mm_div_ps(dir_y, len);
+      dir_z = _mm_div_ps(dir_z, len);
+
+      __m128 cosine = dot4(dir_x, dir_y, dir_z,
+                           _mm_load_ps(&normals.vectordata[0][i]),
+                           _mm_load_ps(&normals.vectordata[1][i]),
+                           _mm_load_ps(&normals.vectordata[2][i]));
+      cosine = xor4(cosine, _mm_signbit);
+      cosine = _mm_max_ps(cosine, _mm_setzero_ps());
+      __m128 solid_pdf = _mm_div_ps(_mm_mul_ps(_mm_load_ps(&pdfs.data[i]),
+                                               len2),
+                                    cosine);
+      _mm_store_ps(&destData->direction[0][i],
+                   dir_x);
+      _mm_store_ps(&destData->direction[1][i],
+                   dir_y);
+      _mm_store_ps(&destData->direction[2][i],
+                   dir_z);
+
+      _mm_store_ps(&destData->color[0][i],
+                   _mm_div_ps(_mm_set1_ps(color[0]), solid_pdf));
+      _mm_store_ps(&destData->color[1][i],
+                   _mm_div_ps(_mm_set1_ps(color[1]), solid_pdf));
+      _mm_store_ps(&destData->color[2][i],
+                   _mm_div_ps(_mm_set1_ps(color[2]), solid_pdf));
+
+      _mm_store_ps(&destData->minT[i], len);
+    }
+    for(;i<sourceRays.rayEnd;i++){
+      // Generate a point on the light
+      Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
+      Real len = dir.normalize();
+      Real cosine = SCIRun::Max(-Dot(dir, normals.get(i)), Real(0));
+      Real solid_pdf = pdfs.get(i) * (len * len / cosine);
+      destRays.setDirection(i, dir);
+      destRays.setColor(i, color / solid_pdf);
+      destRays.overrideMinT(i, len);
+    }
+  }
+#else
   for(int i = sourceRays.begin(); i < sourceRays.end(); i++) {
     // Generate a point on the light
     Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
@@ -35,4 +116,5 @@
     destRays.setColor(i, color / solid_pdf);
     destRays.overrideMinT(i, len);
   }
+#endif
 }




  • [MANTA] r1486 - trunk/Model/Lights, boulos, 07/17/2007

Archive powered by MHonArc 2.6.16.

Top of page