Text archives Help
- 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.