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